blob: 4200c951414784bf594e2e0c31fbc5a1950e2ee6 [file] [log] [blame]
Soumya Managoli9d627242018-02-24 16:13:25 +05301/* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
2 *
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/clk.h>
14#include <linux/gpio.h>
15#include <linux/of_gpio.h>
16#include <linux/platform_device.h>
17#include <linux/io.h>
18#include <linux/module.h>
19#include <linux/workqueue.h>
20#include <sound/core.h>
21#include <sound/soc.h>
22#include <sound/soc-dapm.h>
23#include <sound/pcm.h>
24#include <sound/jack.h>
25#include <dsp/q6afe-v2.h>
26#include <dsp/q6core.h>
27#include <sound/pcm_params.h>
28#include <sound/info.h>
29#include <soc/qcom/socinfo.h>
30#include <linux/input.h>
31#include "msm-pcm-routing-v2.h"
32#include "codecs/msm-cdc-pinctrl.h"
33#include "codecs/wcd9335.h"
34#include "codecs/wcd-mbhc-v2.h"
35#include "codecs/wsa881x.h"
36#include "msm8952-slimbus.h"
37
38#define DRV_NAME "msm8952-slimbus-wcd"
39
40#define BTSCO_RATE_8KHZ 8000
41#define BTSCO_RATE_16KHZ 16000
42#define SAMPLING_RATE_8KHZ 8000
43#define SAMPLING_RATE_16KHZ 16000
44#define SAMPLING_RATE_32KHZ 32000
45#define SAMPLING_RATE_48KHZ 48000
46#define SAMPLING_RATE_96KHZ 96000
47#define SAMPLING_RATE_192KHZ 192000
48#define SAMPLING_RATE_44P1KHZ 44100
49
50#define MSM8952_SPK_ON 1
51#define MSM8952_SPK_OFF 0
52
53#define WCD9XXX_MBHC_DEF_BUTTONS 8
54#define WCD9XXX_MBHC_DEF_RLOADS 5
55#define CODEC_EXT_CLK_RATE 9600000
56
57#define PRI_MI2S_ID (1 << 0)
58#define SEC_MI2S_ID (1 << 1)
59#define TER_MI2S_ID (1 << 2)
60#define QUAT_MI2S_ID (1 << 3)
61#define QUIN_MI2S_ID (1 << 4)
62
63#define HS_STARTWORK_TIMEOUT 4000
64
65#define Q6AFE_LPASS_OSR_CLK_9_P600_MHZ 0x927C00
66#define MAX_AUX_CODECS 4
67
68#define WSA8810_NAME_1 "wsa881x.20170211"
69#define WSA8810_NAME_2 "wsa881x.20170212"
70
71#define TDM_SLOT_OFFSET_MAX 8
72
73enum btsco_rates {
74 RATE_8KHZ_ID,
75 RATE_16KHZ_ID,
76};
77
78enum {
79 PRIMARY_TDM_RX_0,
80 PRIMARY_TDM_TX_0,
81 SECONDARY_TDM_RX_0,
82 SECONDARY_TDM_TX_0,
83 TDM_MAX,
84};
85
86static int slim0_rx_sample_rate = SAMPLING_RATE_48KHZ;
87static int slim0_tx_sample_rate = SAMPLING_RATE_48KHZ;
88static int slim1_tx_sample_rate = SAMPLING_RATE_48KHZ;
89static int slim2_tx_sample_rate = SAMPLING_RATE_48KHZ;
90static int slim0_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
91static int slim0_tx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
92static int slim1_tx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
93static int slim2_tx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
94static int msm_slim_0_rx_ch = 1;
95static int msm_slim_0_tx_ch = 1;
96static int msm_slim_1_tx_ch = 1;
97static int msm_slim_2_tx_ch = 1;
98static int msm_vi_feed_tx_ch = 2;
99static int msm_slim_5_rx_ch = 1;
100static int msm_slim_6_rx_ch = 1;
101static int slim5_rx_sample_rate = SAMPLING_RATE_48KHZ;
102static int slim5_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
103static int slim6_rx_sample_rate = SAMPLING_RATE_48KHZ;
104static int slim6_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
105static int msm8952_auxpcm_rate = SAMPLING_RATE_8KHZ;
106static int slim4_rx_sample_rate = SAMPLING_RATE_48KHZ;
107static int slim4_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
108static int msm_slim_4_rx_ch = 1;
109static int msm_btsco_rate = SAMPLING_RATE_8KHZ;
110static int msm_btsco_ch = 1;
111static int msm8952_spk_control = 1;
112
113static bool codec_reg_done;
114
115static int mi2s_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
116
117static int msm_proxy_rx_ch = 2;
118static void *adsp_state_notifier;
119
120/* TDM default channels */
121static int msm_pri_tdm_rx_0_ch = 8;
122static int msm_pri_tdm_tx_0_ch = 8;
123
124static int msm_sec_tdm_rx_0_ch = 8;
125static int msm_sec_tdm_tx_0_ch = 8;
126
127/* TDM default bit format */
128static int msm_pri_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
129static int msm_pri_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
130
131static int msm_sec_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
132static int msm_sec_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
133
134/* TDM default sampling rate */
135static int msm_pri_tdm_rx_0_sample_rate = SAMPLING_RATE_48KHZ;
136static int msm_pri_tdm_tx_0_sample_rate = SAMPLING_RATE_48KHZ;
137
138static int msm_sec_tdm_rx_0_sample_rate = SAMPLING_RATE_48KHZ;
139static int msm_sec_tdm_tx_0_sample_rate = SAMPLING_RATE_48KHZ;
140
141static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
142 "Five", "Six", "Seven", "Eight"};
143static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE",
144 "S32_LE"};
145static char const *tdm_sample_rate_text[] = {"KHZ_16", "KHZ_48"};
146
147/* TDM default offset */
148static unsigned int tdm_slot_offset[TDM_MAX][TDM_SLOT_OFFSET_MAX] = {
149 /* PRI_TDM_RX */
150 {0, 4, 8, 12, 16, 20, 24, 28},
151 /* PRI_TDM_TX */
152 {0, 4, 8, 12, 16, 20, 24, 28},
153 /* SEC_TDM_RX */
154 {0, 4, 8, 12, 16, 20, 24, 28},
155 /* SEC_TDM_TX */
156 {0, 4, 8, 12, 16, 20, 24, 28},
157};
158
159static int msm8952_enable_codec_mclk(struct snd_soc_codec *codec, int enable,
160 bool dapm);
161
162static struct wcd_mbhc_config wcd_mbhc_cfg = {
163 .read_fw_bin = false,
164 .calibration = NULL,
165 .detect_extn_cable = true,
166 .mono_stero_detection = false,
167 .swap_gnd_mic = NULL,
168 .hs_ext_micbias = true,
169 .key_code[0] = KEY_MEDIA,
170 .key_code[1] = KEY_VOICECOMMAND,
171 .key_code[2] = KEY_VOLUMEUP,
172 .key_code[3] = KEY_VOLUMEDOWN,
173 .key_code[4] = 0,
174 .key_code[5] = 0,
175 .key_code[6] = 0,
176 .key_code[7] = 0,
177 .linein_th = 5000,
178};
179
180static void *def_tasha_mbhc_cal(void)
181{
182 void *tasha_wcd_cal;
183 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
184 u16 *btn_high;
185
186 tasha_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
187 WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
188 if (!tasha_wcd_cal)
189 return NULL;
190
191#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tasha_wcd_cal)->X) = (Y))
192 S(v_hs_max, 1500);
193#undef S
194#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tasha_wcd_cal)->X) = (Y))
195 S(num_btn, WCD_MBHC_DEF_BUTTONS);
196#undef S
197
198 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tasha_wcd_cal);
199 btn_high = ((void *)&btn_cfg->_v_btn_low) +
200 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
201
202 btn_high[0] = 75;
203 btn_high[1] = 150;
204 btn_high[2] = 237;
205 btn_high[3] = 450;
206 btn_high[4] = 450;
207 btn_high[5] = 450;
208 btn_high[6] = 450;
209 btn_high[7] = 450;
210
211 return tasha_wcd_cal;
212}
213
214static struct afe_clk_set mi2s_tx_clk = {
215 AFE_API_VERSION_I2S_CONFIG,
216 Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT,
217 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
218 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
219 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
220 0,
221};
222
223static struct afe_clk_set mi2s_rx_clk = {
224 AFE_API_VERSION_I2S_CONFIG,
225 Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT,
226 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
227 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
228 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
229 0,
230};
231
232struct msm895x_auxcodec_prefix_map {
233 char codec_name[50];
234 char codec_prefix[25];
235};
236
237static inline int param_is_mask(int p)
238{
239 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
240 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
241}
242
243static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p, int n)
244{
245 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
246}
247
248int msm895x_wsa881x_init(struct snd_soc_component *component)
249{
250 u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {100, 101, 102, 106};
251 u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {103, 104, 105, 107};
252 unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
253 unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
254 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
255 struct msm8952_asoc_mach_data *pdata;
256 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
257
258 if (!codec) {
259 pr_err("%s codec is NULL\n", __func__);
260 return -EINVAL;
261 }
262
263 if (!strcmp(component->name_prefix, "SpkrLeft")) {
264 dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n",
265 __func__, codec->component.name);
266 wsa881x_set_channel_map(codec, &spkleft_ports[0],
267 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
268 &ch_rate[0]);
269 if (dapm->component) {
270 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
271 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR");
272 }
273 } else if (!strcmp(component->name_prefix, "SpkrRight")) {
274 dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n",
275 __func__, codec->component.name);
276 wsa881x_set_channel_map(codec, &spkright_ports[0],
277 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
278 &ch_rate[0]);
279 if (dapm->component) {
280 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
281 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR");
282 }
283 } else {
284 dev_err(codec->dev, "%s: wrong codec name %s\n", __func__,
285 codec->component.name);
286 return -EINVAL;
287 }
288
289
290 pdata = snd_soc_card_get_drvdata(component->card);
291 if (pdata && pdata->codec_root)
292 wsa881x_codec_info_create_codec_entry(pdata->codec_root,
293 codec);
294 return 0;
295}
296
297static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned int bit)
298{
299 if (bit >= SNDRV_MASK_MAX)
300 return;
301 if (param_is_mask(n)) {
302 struct snd_mask *m = param_to_mask(p, n);
303
304 m->bits[0] = 0;
305 m->bits[1] = 0;
306 m->bits[bit >> 5] |= (1 << (bit & 31));
307 }
308}
309
310static void msm8952_ext_control(struct snd_soc_codec *codec)
311{
312 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
313
314 pr_debug("%s: msm8952_spk_control = %d\n",
315 __func__, msm8952_spk_control);
316 if (msm8952_spk_control == MSM8952_SPK_ON) {
317 snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp");
318 snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp");
319 } else {
320 snd_soc_dapm_disable_pin(dapm, "Lineout_1 amp");
321 snd_soc_dapm_disable_pin(dapm, "Lineout_3 amp");
322 }
323 snd_soc_dapm_sync(dapm);
324}
325
326static int msm8952_get_spk(struct snd_kcontrol *kcontrol,
327 struct snd_ctl_elem_value *ucontrol)
328{
329 pr_debug("%s: msm8952_spk_control = %d\n",
330 __func__, msm8952_spk_control);
331 ucontrol->value.integer.value[0] = msm8952_spk_control;
332 return 0;
333}
334
335static int msm8952_set_spk(struct snd_kcontrol *kcontrol,
336 struct snd_ctl_elem_value *ucontrol)
337{
338 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
339
340 pr_debug("%s()\n", __func__);
341 if (msm8952_spk_control == ucontrol->value.integer.value[0])
342 return 0;
343
344 msm8952_spk_control = ucontrol->value.integer.value[0];
345 msm8952_ext_control(codec);
346 return 1;
347}
348
349
350static int msm8952_enable_codec_mclk(struct snd_soc_codec *codec, int enable,
351 bool dapm)
352{
353 struct snd_soc_card *card = codec->component.card;
354 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
355
356 pr_debug("%s: enable = %d\n", __func__, enable);
357
358 if (!strcmp(dev_name(pdata->codec->dev), "tasha_codec"))
359 tasha_cdc_mclk_enable(codec, enable, dapm);
360
361 return 0;
362}
363
364static int slim5_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
365 struct snd_ctl_elem_value *ucontrol)
366{
367 int sample_rate_val = 0;
368
369 switch (slim5_rx_sample_rate) {
370 case SAMPLING_RATE_44P1KHZ:
371 sample_rate_val = 3;
372 break;
373
374 case SAMPLING_RATE_192KHZ:
375 sample_rate_val = 2;
376 break;
377
378 case SAMPLING_RATE_96KHZ:
379 sample_rate_val = 1;
380 break;
381
382 case SAMPLING_RATE_48KHZ:
383 default:
384 sample_rate_val = 0;
385 break;
386 }
387
388 ucontrol->value.integer.value[0] = sample_rate_val;
389 pr_debug("%s: slim5_rx_sample_rate = %d\n", __func__,
390 slim5_rx_sample_rate);
391
392 return 0;
393}
394
395static int slim5_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
396 struct snd_ctl_elem_value *ucontrol)
397{
398 pr_debug("%s: ucontrol value = %ld\n", __func__,
399 ucontrol->value.integer.value[0]);
400
401 switch (ucontrol->value.integer.value[0]) {
402 case 3:
403 slim5_rx_sample_rate = SAMPLING_RATE_44P1KHZ;
404 break;
405 case 2:
406 slim5_rx_sample_rate = SAMPLING_RATE_192KHZ;
407 break;
408 case 1:
409 slim5_rx_sample_rate = SAMPLING_RATE_96KHZ;
410 break;
411 case 0:
412 default:
413 slim5_rx_sample_rate = SAMPLING_RATE_48KHZ;
414 }
415
416 pr_debug("%s: slim5_rx_sample_rate = %d\n", __func__,
417 slim5_rx_sample_rate);
418
419 return 0;
420}
421
422static int mi2s_rx_bit_format_get(struct snd_kcontrol *kcontrol,
423 struct snd_ctl_elem_value *ucontrol)
424{
425
426 switch (mi2s_rx_bit_format) {
427 case SNDRV_PCM_FORMAT_S24_3LE:
428 ucontrol->value.integer.value[0] = 2;
429 break;
430
431 case SNDRV_PCM_FORMAT_S24_LE:
432 ucontrol->value.integer.value[0] = 1;
433 break;
434
435 case SNDRV_PCM_FORMAT_S16_LE:
436 default:
437 ucontrol->value.integer.value[0] = 0;
438 break;
439 }
440
441 pr_debug("%s: mi2s_rx_bit_format = %d, ucontrol value = %ld\n",
442 __func__, mi2s_rx_bit_format,
443 ucontrol->value.integer.value[0]);
444
445 return 0;
446}
447
448static int mi2s_rx_bit_format_put(struct snd_kcontrol *kcontrol,
449 struct snd_ctl_elem_value *ucontrol)
450{
451 switch (ucontrol->value.integer.value[0]) {
452 case 2:
453 mi2s_rx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
454 break;
455 case 1:
456 mi2s_rx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
457 break;
458 case 0:
459 default:
460 mi2s_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
461 break;
462 }
463 return 0;
464}
465
466static int msm_slim_1_tx_ch_get(struct snd_kcontrol *kcontrol,
467 struct snd_ctl_elem_value *ucontrol)
468{
469 pr_debug("%s: msm_slim_1_tx_ch = %d\n", __func__,
470 msm_slim_1_tx_ch);
471 ucontrol->value.integer.value[0] = msm_slim_1_tx_ch - 1;
472 return 0;
473}
474
475static int msm_slim_1_tx_ch_put(struct snd_kcontrol *kcontrol,
476 struct snd_ctl_elem_value *ucontrol)
477{
478 msm_slim_1_tx_ch = ucontrol->value.integer.value[0] + 1;
479
480 pr_debug("%s: msm_slim_1_tx_ch = %d\n", __func__, msm_slim_1_tx_ch);
481 return 1;
482}
483
484static int slim0_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
485 struct snd_ctl_elem_value *ucontrol)
486{
487 int sample_rate_val = 0;
488
489 switch (slim0_rx_sample_rate) {
490 case SAMPLING_RATE_44P1KHZ:
491 sample_rate_val = 3;
492 break;
493
494 case SAMPLING_RATE_192KHZ:
495 sample_rate_val = 2;
496 break;
497
498 case SAMPLING_RATE_96KHZ:
499 sample_rate_val = 1;
500 break;
501
502 case SAMPLING_RATE_48KHZ:
503 default:
504 sample_rate_val = 0;
505 break;
506 }
507
508 ucontrol->value.integer.value[0] = sample_rate_val;
509 pr_debug("%s: slim0_rx_sample_rate = %d\n", __func__,
510 slim0_rx_sample_rate);
511
512 return 0;
513}
514
515static int slim0_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
516 struct snd_ctl_elem_value *ucontrol)
517{
518 pr_debug("%s: ucontrol value = %ld\n", __func__,
519 ucontrol->value.integer.value[0]);
520
521 switch (ucontrol->value.integer.value[0]) {
522 case 3:
523 slim0_rx_sample_rate = SAMPLING_RATE_44P1KHZ;
524 break;
525 case 2:
526 slim0_rx_sample_rate = SAMPLING_RATE_192KHZ;
527 break;
528 case 1:
529 slim0_rx_sample_rate = SAMPLING_RATE_96KHZ;
530 break;
531 case 0:
532 default:
533 slim0_rx_sample_rate = SAMPLING_RATE_48KHZ;
534 }
535
536 pr_debug("%s: slim0_rx_sample_rate = %d\n", __func__,
537 slim0_rx_sample_rate);
538
539 return 0;
540}
541
542static int slim4_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
543 struct snd_ctl_elem_value *ucontrol)
544{
545 int sample_rate_val = 0;
546
547 switch (slim4_rx_sample_rate) {
548 case SAMPLING_RATE_16KHZ:
549 sample_rate_val = 4;
550 break;
551 case SAMPLING_RATE_44P1KHZ:
552 sample_rate_val = 3;
553 break;
554
555 case SAMPLING_RATE_192KHZ:
556 sample_rate_val = 2;
557 break;
558
559 case SAMPLING_RATE_96KHZ:
560 sample_rate_val = 1;
561 break;
562
563 case SAMPLING_RATE_48KHZ:
564 default:
565 sample_rate_val = 0;
566 break;
567 }
568
569 ucontrol->value.integer.value[0] = sample_rate_val;
570 pr_debug("%s: slim4_rx_sample_rate = %d\n", __func__,
571 slim4_rx_sample_rate);
572
573 return 0;
574}
575
576static int slim4_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
577 struct snd_ctl_elem_value *ucontrol)
578{
579 pr_debug("%s: ucontrol value = %ld\n", __func__,
580 ucontrol->value.integer.value[0]);
581
582 switch (ucontrol->value.integer.value[0]) {
583 case 4:
584 slim4_rx_sample_rate = SAMPLING_RATE_16KHZ;
585 break;
586 case 3:
587 slim4_rx_sample_rate = SAMPLING_RATE_44P1KHZ;
588 break;
589 case 2:
590 slim4_rx_sample_rate = SAMPLING_RATE_192KHZ;
591 break;
592 case 1:
593 slim4_rx_sample_rate = SAMPLING_RATE_96KHZ;
594 break;
595 case 0:
596 default:
597 slim4_rx_sample_rate = SAMPLING_RATE_48KHZ;
598 }
599
600 pr_debug("%s: slim4_rx_sample_rate = %d\n", __func__,
601 slim4_rx_sample_rate);
602
603 return 0;
604}
605
606static int slim5_rx_bit_format_get(struct snd_kcontrol *kcontrol,
607 struct snd_ctl_elem_value *ucontrol)
608{
609
610 switch (slim5_rx_bit_format) {
611 case SNDRV_PCM_FORMAT_S24_3LE:
612 ucontrol->value.integer.value[0] = 2;
613 break;
614
615 case SNDRV_PCM_FORMAT_S24_LE:
616 ucontrol->value.integer.value[0] = 1;
617 break;
618
619 case SNDRV_PCM_FORMAT_S16_LE:
620 default:
621 ucontrol->value.integer.value[0] = 0;
622 break;
623 }
624
625 pr_debug("%s: slim5_rx_bit_format = %d, ucontrol value = %ld\n",
626 __func__, slim5_rx_bit_format,
627 ucontrol->value.integer.value[0]);
628
629 return 0;
630}
631
632static int slim5_rx_bit_format_put(struct snd_kcontrol *kcontrol,
633 struct snd_ctl_elem_value *ucontrol)
634{
635 switch (ucontrol->value.integer.value[0]) {
636 case 2:
637 slim5_rx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
638 break;
639 case 1:
640 slim5_rx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
641 break;
642 case 0:
643 default:
644 slim5_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
645 break;
646 }
647 return 0;
648}
649static int slim6_rx_bit_format_get(struct snd_kcontrol *kcontrol,
650 struct snd_ctl_elem_value *ucontrol)
651{
652
653 switch (slim6_rx_bit_format) {
654 case SNDRV_PCM_FORMAT_S24_3LE:
655 ucontrol->value.integer.value[0] = 2;
656 break;
657
658 case SNDRV_PCM_FORMAT_S24_LE:
659 ucontrol->value.integer.value[0] = 1;
660 break;
661
662 case SNDRV_PCM_FORMAT_S16_LE:
663 default:
664 ucontrol->value.integer.value[0] = 0;
665 break;
666 }
667
668 pr_debug("%s: slim6_rx_bit_format = %d, ucontrol value = %ld\n",
669 __func__, slim6_rx_bit_format,
670 ucontrol->value.integer.value[0]);
671
672 return 0;
673}
674
675static int slim6_rx_bit_format_put(struct snd_kcontrol *kcontrol,
676 struct snd_ctl_elem_value *ucontrol)
677{
678 switch (ucontrol->value.integer.value[0]) {
679 case 2:
680 slim6_rx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
681 break;
682 case 1:
683 slim6_rx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
684 break;
685 case 0:
686 default:
687 slim6_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
688 break;
689 }
690 return 1;
691}
692static int slim6_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
693 struct snd_ctl_elem_value *ucontrol)
694{
695 int sample_rate_val = 0;
696
697 switch (slim6_rx_sample_rate) {
698 case SAMPLING_RATE_44P1KHZ:
699 sample_rate_val = 3;
700 break;
701
702 case SAMPLING_RATE_192KHZ:
703 sample_rate_val = 2;
704 break;
705
706 case SAMPLING_RATE_96KHZ:
707 sample_rate_val = 1;
708 break;
709
710 case SAMPLING_RATE_48KHZ:
711 default:
712 sample_rate_val = 0;
713 break;
714 }
715
716 ucontrol->value.integer.value[0] = sample_rate_val;
717 pr_debug("%s: slim6_rx_sample_rate = %d\n", __func__,
718 slim6_rx_sample_rate);
719
720 return 0;
721}
722
723static int slim6_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
724 struct snd_ctl_elem_value *ucontrol)
725{
726 switch (ucontrol->value.integer.value[0]) {
727 case 3:
728 slim6_rx_sample_rate = SAMPLING_RATE_44P1KHZ;
729 break;
730 case 2:
731 slim6_rx_sample_rate = SAMPLING_RATE_192KHZ;
732 break;
733 case 1:
734 slim6_rx_sample_rate = SAMPLING_RATE_96KHZ;
735 break;
736 case 0:
737 default:
738 slim6_rx_sample_rate = SAMPLING_RATE_48KHZ;
739 break;
740 }
741
742 pr_debug("%s: ucontrol value = %ld, slim6_rx_sample_rate = %d\n",
743 __func__, ucontrol->value.integer.value[0],
744 slim6_rx_sample_rate);
745
746 return 1;
747}
748
749static int slim0_rx_bit_format_get(struct snd_kcontrol *kcontrol,
750 struct snd_ctl_elem_value *ucontrol)
751{
752
753 switch (slim0_rx_bit_format) {
754 case SNDRV_PCM_FORMAT_S24_3LE:
755 ucontrol->value.integer.value[0] = 2;
756 break;
757
758 case SNDRV_PCM_FORMAT_S24_LE:
759 ucontrol->value.integer.value[0] = 1;
760 break;
761
762 case SNDRV_PCM_FORMAT_S16_LE:
763 default:
764 ucontrol->value.integer.value[0] = 0;
765 break;
766 }
767
768 pr_debug("%s: slim0_rx_bit_format = %d, ucontrol value = %ld\n",
769 __func__, slim0_rx_bit_format,
770 ucontrol->value.integer.value[0]);
771
772 return 0;
773}
774
775static int slim0_rx_bit_format_put(struct snd_kcontrol *kcontrol,
776 struct snd_ctl_elem_value *ucontrol)
777{
778 switch (ucontrol->value.integer.value[0]) {
779 case 2:
780 slim0_rx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
781 break;
782 case 1:
783 slim0_rx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
784 break;
785 case 0:
786 default:
787 slim0_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
788 break;
789 }
790 return 0;
791}
792
793static int slim4_rx_bit_format_get(struct snd_kcontrol *kcontrol,
794 struct snd_ctl_elem_value *ucontrol)
795{
796
797 switch (slim4_rx_bit_format) {
798 case SNDRV_PCM_FORMAT_S24_3LE:
799 ucontrol->value.integer.value[0] = 2;
800 break;
801
802 case SNDRV_PCM_FORMAT_S24_LE:
803 ucontrol->value.integer.value[0] = 1;
804 break;
805
806 case SNDRV_PCM_FORMAT_S16_LE:
807 default:
808 ucontrol->value.integer.value[0] = 0;
809 break;
810 }
811
812 pr_debug("%s: slim4_rx_bit_format = %d, ucontrol value = %ld\n",
813 __func__, slim4_rx_bit_format,
814 ucontrol->value.integer.value[0]);
815
816 return 0;
817}
818
819static int slim4_rx_bit_format_put(struct snd_kcontrol *kcontrol,
820 struct snd_ctl_elem_value *ucontrol)
821{
822 switch (ucontrol->value.integer.value[0]) {
823 case 2:
824 slim4_rx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
825 break;
826 case 1:
827 slim4_rx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
828 break;
829 case 0:
830 default:
831 slim4_rx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
832 break;
833 }
834 return 0;
835}
836
837static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
838 struct snd_ctl_elem_value *ucontrol)
839{
840 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
841
842 if (!strcmp(dev_name(codec->dev), "tasha_codec"))
843 ucontrol->value.integer.value[0] =
844 (msm_vi_feed_tx_ch - 1);
845 else
846 ucontrol->value.integer.value[0] =
847 (msm_vi_feed_tx_ch/2 - 1);
848
849 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
850 ucontrol->value.integer.value[0]);
851 return 0;
852}
853
854static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
855 struct snd_ctl_elem_value *ucontrol)
856{
857 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
858
859 if (!strcmp(dev_name(codec->dev), "tasha_codec"))
860 msm_vi_feed_tx_ch =
861 ucontrol->value.integer.value[0] + 1;
862 else
863 msm_vi_feed_tx_ch =
864 roundup_pow_of_two(
865 ucontrol->value.integer.value[0] + 2);
866
867 pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch);
868 return 1;
869}
870
871static int msm_slim_0_rx_ch_get(struct snd_kcontrol *kcontrol,
872 struct snd_ctl_elem_value *ucontrol)
873{
874 pr_debug("%s: msm_slim_0_rx_ch = %d\n", __func__,
875 msm_slim_0_rx_ch);
876 ucontrol->value.integer.value[0] = msm_slim_0_rx_ch - 1;
877 return 0;
878}
879
880static int msm_slim_0_rx_ch_put(struct snd_kcontrol *kcontrol,
881 struct snd_ctl_elem_value *ucontrol)
882{
883 msm_slim_0_rx_ch = ucontrol->value.integer.value[0] + 1;
884
885 pr_debug("%s: msm_slim_0_rx_ch = %d\n", __func__,
886 msm_slim_0_rx_ch);
887 return 1;
888}
889
890static int msm_slim_4_rx_ch_get(struct snd_kcontrol *kcontrol,
891 struct snd_ctl_elem_value *ucontrol)
892{
893 pr_debug("%s: msm_slim_4_rx_ch = %d\n", __func__,
894 msm_slim_4_rx_ch);
895 ucontrol->value.integer.value[0] = msm_slim_4_rx_ch - 1;
896 return 0;
897}
898
899static int msm_slim_4_rx_ch_put(struct snd_kcontrol *kcontrol,
900 struct snd_ctl_elem_value *ucontrol)
901{
902 msm_slim_4_rx_ch = ucontrol->value.integer.value[0] + 1;
903
904 pr_debug("%s: msm_slim_4_rx_ch = %d\n", __func__,
905 msm_slim_4_rx_ch);
906 return 1;
907}
908
909static int slim0_tx_bit_format_get(struct snd_kcontrol *kcontrol,
910 struct snd_ctl_elem_value *ucontrol)
911{
912 switch (slim0_tx_bit_format) {
913 case SNDRV_PCM_FORMAT_S24_3LE:
914 ucontrol->value.integer.value[0] = 2;
915 break;
916 case SNDRV_PCM_FORMAT_S24_LE:
917 ucontrol->value.integer.value[0] = 1;
918 break;
919 case SNDRV_PCM_FORMAT_S16_LE:
920 default:
921 ucontrol->value.integer.value[0] = 0;
922 break;
923 }
924 pr_debug("%s: slim0_tx_bit_format = %d, ucontrol value = %ld\n",
925 __func__, slim0_tx_bit_format,
926 ucontrol->value.integer.value[0]);
927 return 0;
928}
929
930static int slim0_tx_bit_format_put(struct snd_kcontrol *kcontrol,
931 struct snd_ctl_elem_value *ucontrol)
932{
933 int rc = 0;
934
935 switch (ucontrol->value.integer.value[0]) {
936 case 2:
937 slim0_tx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
938 break;
939 case 1:
940 slim0_tx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
941 break;
942 case 0:
943 slim0_tx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
944 break;
945 default:
946 pr_err("%s: invalid value %ld\n", __func__,
947 ucontrol->value.integer.value[0]);
948 rc = -EINVAL;
949 break;
950 }
951 return rc;
952}
953
954static int slim2_tx_bit_format_get(struct snd_kcontrol *kcontrol,
955 struct snd_ctl_elem_value *ucontrol)
956{
957 switch (slim2_tx_bit_format) {
958 case SNDRV_PCM_FORMAT_S24_3LE:
959 ucontrol->value.integer.value[0] = 2;
960 break;
961 case SNDRV_PCM_FORMAT_S24_LE:
962 ucontrol->value.integer.value[0] = 1;
963 break;
964 case SNDRV_PCM_FORMAT_S16_LE:
965 default:
966 ucontrol->value.integer.value[0] = 0;
967 break;
968 }
969 pr_debug("%s: slim2_tx_bit_format = %d, ucontrol value = %ld\n",
970 __func__, slim2_tx_bit_format,
971 ucontrol->value.integer.value[0]);
972 return 0;
973}
974
975static int slim2_tx_bit_format_put(struct snd_kcontrol *kcontrol,
976 struct snd_ctl_elem_value *ucontrol)
977{
978 int rc = 0;
979
980 switch (ucontrol->value.integer.value[0]) {
981 case 2:
982 slim2_tx_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
983 break;
984 case 1:
985 slim2_tx_bit_format = SNDRV_PCM_FORMAT_S24_LE;
986 break;
987 case 0:
988 slim2_tx_bit_format = SNDRV_PCM_FORMAT_S16_LE;
989 break;
990 default:
991 pr_err("%s: invalid value %ld\n", __func__,
992 ucontrol->value.integer.value[0]);
993 rc = -EINVAL;
994 break;
995 }
996 return rc;
997}
998
999static int msm_slim_5_rx_ch_get(struct snd_kcontrol *kcontrol,
1000 struct snd_ctl_elem_value *ucontrol)
1001{
1002 pr_debug("%s: msm_slim_5_rx_ch = %d\n", __func__,
1003 msm_slim_5_rx_ch);
1004 ucontrol->value.integer.value[0] = msm_slim_5_rx_ch - 1;
1005 return 0;
1006}
1007
1008static int msm_slim_5_rx_ch_put(struct snd_kcontrol *kcontrol,
1009 struct snd_ctl_elem_value *ucontrol)
1010{
1011 msm_slim_5_rx_ch = ucontrol->value.integer.value[0] + 1;
1012
1013 pr_debug("%s: msm_slim_0_rx_ch = %d\n", __func__,
1014 msm_slim_5_rx_ch);
1015 return 0;
1016}
1017static int msm_slim_6_rx_ch_get(struct snd_kcontrol *kcontrol,
1018 struct snd_ctl_elem_value *ucontrol)
1019{
1020 pr_debug("%s: msm_slim_6_rx_ch = %d\n", __func__,
1021 msm_slim_6_rx_ch);
1022 ucontrol->value.integer.value[0] = msm_slim_6_rx_ch - 1;
1023 return 0;
1024}
1025
1026static int msm_slim_6_rx_ch_put(struct snd_kcontrol *kcontrol,
1027 struct snd_ctl_elem_value *ucontrol)
1028{
1029 msm_slim_6_rx_ch = ucontrol->value.integer.value[0] + 1;
1030 pr_debug("%s: msm_slim_6_rx_ch = %d\n", __func__,
1031 msm_slim_6_rx_ch);
1032 return 1;
1033}
1034
1035static int msm_slim_0_tx_ch_get(struct snd_kcontrol *kcontrol,
1036 struct snd_ctl_elem_value *ucontrol)
1037{
1038 pr_debug("%s: msm_slim_0_tx_ch = %d\n", __func__,
1039 msm_slim_0_tx_ch);
1040 ucontrol->value.integer.value[0] = msm_slim_0_tx_ch - 1;
1041 return 0;
1042}
1043
1044static int msm_slim_0_tx_ch_put(struct snd_kcontrol *kcontrol,
1045 struct snd_ctl_elem_value *ucontrol)
1046{
1047 msm_slim_0_tx_ch = ucontrol->value.integer.value[0] + 1;
1048
1049 pr_debug("%s: msm_slim_0_tx_ch = %d\n", __func__, msm_slim_0_tx_ch);
1050 return 1;
1051}
1052
1053static int msm_slim_2_tx_ch_get(struct snd_kcontrol *kcontrol,
1054 struct snd_ctl_elem_value *ucontrol)
1055{
1056 pr_debug("%s: msm_slim_2_tx_ch = %d\n", __func__,
1057 msm_slim_2_tx_ch);
1058 ucontrol->value.integer.value[0] = msm_slim_2_tx_ch - 1;
1059 return 0;
1060}
1061
1062static int msm_slim_2_tx_ch_put(struct snd_kcontrol *kcontrol,
1063 struct snd_ctl_elem_value *ucontrol)
1064{
1065 msm_slim_2_tx_ch = ucontrol->value.integer.value[0] + 1;
1066
1067 pr_debug("%s: msm_slim_2_tx_ch = %d\n", __func__, msm_slim_2_tx_ch);
1068 return 1;
1069}
1070
1071static int slim0_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1072 struct snd_ctl_elem_value *ucontrol)
1073{
1074 int sample_rate_val = 0;
1075
1076 switch (slim0_tx_sample_rate) {
1077 case SAMPLING_RATE_16KHZ:
1078 sample_rate_val = 4;
1079 break;
1080 case SAMPLING_RATE_192KHZ:
1081 sample_rate_val = 2;
1082 break;
1083 case SAMPLING_RATE_96KHZ:
1084 sample_rate_val = 1;
1085 break;
1086 case SAMPLING_RATE_48KHZ:
1087 default:
1088 sample_rate_val = 0;
1089 break;
1090 }
1091
1092 ucontrol->value.integer.value[0] = sample_rate_val;
1093 pr_debug("%s: slim0_tx_sample_rate = %d\n", __func__,
1094 slim0_tx_sample_rate);
1095 return 0;
1096
1097}
1098
1099static int slim0_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1100 struct snd_ctl_elem_value *ucontrol)
1101{
1102 int rc = 0;
1103
1104 pr_debug("%s: ucontrol value = %ld\n", __func__,
1105 ucontrol->value.integer.value[0]);
1106
1107 switch (ucontrol->value.integer.value[0]) {
1108 case 4:
1109 slim0_tx_sample_rate = SAMPLING_RATE_16KHZ;
1110 break;
1111 case 2:
1112 slim0_tx_sample_rate = SAMPLING_RATE_192KHZ;
1113 break;
1114 case 1:
1115 slim0_tx_sample_rate = SAMPLING_RATE_96KHZ;
1116 break;
1117 case 0:
1118 slim0_tx_sample_rate = SAMPLING_RATE_48KHZ;
1119 break;
1120 default:
1121 rc = -EINVAL;
1122 pr_err("%s: invalid sample rate being passed\n", __func__);
1123 break;
1124 }
1125 pr_debug("%s: slim0_tx_sample_rate = %d\n", __func__,
1126 slim0_tx_sample_rate);
1127 return rc;
1128}
1129
1130static int slim2_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1131 struct snd_ctl_elem_value *ucontrol)
1132{
1133 int sample_rate_val = 0;
1134
1135 switch (slim2_tx_sample_rate) {
1136 case SAMPLING_RATE_16KHZ:
1137 sample_rate_val = 4;
1138 break;
1139 case SAMPLING_RATE_192KHZ:
1140 sample_rate_val = 2;
1141 break;
1142 case SAMPLING_RATE_96KHZ:
1143 sample_rate_val = 1;
1144 break;
1145 case SAMPLING_RATE_48KHZ:
1146 default:
1147 sample_rate_val = 0;
1148 break;
1149 }
1150
1151 ucontrol->value.integer.value[0] = sample_rate_val;
1152 pr_debug("%s: slim2_tx_sample_rate = %d\n", __func__,
1153 slim2_tx_sample_rate);
1154 return 0;
1155
1156}
1157
1158static int slim2_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1159 struct snd_ctl_elem_value *ucontrol)
1160{
1161 int rc = 0;
1162
1163 pr_debug("%s: ucontrol value = %ld\n", __func__,
1164 ucontrol->value.integer.value[0]);
1165
1166 switch (ucontrol->value.integer.value[0]) {
1167 case 4:
1168 slim2_tx_sample_rate = SAMPLING_RATE_16KHZ;
1169 break;
1170 case 2:
1171 slim2_tx_sample_rate = SAMPLING_RATE_192KHZ;
1172 break;
1173 case 1:
1174 slim2_tx_sample_rate = SAMPLING_RATE_96KHZ;
1175 break;
1176 case 0:
1177 slim2_tx_sample_rate = SAMPLING_RATE_48KHZ;
1178 break;
1179 default:
1180 rc = -EINVAL;
1181 pr_err("%s: invalid sample rate being passed\n", __func__);
1182 break;
1183 }
1184 pr_debug("%s: slim2_tx_sample_rate = %d\n", __func__,
1185 slim2_tx_sample_rate);
1186 return rc;
1187}
1188
1189static int msm_btsco_rate_get(struct snd_kcontrol *kcontrol,
1190 struct snd_ctl_elem_value *ucontrol)
1191{
1192 pr_debug("%s: msm_btsco_rate = %d", __func__, msm_btsco_rate);
1193 ucontrol->value.integer.value[0] = msm_btsco_rate;
1194 return 0;
1195}
1196
1197static int msm_btsco_rate_put(struct snd_kcontrol *kcontrol,
1198 struct snd_ctl_elem_value *ucontrol)
1199{
1200 switch (ucontrol->value.integer.value[0]) {
1201 case RATE_8KHZ_ID:
1202 msm_btsco_rate = BTSCO_RATE_8KHZ;
1203 break;
1204 case RATE_16KHZ_ID:
1205 msm_btsco_rate = BTSCO_RATE_16KHZ;
1206 break;
1207 default:
1208 msm_btsco_rate = BTSCO_RATE_8KHZ;
1209 break;
1210 }
1211
1212 pr_debug("%s: msm_btsco_rate = %d\n", __func__, msm_btsco_rate);
1213 return 0;
1214}
1215
1216static int msm_auxpcm_rate_get(struct snd_kcontrol *kcontrol,
1217 struct snd_ctl_elem_value *ucontrol)
1218{
1219 pr_debug("%s: msm_auxpcm_rate = %d", __func__, msm8952_auxpcm_rate);
1220 ucontrol->value.integer.value[0] = msm8952_auxpcm_rate;
1221 return 0;
1222}
1223
1224static int msm_auxpcm_rate_put(struct snd_kcontrol *kcontrol,
1225 struct snd_ctl_elem_value *ucontrol)
1226{
1227 switch (ucontrol->value.integer.value[0]) {
1228 case RATE_8KHZ_ID:
1229 msm8952_auxpcm_rate = SAMPLING_RATE_8KHZ;
1230 break;
1231 case RATE_16KHZ_ID:
1232 msm8952_auxpcm_rate = SAMPLING_RATE_16KHZ;
1233 break;
1234 default:
1235 msm8952_auxpcm_rate = SAMPLING_RATE_8KHZ;
1236 break;
1237 }
1238
1239 pr_debug("%s: msm_auxpcm_rate = %d\n", __func__, msm8952_auxpcm_rate);
1240 return 0;
1241}
1242
1243static int msm_proxy_rx_ch_get(struct snd_kcontrol *kcontrol,
1244 struct snd_ctl_elem_value *ucontrol)
1245{
1246 pr_debug("%s: msm_proxy_rx_ch = %d\n", __func__,
1247 msm_proxy_rx_ch);
1248 ucontrol->value.integer.value[0] = msm_proxy_rx_ch - 1;
1249 return 0;
1250}
1251
1252static int msm_proxy_rx_ch_put(struct snd_kcontrol *kcontrol,
1253 struct snd_ctl_elem_value *ucontrol)
1254{
1255 msm_proxy_rx_ch = ucontrol->value.integer.value[0] + 1;
1256 pr_debug("%s: msm_proxy_rx_ch = %d\n", __func__,
1257 msm_proxy_rx_ch);
1258 return 1;
1259}
1260
1261static int msm_pri_tdm_rx_0_ch_get(struct snd_kcontrol *kcontrol,
1262 struct snd_ctl_elem_value *ucontrol)
1263{
1264 pr_debug("%s: msm_pri_tdm_rx_0_ch = %d\n", __func__,
1265 msm_pri_tdm_rx_0_ch);
1266 ucontrol->value.integer.value[0] = msm_pri_tdm_rx_0_ch - 1;
1267 return 0;
1268}
1269
1270static int msm_pri_tdm_rx_0_ch_put(struct snd_kcontrol *kcontrol,
1271 struct snd_ctl_elem_value *ucontrol)
1272{
1273 msm_pri_tdm_rx_0_ch = ucontrol->value.integer.value[0] + 1;
1274 pr_debug("%s: msm_pri_tdm_rx_0_ch = %d\n", __func__,
1275 msm_pri_tdm_rx_0_ch);
1276 return 0;
1277}
1278
1279static int msm_pri_tdm_tx_0_ch_get(struct snd_kcontrol *kcontrol,
1280 struct snd_ctl_elem_value *ucontrol)
1281{
1282 pr_debug("%s: msm_pri_tdm_tx_0_ch = %d\n", __func__,
1283 msm_pri_tdm_tx_0_ch);
1284 ucontrol->value.integer.value[0] = msm_pri_tdm_tx_0_ch - 1;
1285 return 0;
1286}
1287
1288static int msm_pri_tdm_tx_0_ch_put(struct snd_kcontrol *kcontrol,
1289 struct snd_ctl_elem_value *ucontrol)
1290{
1291 msm_pri_tdm_tx_0_ch = ucontrol->value.integer.value[0] + 1;
1292 pr_debug("%s: msm_pri_tdm_tx_0_ch = %d\n", __func__,
1293 msm_pri_tdm_tx_0_ch);
1294 return 0;
1295}
1296
1297static int msm_sec_tdm_rx_0_ch_get(struct snd_kcontrol *kcontrol,
1298 struct snd_ctl_elem_value *ucontrol)
1299{
1300 pr_debug("%s: msm_sec_tdm_rx_0_ch = %d\n", __func__,
1301 msm_sec_tdm_rx_0_ch);
1302 ucontrol->value.integer.value[0] = msm_sec_tdm_rx_0_ch - 1;
1303 return 0;
1304}
1305
1306static int msm_sec_tdm_rx_0_ch_put(struct snd_kcontrol *kcontrol,
1307 struct snd_ctl_elem_value *ucontrol)
1308{
1309 msm_sec_tdm_rx_0_ch = ucontrol->value.integer.value[0] + 1;
1310 pr_debug("%s: msm_sec_tdm_rx_0_ch = %d\n", __func__,
1311 msm_sec_tdm_rx_0_ch);
1312 return 0;
1313}
1314
1315static int msm_sec_tdm_tx_0_ch_get(struct snd_kcontrol *kcontrol,
1316 struct snd_ctl_elem_value *ucontrol)
1317{
1318 pr_debug("%s: msm_sec_tdm_tx_0_ch = %d\n", __func__,
1319 msm_sec_tdm_tx_0_ch);
1320 ucontrol->value.integer.value[0] = msm_sec_tdm_tx_0_ch - 1;
1321 return 0;
1322}
1323
1324static int msm_sec_tdm_tx_0_ch_put(struct snd_kcontrol *kcontrol,
1325 struct snd_ctl_elem_value *ucontrol)
1326{
1327 msm_sec_tdm_tx_0_ch = ucontrol->value.integer.value[0] + 1;
1328 pr_debug("%s: msm_sec_tdm_tx_0_ch = %d\n", __func__,
1329 msm_sec_tdm_tx_0_ch);
1330 return 0;
1331}
1332
1333static int msm_pri_tdm_rx_0_bit_format_get(struct snd_kcontrol *kcontrol,
1334 struct snd_ctl_elem_value *ucontrol)
1335{
1336 switch (msm_pri_tdm_rx_0_bit_format) {
1337 case SNDRV_PCM_FORMAT_S32_LE:
1338 ucontrol->value.integer.value[0] = 3;
1339 break;
1340 case SNDRV_PCM_FORMAT_S24_3LE:
1341 ucontrol->value.integer.value[0] = 2;
1342 break;
1343 case SNDRV_PCM_FORMAT_S24_LE:
1344 ucontrol->value.integer.value[0] = 1;
1345 break;
1346 case SNDRV_PCM_FORMAT_S16_LE:
1347 default:
1348 ucontrol->value.integer.value[0] = 0;
1349 break;
1350 }
1351 pr_debug("%s: msm_pri_tdm_rx_0_bit_format = %ld\n",
1352 __func__, ucontrol->value.integer.value[0]);
1353 return 0;
1354}
1355
1356static int msm_pri_tdm_rx_0_bit_format_put(struct snd_kcontrol *kcontrol,
1357 struct snd_ctl_elem_value *ucontrol)
1358{
1359 switch (ucontrol->value.integer.value[0]) {
1360 case 3:
1361 msm_pri_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S32_LE;
1362 break;
1363 case 2:
1364 msm_pri_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1365 break;
1366 case 1:
1367 msm_pri_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
1368 break;
1369 case 0:
1370 default:
1371 msm_pri_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
1372 break;
1373 }
1374 pr_debug("%s: msm_pri_tdm_rx_0_bit_format = %d\n",
1375 __func__, msm_pri_tdm_rx_0_bit_format);
1376 return 0;
1377}
1378
1379static int msm_pri_tdm_tx_0_bit_format_get(struct snd_kcontrol *kcontrol,
1380 struct snd_ctl_elem_value *ucontrol)
1381{
1382 switch (msm_pri_tdm_tx_0_bit_format) {
1383 case SNDRV_PCM_FORMAT_S32_LE:
1384 ucontrol->value.integer.value[0] = 3;
1385 break;
1386 case SNDRV_PCM_FORMAT_S24_3LE:
1387 ucontrol->value.integer.value[0] = 2;
1388 break;
1389 case SNDRV_PCM_FORMAT_S24_LE:
1390 ucontrol->value.integer.value[0] = 1;
1391 break;
1392 case SNDRV_PCM_FORMAT_S16_LE:
1393 default:
1394 ucontrol->value.integer.value[0] = 0;
1395 break;
1396 }
1397 pr_debug("%s: msm_pri_tdm_tx_0_bit_format = %ld\n",
1398 __func__, ucontrol->value.integer.value[0]);
1399 return 0;
1400}
1401
1402static int msm_pri_tdm_tx_0_bit_format_put(struct snd_kcontrol *kcontrol,
1403 struct snd_ctl_elem_value *ucontrol)
1404{
1405 switch (ucontrol->value.integer.value[0]) {
1406 case 3:
1407 msm_pri_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S32_LE;
1408 break;
1409 case 2:
1410 msm_pri_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1411 break;
1412 case 1:
1413 msm_pri_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
1414 break;
1415 case 0:
1416 default:
1417 msm_pri_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
1418 break;
1419 }
1420 pr_debug("%s: msm_pri_tdm_tx_0_bit_format = %d\n",
1421 __func__, msm_pri_tdm_tx_0_bit_format);
1422 return 0;
1423}
1424
1425static int msm_sec_tdm_rx_0_bit_format_get(struct snd_kcontrol *kcontrol,
1426 struct snd_ctl_elem_value *ucontrol)
1427{
1428 switch (msm_sec_tdm_rx_0_bit_format) {
1429 case SNDRV_PCM_FORMAT_S32_LE:
1430 ucontrol->value.integer.value[0] = 3;
1431 break;
1432 case SNDRV_PCM_FORMAT_S24_3LE:
1433 ucontrol->value.integer.value[0] = 2;
1434 break;
1435 case SNDRV_PCM_FORMAT_S24_LE:
1436 ucontrol->value.integer.value[0] = 1;
1437 break;
1438 case SNDRV_PCM_FORMAT_S16_LE:
1439 default:
1440 ucontrol->value.integer.value[0] = 0;
1441 break;
1442 }
1443 pr_debug("%s: msm_sec_tdm_rx_0_bit_format = %ld\n",
1444 __func__, ucontrol->value.integer.value[0]);
1445 return 0;
1446}
1447
1448static int msm_sec_tdm_rx_0_bit_format_put(struct snd_kcontrol *kcontrol,
1449 struct snd_ctl_elem_value *ucontrol)
1450{
1451 switch (ucontrol->value.integer.value[0]) {
1452 case 3:
1453 msm_sec_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S32_LE;
1454 break;
1455 case 2:
1456 msm_sec_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1457 break;
1458 case 1:
1459 msm_sec_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
1460 break;
1461 case 0:
1462 default:
1463 msm_sec_tdm_rx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
1464 break;
1465 }
1466 pr_debug("%s: msm_sec_tdm_rx_0_bit_format = %d\n",
1467 __func__, msm_sec_tdm_rx_0_bit_format);
1468 return 0;
1469}
1470
1471static int msm_sec_tdm_tx_0_bit_format_get(struct snd_kcontrol *kcontrol,
1472 struct snd_ctl_elem_value *ucontrol)
1473{
1474 switch (msm_sec_tdm_tx_0_bit_format) {
1475 case SNDRV_PCM_FORMAT_S32_LE:
1476 ucontrol->value.integer.value[0] = 3;
1477 break;
1478 case SNDRV_PCM_FORMAT_S24_3LE:
1479 ucontrol->value.integer.value[0] = 2;
1480 break;
1481 case SNDRV_PCM_FORMAT_S24_LE:
1482 ucontrol->value.integer.value[0] = 1;
1483 break;
1484 case SNDRV_PCM_FORMAT_S16_LE:
1485 default:
1486 ucontrol->value.integer.value[0] = 0;
1487 break;
1488 }
1489 pr_debug("%s: msm_sec_tdm_tx_0_bit_format = %ld\n",
1490 __func__, ucontrol->value.integer.value[0]);
1491 return 0;
1492}
1493
1494static int msm_sec_tdm_tx_0_bit_format_put(struct snd_kcontrol *kcontrol,
1495 struct snd_ctl_elem_value *ucontrol)
1496{
1497 switch (ucontrol->value.integer.value[0]) {
1498 case 3:
1499 msm_sec_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S32_LE;
1500 break;
1501 case 2:
1502 msm_sec_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1503 break;
1504 case 1:
1505 msm_sec_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S24_LE;
1506 break;
1507 case 0:
1508 default:
1509 msm_sec_tdm_tx_0_bit_format = SNDRV_PCM_FORMAT_S16_LE;
1510 break;
1511 }
1512 pr_debug("%s: msm_sec_tdm_tx_0_bit_format = %d\n",
1513 __func__, msm_sec_tdm_tx_0_bit_format);
1514 return 0;
1515}
1516
1517static int msm_pri_tdm_rx_0_sample_rate_get(struct snd_kcontrol *kcontrol,
1518 struct snd_ctl_elem_value *ucontrol)
1519{
1520 switch (msm_pri_tdm_rx_0_sample_rate) {
1521 case SAMPLING_RATE_16KHZ:
1522 ucontrol->value.integer.value[0] = 0;
1523 break;
1524 case SAMPLING_RATE_48KHZ:
1525 default:
1526 ucontrol->value.integer.value[0] = 1;
1527 break;
1528 }
1529 pr_debug("%s: msm_pri_tdm_rx_0_sample_rate = %ld\n",
1530 __func__, ucontrol->value.integer.value[0]);
1531 return 0;
1532}
1533
1534static int msm_pri_tdm_rx_0_sample_rate_put(struct snd_kcontrol *kcontrol,
1535 struct snd_ctl_elem_value *ucontrol)
1536{
1537 switch (ucontrol->value.integer.value[0]) {
1538 case 0:
1539 msm_pri_tdm_rx_0_sample_rate = SAMPLING_RATE_16KHZ;
1540 break;
1541 case 1:
1542 default:
1543 msm_pri_tdm_rx_0_sample_rate = SAMPLING_RATE_48KHZ;
1544 break;
1545 }
1546 pr_debug("%s: msm_pri_tdm_rx_0_sample_rate = %d\n",
1547 __func__, msm_pri_tdm_rx_0_sample_rate);
1548 return 0;
1549}
1550
1551static int msm_sec_tdm_rx_0_sample_rate_get(struct snd_kcontrol *kcontrol,
1552 struct snd_ctl_elem_value *ucontrol)
1553{
1554 switch (msm_sec_tdm_rx_0_sample_rate) {
1555 case SAMPLING_RATE_16KHZ:
1556 ucontrol->value.integer.value[0] = 0;
1557 break;
1558 case SAMPLING_RATE_48KHZ:
1559 default:
1560 ucontrol->value.integer.value[0] = 1;
1561 break;
1562 }
1563 pr_debug("%s: msm_sec_tdm_rx_0_sample_rate = %ld\n",
1564 __func__, ucontrol->value.integer.value[0]);
1565 return 0;
1566}
1567
1568static int msm_sec_tdm_rx_0_sample_rate_put(struct snd_kcontrol *kcontrol,
1569 struct snd_ctl_elem_value *ucontrol)
1570{
1571 switch (ucontrol->value.integer.value[0]) {
1572 case 0:
1573 msm_sec_tdm_rx_0_sample_rate = SAMPLING_RATE_16KHZ;
1574 break;
1575 case 1:
1576 default:
1577 msm_sec_tdm_rx_0_sample_rate = SAMPLING_RATE_48KHZ;
1578 break;
1579 }
1580 pr_debug("%s: msm_sec_tdm_rx_0_sample_rate = %d\n",
1581 __func__, msm_sec_tdm_rx_0_sample_rate);
1582 return 0;
1583}
1584
1585static int msm_pri_tdm_tx_0_sample_rate_get(struct snd_kcontrol *kcontrol,
1586 struct snd_ctl_elem_value *ucontrol)
1587{
1588 switch (msm_pri_tdm_tx_0_sample_rate) {
1589 case SAMPLING_RATE_16KHZ:
1590 ucontrol->value.integer.value[0] = 0;
1591 break;
1592 case SAMPLING_RATE_48KHZ:
1593 default:
1594 ucontrol->value.integer.value[0] = 1;
1595 break;
1596 }
1597 pr_debug("%s: msm_pri_tdm_tx_0_sample_rate = %ld\n",
1598 __func__, ucontrol->value.integer.value[0]);
1599 return 0;
1600}
1601
1602static int msm_pri_tdm_tx_0_sample_rate_put(struct snd_kcontrol *kcontrol,
1603 struct snd_ctl_elem_value *ucontrol)
1604{
1605 switch (ucontrol->value.integer.value[0]) {
1606 case 0:
1607 msm_pri_tdm_tx_0_sample_rate = SAMPLING_RATE_16KHZ;
1608 break;
1609 case 1:
1610 default:
1611 msm_pri_tdm_tx_0_sample_rate = SAMPLING_RATE_48KHZ;
1612 break;
1613 }
1614 pr_debug("%s: msm_pri_tdm_tx_0_sample_rate = %d\n",
1615 __func__, msm_pri_tdm_tx_0_sample_rate);
1616 return 0;
1617}
1618
1619static int msm_sec_tdm_tx_0_sample_rate_get(struct snd_kcontrol *kcontrol,
1620 struct snd_ctl_elem_value *ucontrol)
1621{
1622 switch (msm_sec_tdm_tx_0_sample_rate) {
1623 case SAMPLING_RATE_16KHZ:
1624 ucontrol->value.integer.value[0] = 0;
1625 break;
1626 case SAMPLING_RATE_48KHZ:
1627 default:
1628 ucontrol->value.integer.value[0] = 1;
1629 break;
1630 }
1631 pr_debug("%s: msm_sec_tdm_tx_0_sample_rate = %ld\n",
1632 __func__, ucontrol->value.integer.value[0]);
1633 return 0;
1634}
1635
1636static int msm_sec_tdm_tx_0_sample_rate_put(struct snd_kcontrol *kcontrol,
1637 struct snd_ctl_elem_value *ucontrol)
1638{
1639 switch (ucontrol->value.integer.value[0]) {
1640 case 0:
1641 msm_sec_tdm_tx_0_sample_rate = SAMPLING_RATE_16KHZ;
1642 break;
1643 case 1:
1644 default:
1645 msm_sec_tdm_tx_0_sample_rate = SAMPLING_RATE_48KHZ;
1646 break;
1647 }
1648 pr_debug("%s: msm_sec_tdm_tx_0_sample_rate = %d\n",
1649 __func__, msm_sec_tdm_tx_0_sample_rate);
1650 return 0;
1651}
1652
1653static const char *const spk_function[] = {"Off", "On"};
1654static const char *const slim0_rx_ch_text[] = {"One", "Two", "Three", "Four",
1655 "Five", "Six", "Seven",
1656 "Eight"};
1657static const char *const slim4_rx_ch_text[] = {"One", "Two", "Three", "Four",
1658 "Five", "Six", "Seven",
1659 "Eight"};
1660static const char *const slim0_tx_ch_text[] = {"One", "Two", "Three", "Four",
1661 "Five", "Six", "Seven",
1662 "Eight"};
1663static const char *const slim2_tx_ch_text[] = {"One", "Two", "Three", "Four",
1664 "Five", "Six", "Seven",
1665 "Eight"};
1666static const char *const slim4_tx_ch_text[] = {"One", "Two", "Three", "Four",
1667 "Five", "Six", "Seven",
1668 "Eight"};
1669static const char *const vi_feed_ch_text[] = {"One", "Two"};
1670static char const *rx_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
1671static char const *slim0_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
1672 "KHZ_192", "KHZ_44P1", "KHZ_16"};
1673static char const *slim4_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
1674 "KHZ_192", "KHZ_44P1", "KHZ_16"};
1675static const char *const slim5_rx_ch_text[] = {"One", "Two", "Three", "Four",
1676 "Five", "Six", "Seven",
1677 "Eight"};
1678static const char *const slim6_rx_ch_text[] = {"One", "Two", "Three", "Four",
1679 "Five", "Six", "Seven",
1680 "Eight"};
1681static char const *slim5_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
1682 "KHZ_192", "KHZ_44P1"};
1683static char const *slim6_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96",
1684 "KHZ_192", "KHZ_44P1"};
1685static char const *slim4_rx_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
1686static char const *slim5_rx_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
1687static const char *const proxy_rx_ch_text[] = {"One", "Two", "Three", "Four",
1688 "Five", "Six", "Seven", "Eight"};
1689static char const *slim6_rx_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
1690
1691static const struct soc_enum msm_snd_enum[] = {
1692 SOC_ENUM_SINGLE_EXT(2, spk_function),
1693 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim0_rx_ch_text), slim0_rx_ch_text),
1694 SOC_ENUM_SINGLE_EXT(8, slim0_tx_ch_text),
1695 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(rx_bit_format_text),
1696 rx_bit_format_text),
1697 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim0_rx_sample_rate_text),
1698 slim0_rx_sample_rate_text),
1699 SOC_ENUM_SINGLE_EXT(2, vi_feed_ch_text),
1700 SOC_ENUM_SINGLE_EXT(4, slim5_rx_sample_rate_text),
1701 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim5_rx_bit_format_text),
1702 slim5_rx_bit_format_text),
1703 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim5_rx_ch_text), slim5_rx_ch_text),
1704 SOC_ENUM_SINGLE_EXT(8, proxy_rx_ch_text),
1705 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim6_rx_sample_rate_text),
1706 slim6_rx_sample_rate_text),
1707 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim6_rx_bit_format_text),
1708 slim6_rx_bit_format_text),
1709 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim6_rx_ch_text), slim6_rx_ch_text),
1710 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_ch_text),
1711 tdm_ch_text),
1712 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_bit_format_text),
1713 tdm_bit_format_text),
1714 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(tdm_sample_rate_text),
1715 tdm_sample_rate_text),
1716 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim4_rx_ch_text), slim4_rx_ch_text),
1717 SOC_ENUM_SINGLE_EXT(8, slim2_tx_ch_text),
1718 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim4_rx_sample_rate_text),
1719 slim4_rx_sample_rate_text),
1720 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(slim4_rx_bit_format_text),
1721 slim4_rx_bit_format_text),
1722};
1723
1724static const char *const btsco_rate_text[] = {"BTSCO_RATE_8KHZ",
1725 "BTSCO_RATE_16KHZ"};
1726static const struct soc_enum msm_btsco_enum[] = {
1727 SOC_ENUM_SINGLE_EXT(2, btsco_rate_text),
1728};
1729
1730static const char *const auxpcm_rate_text[] = {"SAMPLING_RATE_8KHZ",
1731 "SAMPLING_RATE_16KHZ"};
1732static const struct soc_enum msm_auxpcm_enum[] = {
1733 SOC_ENUM_SINGLE_EXT(2, auxpcm_rate_text),
1734};
1735
1736static const struct snd_kcontrol_new msm_snd_controls[] = {
1737 SOC_ENUM_EXT("Speaker Function", msm_snd_enum[0], msm8952_get_spk,
1738 msm8952_set_spk),
1739 SOC_ENUM_EXT("SLIM_0_RX Channels", msm_snd_enum[1],
1740 msm_slim_0_rx_ch_get, msm_slim_0_rx_ch_put),
1741 SOC_ENUM_EXT("SLIM_4_RX Channels", msm_snd_enum[16],
1742 msm_slim_4_rx_ch_get, msm_slim_4_rx_ch_put),
1743 SOC_ENUM_EXT("SLIM_5_RX Channels", msm_snd_enum[8],
1744 msm_slim_5_rx_ch_get, msm_slim_5_rx_ch_put),
1745 SOC_ENUM_EXT("SLIM_6_RX Channels", msm_snd_enum[12],
1746 msm_slim_6_rx_ch_get, msm_slim_6_rx_ch_put),
1747 SOC_ENUM_EXT("SLIM_0_TX Channels", msm_snd_enum[2],
1748 msm_slim_0_tx_ch_get, msm_slim_0_tx_ch_put),
1749 SOC_ENUM_EXT("SLIM_1_TX Channels", msm_snd_enum[2],
1750 msm_slim_1_tx_ch_get, msm_slim_1_tx_ch_put),
1751 SOC_ENUM_EXT("SLIM_2_TX Channels", msm_snd_enum[17],
1752 msm_slim_2_tx_ch_get, msm_slim_2_tx_ch_put),
1753 SOC_ENUM_EXT("MI2S_RX Format", msm_snd_enum[3],
1754 mi2s_rx_bit_format_get, mi2s_rx_bit_format_put),
1755 SOC_ENUM_EXT("SLIM_0_RX Format", msm_snd_enum[3],
1756 slim0_rx_bit_format_get, slim0_rx_bit_format_put),
1757 SOC_ENUM_EXT("SLIM_4_RX Format", msm_snd_enum[19],
1758 slim4_rx_bit_format_get, slim4_rx_bit_format_put),
1759 SOC_ENUM_EXT("SLIM_5_RX Format", msm_snd_enum[7],
1760 slim5_rx_bit_format_get, slim5_rx_bit_format_put),
1761 SOC_ENUM_EXT("SLIM_6_RX Format", msm_snd_enum[11],
1762 slim6_rx_bit_format_get, slim6_rx_bit_format_put),
1763 SOC_ENUM_EXT("SLIM_0_RX SampleRate", msm_snd_enum[4],
1764 slim0_rx_sample_rate_get, slim0_rx_sample_rate_put),
1765 SOC_ENUM_EXT("SLIM_4_RX SampleRate", msm_snd_enum[18],
1766 slim4_rx_sample_rate_get, slim4_rx_sample_rate_put),
1767 SOC_ENUM_EXT("SLIM_5_RX SampleRate", msm_snd_enum[6],
1768 slim5_rx_sample_rate_get, slim5_rx_sample_rate_put),
1769 SOC_ENUM_EXT("SLIM_6_RX SampleRate", msm_snd_enum[10],
1770 slim6_rx_sample_rate_get, slim6_rx_sample_rate_put),
1771 SOC_ENUM_EXT("VI_FEED_TX Channels", msm_snd_enum[5],
1772 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
1773 SOC_ENUM_EXT("SLIM_0_TX SampleRate", msm_snd_enum[4],
1774 slim0_tx_sample_rate_get, slim0_tx_sample_rate_put),
1775 SOC_ENUM_EXT("SLIM_0_TX Format", msm_snd_enum[3],
1776 slim0_tx_bit_format_get, slim0_tx_bit_format_put),
1777 SOC_ENUM_EXT("SLIM_2_TX SampleRate", msm_snd_enum[4],
1778 slim2_tx_sample_rate_get, slim2_tx_sample_rate_put),
1779 SOC_ENUM_EXT("SLIM_2_TX Format", msm_snd_enum[3],
1780 slim2_tx_bit_format_get, slim2_tx_bit_format_put),
1781 SOC_ENUM_EXT("Internal BTSCO SampleRate", msm_btsco_enum[0],
1782 msm_btsco_rate_get, msm_btsco_rate_put),
1783 SOC_ENUM_EXT("AUXPCM SampleRate", msm_auxpcm_enum[0],
1784 msm_auxpcm_rate_get, msm_auxpcm_rate_put),
1785 SOC_ENUM_EXT("PROXY_RX Channels", msm_snd_enum[9],
1786 msm_proxy_rx_ch_get, msm_proxy_rx_ch_put),
1787 SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", msm_snd_enum[13],
1788 msm_pri_tdm_rx_0_ch_get, msm_pri_tdm_rx_0_ch_put),
1789 SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", msm_snd_enum[13],
1790 msm_pri_tdm_tx_0_ch_get, msm_pri_tdm_tx_0_ch_put),
1791 SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", msm_snd_enum[13],
1792 msm_sec_tdm_rx_0_ch_get, msm_sec_tdm_rx_0_ch_put),
1793 SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", msm_snd_enum[13],
1794 msm_sec_tdm_tx_0_ch_get, msm_sec_tdm_tx_0_ch_put),
1795 SOC_ENUM_EXT("PRI_TDM_RX_0 Bit Format", msm_snd_enum[14],
1796 msm_pri_tdm_rx_0_bit_format_get,
1797 msm_pri_tdm_rx_0_bit_format_put),
1798 SOC_ENUM_EXT("PRI_TDM_TX_0 Bit Format", msm_snd_enum[14],
1799 msm_pri_tdm_tx_0_bit_format_get,
1800 msm_pri_tdm_tx_0_bit_format_put),
1801 SOC_ENUM_EXT("SEC_TDM_RX_0 Bit Format", msm_snd_enum[14],
1802 msm_sec_tdm_rx_0_bit_format_get,
1803 msm_sec_tdm_rx_0_bit_format_put),
1804 SOC_ENUM_EXT("SEC_TDM_TX_0 Bit Format", msm_snd_enum[14],
1805 msm_sec_tdm_tx_0_bit_format_get,
1806 msm_sec_tdm_tx_0_bit_format_put),
1807 SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", msm_snd_enum[15],
1808 msm_pri_tdm_rx_0_sample_rate_get,
1809 msm_pri_tdm_rx_0_sample_rate_put),
1810 SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", msm_snd_enum[15],
1811 msm_pri_tdm_tx_0_sample_rate_get,
1812 msm_pri_tdm_tx_0_sample_rate_put),
1813 SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", msm_snd_enum[15],
1814 msm_sec_tdm_rx_0_sample_rate_get,
1815 msm_sec_tdm_rx_0_sample_rate_put),
1816 SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", msm_snd_enum[15],
1817 msm_sec_tdm_tx_0_sample_rate_get,
1818 msm_sec_tdm_tx_0_sample_rate_put),
1819};
1820
1821int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
1822 struct snd_pcm_hw_params *params)
1823{
1824 struct snd_interval *rate = hw_param_interval(params,
1825 SNDRV_PCM_HW_PARAM_RATE);
1826
1827 struct snd_interval *channels = hw_param_interval(params,
1828 SNDRV_PCM_HW_PARAM_CHANNELS);
1829
1830 pr_debug("%s()\n", __func__);
1831 rate->min = rate->max = 48000;
1832 channels->min = channels->max = 2;
1833
1834 return 0;
1835}
1836
1837int msm_quin_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
1838 struct snd_pcm_hw_params *params)
1839{
1840 struct snd_interval *rate = hw_param_interval(params,
1841 SNDRV_PCM_HW_PARAM_RATE);
1842
1843 struct snd_interval *channels = hw_param_interval(params,
1844 SNDRV_PCM_HW_PARAM_CHANNELS);
1845
1846 pr_debug("%s()\n", __func__);
1847 rate->min = rate->max = 48000;
1848 channels->min = channels->max = 2;
1849
1850 return 0;
1851}
1852
1853int msm_auxpcm_be_params_fixup(struct snd_soc_pcm_runtime *rtd,
1854 struct snd_pcm_hw_params *params)
1855{
1856 struct snd_interval *rate = hw_param_interval(params,
1857 SNDRV_PCM_HW_PARAM_RATE);
1858
1859 struct snd_interval *channels = hw_param_interval(params,
1860 SNDRV_PCM_HW_PARAM_CHANNELS);
1861
1862 rate->min = rate->max = msm8952_auxpcm_rate;
1863 channels->min = channels->max = 1;
1864
1865 return 0;
1866}
1867
1868int msm_btsco_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
1869 struct snd_pcm_hw_params *params)
1870{
1871 struct snd_interval *rate = hw_param_interval(params,
1872 SNDRV_PCM_HW_PARAM_RATE);
1873
1874 struct snd_interval *channels = hw_param_interval(params,
1875 SNDRV_PCM_HW_PARAM_CHANNELS);
1876
1877 rate->min = rate->max = msm_btsco_rate;
1878 channels->min = channels->max = msm_btsco_ch;
1879
1880 return 0;
1881}
1882
1883int msm_proxy_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
1884 struct snd_pcm_hw_params *params)
1885{
1886 struct snd_interval *rate = hw_param_interval(params,
1887 SNDRV_PCM_HW_PARAM_RATE);
1888
1889 struct snd_interval *channels = hw_param_interval(params,
1890 SNDRV_PCM_HW_PARAM_CHANNELS);
1891
1892 pr_debug("%s: msm_proxy_rx_ch =%d\n", __func__, msm_proxy_rx_ch);
1893
1894 if (channels->max < 2)
1895 channels->min = channels->max = 2;
1896 channels->min = channels->max = msm_proxy_rx_ch;
1897 rate->min = rate->max = 48000;
1898 return 0;
1899}
1900
1901int msm_proxy_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
1902 struct snd_pcm_hw_params *params)
1903{
1904 struct snd_interval *rate = hw_param_interval(params,
1905 SNDRV_PCM_HW_PARAM_RATE);
1906
1907 rate->min = rate->max = 48000;
1908 return 0;
1909}
1910
1911int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
1912 struct snd_pcm_hw_params *params)
1913{
1914 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
1915 struct snd_interval *rate = hw_param_interval(params,
1916 SNDRV_PCM_HW_PARAM_RATE);
1917 struct snd_interval *channels = hw_param_interval(params,
1918 SNDRV_PCM_HW_PARAM_CHANNELS);
1919
1920 switch (cpu_dai->id) {
1921 case AFE_PORT_ID_PRIMARY_TDM_RX:
1922 channels->min = channels->max = msm_pri_tdm_rx_0_ch;
1923 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
1924 msm_pri_tdm_rx_0_bit_format);
1925 rate->min = rate->max = msm_pri_tdm_rx_0_sample_rate;
1926 break;
1927 case AFE_PORT_ID_PRIMARY_TDM_TX:
1928 channels->min = channels->max = msm_pri_tdm_tx_0_ch;
1929 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
1930 msm_pri_tdm_tx_0_bit_format);
1931 rate->min = rate->max = msm_pri_tdm_tx_0_sample_rate;
1932 break;
1933 case AFE_PORT_ID_SECONDARY_TDM_RX:
1934 channels->min = channels->max = msm_sec_tdm_rx_0_ch;
1935 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
1936 msm_sec_tdm_rx_0_bit_format);
1937 rate->min = rate->max = msm_sec_tdm_rx_0_sample_rate;
1938 break;
1939 case AFE_PORT_ID_SECONDARY_TDM_TX:
1940 channels->min = channels->max = msm_sec_tdm_tx_0_ch;
1941 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
1942 msm_sec_tdm_tx_0_bit_format);
1943 rate->min = rate->max = msm_sec_tdm_tx_0_sample_rate;
1944 break;
1945 default:
1946 pr_err("%s: dai id 0x%x not supported\n",
1947 __func__, cpu_dai->id);
1948 return -EINVAL;
1949 }
1950
1951 pr_debug("%s: dai id = 0x%x channels = %d rate = %d\n",
1952 __func__, cpu_dai->id, channels->max, rate->max);
1953
1954 return 0;
1955}
1956
1957static unsigned int tdm_param_set_slot_mask(u16 port_id,
1958 int slot_width, int slots)
1959{
1960 unsigned int slot_mask = 0;
1961 int upper, lower, i, j;
1962 unsigned int *slot_offset;
1963
1964 switch (port_id) {
1965 case AFE_PORT_ID_PRIMARY_TDM_RX:
1966 lower = PRIMARY_TDM_RX_0;
1967 upper = PRIMARY_TDM_RX_0;
1968 break;
1969 case AFE_PORT_ID_PRIMARY_TDM_TX:
1970 lower = PRIMARY_TDM_TX_0;
1971 upper = PRIMARY_TDM_TX_0;
1972 break;
1973 case AFE_PORT_ID_SECONDARY_TDM_RX:
1974 lower = SECONDARY_TDM_RX_0;
1975 upper = SECONDARY_TDM_RX_0;
1976 break;
1977 case AFE_PORT_ID_SECONDARY_TDM_TX:
1978 lower = SECONDARY_TDM_TX_0;
1979 upper = SECONDARY_TDM_TX_0;
1980 break;
1981 default:
1982 return slot_mask;
1983 }
1984
1985 for (i = lower; i <= upper; i++) {
1986 slot_offset = tdm_slot_offset[i];
1987 for (j = 0; j < TDM_SLOT_OFFSET_MAX; j++) {
1988 if (slot_offset[j] != AFE_SLOT_MAPPING_OFFSET_INVALID)
1989 /*
1990 * set the mask of active slot according to
1991 * the offset table for the group of devices
1992 */
1993 slot_mask |=
1994 (1 << ((slot_offset[j] * 8) / slot_width));
1995 else
1996 break;
1997 }
1998 }
1999
2000 return slot_mask;
2001}
2002
2003int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream,
2004 struct snd_pcm_hw_params *params)
2005{
2006 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2007 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2008 int ret = 0;
2009 int channels, slot_width, slots;
2010 unsigned int slot_mask;
2011 unsigned int *slot_offset;
2012 int offset_channels = 0;
2013 int i;
2014
2015 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
2016
2017 channels = params_channels(params);
2018 switch (channels) {
2019 case 1:
2020 case 2:
2021 case 3:
2022 case 4:
2023 case 6:
2024 case 8:
2025 switch (params_format(params)) {
2026 case SNDRV_PCM_FORMAT_S32_LE:
2027 case SNDRV_PCM_FORMAT_S24_LE:
2028 case SNDRV_PCM_FORMAT_S16_LE:
2029 /*
2030 * up to 8 channel HW configuration should
2031 * use 32 bit slot width for max support of
2032 * stream bit width. (slot_width > bit_width)
2033 */
2034 slot_width = 32;
2035 break;
2036 default:
2037 pr_err("%s: invalid param format 0x%x\n",
2038 __func__, params_format(params));
2039 return -EINVAL;
2040 }
2041 slots = 8;
2042 slot_mask = tdm_param_set_slot_mask(cpu_dai->id,
2043 slot_width, slots);
2044 if (!slot_mask) {
2045 pr_err("%s: invalid slot_mask 0x%x\n",
2046 __func__, slot_mask);
2047 return -EINVAL;
2048 }
2049 break;
2050 default:
2051 pr_err("%s: invalid param channels %d\n",
2052 __func__, channels);
2053 return -EINVAL;
2054 }
2055
2056 switch (cpu_dai->id) {
2057 case AFE_PORT_ID_PRIMARY_TDM_RX:
2058 slot_offset = tdm_slot_offset[PRIMARY_TDM_RX_0];
2059 break;
2060 case AFE_PORT_ID_PRIMARY_TDM_TX:
2061 slot_offset = tdm_slot_offset[PRIMARY_TDM_TX_0];
2062 break;
2063 case AFE_PORT_ID_SECONDARY_TDM_RX:
2064 slot_offset = tdm_slot_offset[SECONDARY_TDM_RX_0];
2065 break;
2066 case AFE_PORT_ID_SECONDARY_TDM_TX:
2067 slot_offset = tdm_slot_offset[SECONDARY_TDM_TX_0];
2068 break;
2069 default:
2070 pr_err("%s: dai id 0x%x not supported\n",
2071 __func__, cpu_dai->id);
2072 return -EINVAL;
2073 }
2074
2075 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
2076 if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
2077 offset_channels++;
2078 else
2079 break;
2080 }
2081
2082 if (offset_channels == 0) {
2083 pr_err("%s: slot offset not supported, offset_channels %d\n",
2084 __func__, offset_channels);
2085 return -EINVAL;
2086 }
2087
2088 if (channels > offset_channels) {
2089 pr_err("%s: channels %d exceed offset_channels %d\n",
2090 __func__, channels, offset_channels);
2091 return -EINVAL;
2092 }
2093
2094 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2095 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
2096 slots, slot_width);
2097 if (ret < 0) {
2098 pr_err("%s: failed to set tdm slot, err:%d\n",
2099 __func__, ret);
2100 goto end;
2101 }
2102
2103 ret = snd_soc_dai_set_channel_map(cpu_dai,
2104 0, NULL, channels, slot_offset);
2105 if (ret < 0) {
2106 pr_err("%s: failed to set channel map, err:%d\n",
2107 __func__, ret);
2108 goto end;
2109 }
2110 } else {
2111 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
2112 slots, slot_width);
2113 if (ret < 0) {
2114 pr_err("%s: failed to set tdm slot, err:%d\n",
2115 __func__, ret);
2116 goto end;
2117 }
2118
2119 ret = snd_soc_dai_set_channel_map(cpu_dai,
2120 channels, slot_offset, 0, NULL);
2121 if (ret < 0) {
2122 pr_err("%s: failed to set channel map, err:%d\n",
2123 __func__, ret);
2124 goto end;
2125 }
2126 }
2127
2128end:
2129 return ret;
2130}
2131
2132int msm_mi2s_snd_hw_params(struct snd_pcm_substream *substream,
2133 struct snd_pcm_hw_params *params)
2134{
2135 pr_debug("%s(): substream = %s stream = %d\n", __func__,
2136 substream->name, substream->stream);
2137 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT, mi2s_rx_bit_format);
2138 return 0;
2139}
2140
2141int msm_snd_hw_params(struct snd_pcm_substream *substream,
2142 struct snd_pcm_hw_params *params)
2143{
2144 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2145 struct snd_soc_dai *codec_dai = rtd->codec_dai;
2146 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2147 struct snd_soc_dai_link *dai_link = rtd->dai_link;
2148
2149 int ret = 0;
2150 u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
2151 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
2152 u32 user_set_tx_ch = 0;
2153 u32 rx_ch_count;
2154
2155 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2156 ret = snd_soc_dai_get_channel_map(codec_dai,
2157 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
2158 if (ret < 0) {
2159 pr_err("%s: failed to get codec chan map, err:%d\n",
2160 __func__, ret);
2161 goto end;
2162 }
2163 if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_RX) {
2164 pr_debug("%s: rx_4_ch=%d\n", __func__,
2165 msm_slim_4_rx_ch);
2166 rx_ch_count = msm_slim_4_rx_ch;
2167 } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) {
2168 pr_debug("%s: rx_5_ch=%d\n", __func__,
2169 msm_slim_5_rx_ch);
2170 rx_ch_count = msm_slim_5_rx_ch;
2171 } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) {
2172 pr_debug("%s: rx_6_ch=%d\n", __func__,
2173 msm_slim_6_rx_ch);
2174 rx_ch_count = msm_slim_6_rx_ch;
2175 } else {
2176 pr_debug("%s: rx_0_ch=%d\n", __func__,
2177 msm_slim_0_rx_ch);
2178 rx_ch_count = msm_slim_0_rx_ch;
2179 }
2180 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
2181 rx_ch_count, rx_ch);
2182 if (ret < 0) {
2183 pr_err("%s: failed to set cpu chan map, err:%d\n",
2184 __func__, ret);
2185 goto end;
2186 }
2187 } else {
2188 pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__,
2189 codec_dai->name, codec_dai->id, user_set_tx_ch);
2190 ret = snd_soc_dai_get_channel_map(codec_dai,
2191 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
2192 if (ret < 0) {
2193 pr_err("%s: failed to get codec chan map\n, err:%d\n",
2194 __func__, ret);
2195 goto end;
2196 }
2197 /* For <codec>_tx1 case */
2198 if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX)
2199 user_set_tx_ch = msm_slim_0_tx_ch;
2200 /* For <codec>_tx2 case */
2201 else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX)
2202 user_set_tx_ch = msm_slim_1_tx_ch;
2203 else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_TX)
2204 user_set_tx_ch = msm_slim_2_tx_ch;
2205 else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_3_TX)
2206 /* DAI 5 is used for external EC reference from codec.
2207 * Since Rx is fed as reference for EC, the config of
2208 * this DAI is based on that of the Rx path.
2209 */
2210 user_set_tx_ch = msm_slim_0_rx_ch;
2211 else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX)
2212 user_set_tx_ch = msm_vi_feed_tx_ch;
2213 else
2214 user_set_tx_ch = tx_ch_cnt;
2215
2216 pr_debug(
2217 "%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d)\n",
2218 __func__, msm_slim_0_tx_ch, user_set_tx_ch, tx_ch_cnt);
2219
2220 ret = snd_soc_dai_set_channel_map(cpu_dai,
2221 user_set_tx_ch, tx_ch, 0, 0);
2222 if (ret < 0) {
2223 pr_err("%s: failed to set cpu chan map, err:%d\n",
2224 __func__, ret);
2225 goto end;
2226 }
2227 }
2228end:
2229 return ret;
2230}
2231
2232int msm8952_slimbus_2_hw_params(struct snd_pcm_substream *substream,
2233 struct snd_pcm_hw_params *params)
2234{
2235 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2236 struct snd_soc_dai *codec_dai = rtd->codec_dai;
2237 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2238 int ret = 0;
2239 unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
2240 unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0;
2241 unsigned int num_tx_ch = 0;
2242 unsigned int num_rx_ch = 0;
2243
2244 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2245 num_rx_ch = params_channels(params);
2246 pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__,
2247 codec_dai->name, codec_dai->id, num_rx_ch);
2248 ret = snd_soc_dai_get_channel_map(codec_dai,
2249 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
2250 if (ret < 0) {
2251 pr_err("%s: failed to get codec chan map, err:%d\n",
2252 __func__, ret);
2253 goto end;
2254 }
2255 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
2256 num_rx_ch, rx_ch);
2257 if (ret < 0) {
2258 pr_err("%s: failed to set cpu chan map, err:%d\n",
2259 __func__, ret);
2260 goto end;
2261 }
2262 } else {
2263 num_tx_ch = params_channels(params);
2264 pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__,
2265 codec_dai->name, codec_dai->id, num_tx_ch);
2266 ret = snd_soc_dai_get_channel_map(codec_dai,
2267 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
2268 if (ret < 0) {
2269 pr_err("%s: failed to get codec chan map, err:%d\n",
2270 __func__, ret);
2271 goto end;
2272 }
2273 ret = snd_soc_dai_set_channel_map(cpu_dai,
2274 num_tx_ch, tx_ch, 0, 0);
2275 if (ret < 0) {
2276 pr_err("%s: failed to set cpu chan map, err:%d\n",
2277 __func__, ret);
2278 goto end;
2279 }
2280 }
2281end:
2282 return ret;
2283}
2284
2285int msm_slim_0_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2286 struct snd_pcm_hw_params *params)
2287{
2288 struct snd_interval *rate = hw_param_interval(params,
2289 SNDRV_PCM_HW_PARAM_RATE);
2290
2291 struct snd_interval *channels =
2292 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
2293
2294 pr_debug("%s()\n", __func__);
2295 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2296 slim0_rx_bit_format);
2297 rate->min = rate->max = slim0_rx_sample_rate;
2298 channels->min = channels->max = msm_slim_0_rx_ch;
2299
2300 pr_debug("%s: format = %d, rate = %d, channels = %d\n",
2301 __func__, params_format(params), params_rate(params),
2302 msm_slim_0_rx_ch);
2303
2304 return 0;
2305}
2306
2307int msm_slim_0_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2308 struct snd_pcm_hw_params *params)
2309{
2310 struct snd_interval *rate = hw_param_interval(params,
2311 SNDRV_PCM_HW_PARAM_RATE);
2312
2313 struct snd_interval *channels = hw_param_interval(params,
2314 SNDRV_PCM_HW_PARAM_CHANNELS);
2315
2316 pr_debug("%s()\n", __func__);
2317 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2318 slim0_tx_bit_format);
2319 rate->min = rate->max = slim0_tx_sample_rate;
2320 channels->min = channels->max = msm_slim_0_tx_ch;
2321
2322 return 0;
2323}
2324
2325int msm_slim_1_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2326 struct snd_pcm_hw_params *params)
2327{
2328 struct snd_interval *rate = hw_param_interval(params,
2329 SNDRV_PCM_HW_PARAM_RATE);
2330
2331 struct snd_interval *channels = hw_param_interval(params,
2332 SNDRV_PCM_HW_PARAM_CHANNELS);
2333
2334 pr_debug("%s()\n", __func__);
2335 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2336 slim1_tx_bit_format);
2337 rate->min = rate->max = slim1_tx_sample_rate;
2338 channels->min = channels->max = msm_slim_1_tx_ch;
2339
2340 return 0;
2341}
2342
2343int msm_slim_2_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2344 struct snd_pcm_hw_params *params)
2345{
2346 struct snd_interval *rate = hw_param_interval(params,
2347 SNDRV_PCM_HW_PARAM_RATE);
2348
2349 struct snd_interval *channels = hw_param_interval(params,
2350 SNDRV_PCM_HW_PARAM_CHANNELS);
2351
2352 pr_debug("%s()\n", __func__);
2353 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2354 slim2_tx_bit_format);
2355 rate->min = rate->max = slim2_tx_sample_rate;
2356 channels->min = channels->max = msm_slim_2_tx_ch;
2357
2358 return 0;
2359}
2360
2361int msm_slim_4_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2362 struct snd_pcm_hw_params *params)
2363{
2364 struct snd_interval *rate = hw_param_interval(params,
2365 SNDRV_PCM_HW_PARAM_RATE);
2366
2367 struct snd_interval *channels =
2368 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
2369
2370 pr_debug("%s()\n", __func__);
2371 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2372 slim4_rx_bit_format);
2373 rate->min = rate->max = slim4_rx_sample_rate;
2374 channels->min = channels->max = msm_slim_4_rx_ch;
2375
2376 pr_debug("%s: format = %d, rate = %d, channels = %d\n",
2377 __func__, params_format(params), params_rate(params),
2378 msm_slim_4_rx_ch);
2379
2380 return 0;
2381}
2382
2383int msm_slim_4_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2384 struct snd_pcm_hw_params *params)
2385{
2386 struct snd_interval *rate = hw_param_interval(params,
2387 SNDRV_PCM_HW_PARAM_RATE);
2388
2389 struct snd_interval *channels = hw_param_interval(params,
2390 SNDRV_PCM_HW_PARAM_CHANNELS);
2391
2392 struct snd_soc_dai *codec_dai = rtd->codec_dai;
2393
2394 pr_debug("%s: codec name: %s", __func__, codec_dai->name);
2395 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
2396 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2397 SNDRV_PCM_FORMAT_S32_LE);
2398 rate->min = rate->max = SAMPLING_RATE_8KHZ;
2399 channels->min = channels->max = msm_vi_feed_tx_ch;
2400 pr_debug("%s: tasha vi sample rate = %d\n",
2401 __func__, rate->min);
2402 } else {
2403 rate->min = rate->max = SAMPLING_RATE_48KHZ;
2404 channels->min = channels->max = msm_vi_feed_tx_ch;
2405 pr_debug("%s: default sample rate = %d\n",
2406 __func__, rate->min);
2407 }
2408
2409 pr_debug("%s: %d\n", __func__, msm_vi_feed_tx_ch);
2410 return 0;
2411}
2412
2413int msm_slim_5_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2414 struct snd_pcm_hw_params *params)
2415{
2416 struct snd_interval *rate = hw_param_interval(params,
2417 SNDRV_PCM_HW_PARAM_RATE);
2418 struct snd_interval *channels = hw_param_interval(params,
2419 SNDRV_PCM_HW_PARAM_CHANNELS);
2420
2421 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2422 slim5_rx_bit_format);
2423 rate->min = rate->max = slim5_rx_sample_rate;
2424 channels->min = channels->max = msm_slim_5_rx_ch;
2425
2426 pr_debug("%s: format = %d, rate = %d, channels = %d\n",
2427 __func__, params_format(params), params_rate(params),
2428 msm_slim_5_rx_ch);
2429
2430 return 0;
2431}
2432
2433int msm_slim_6_rx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2434 struct snd_pcm_hw_params *params)
2435{
2436 struct snd_interval *rate = hw_param_interval(params,
2437 SNDRV_PCM_HW_PARAM_RATE);
2438 struct snd_interval *channels = hw_param_interval(params,
2439 SNDRV_PCM_HW_PARAM_CHANNELS);
2440
2441 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
2442 slim6_rx_bit_format);
2443 rate->min = rate->max = slim6_rx_sample_rate;
2444 channels->min = channels->max = msm_slim_6_rx_ch;
2445
2446 pr_debug("%s: format = %d, rate = %d, channels = %d\n",
2447 __func__, params_format(params), params_rate(params),
2448 msm_slim_6_rx_ch);
2449
2450 return 0;
2451}
2452
2453int msm_slim_5_tx_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
2454 struct snd_pcm_hw_params *params)
2455{
2456 int rc;
2457 void *config;
2458 struct snd_soc_codec *codec = rtd->codec;
2459 struct snd_interval *rate =
2460 hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
2461 struct snd_interval *channels =
2462 hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
2463 struct snd_soc_card *card = codec->component.card;
2464 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2465
2466 pr_debug("%s enter\n", __func__);
2467
2468 rate->min = rate->max = 16000;
2469 channels->min = channels->max = 1;
2470 config = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2471 AFE_SLIMBUS_SLAVE_PORT_CONFIG);
2472 rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG, config,
2473 SLIMBUS_5_TX);
2474 if (rc) {
2475 pr_err("%s: Failed to set slimbus slave port config %d\n",
2476 __func__, rc);
2477 return rc;
2478 }
2479 return 0;
2480}
2481
2482int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream,
2483 struct snd_pcm_hw_params *params)
2484{
2485 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2486 struct snd_soc_dai *codec_dai = rtd->codec_dai;
2487 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2488 struct snd_soc_dai_link *dai_link = rtd->dai_link;
2489 int ret = 0;
2490 u32 tx_ch[SLIM_MAX_TX_PORTS];
2491 u32 tx_ch_cnt = 0;
2492 u32 user_set_tx_ch = 0;
2493
2494 if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) {
2495 pr_err("%s: Invalid stream type %d\n",
2496 __func__, substream->stream);
2497 ret = -EINVAL;
2498 goto end;
2499 }
2500
2501 pr_debug("%s: %s_tx_dai_id_%d\n", __func__,
2502 codec_dai->name, codec_dai->id);
2503 ret = snd_soc_dai_get_channel_map(codec_dai,
2504 &tx_ch_cnt, tx_ch, NULL, NULL);
2505 if (ret < 0) {
2506 pr_err("%s: failed to get codec chan map\n, err:%d\n",
2507 __func__, ret);
2508 goto end;
2509 }
2510
2511 user_set_tx_ch = tx_ch_cnt;
2512
2513 pr_debug("%s: tx_ch_cnt(%d) id %d\n",
2514 __func__, tx_ch_cnt, dai_link->id);
2515
2516 ret = snd_soc_dai_set_channel_map(cpu_dai,
2517 user_set_tx_ch, tx_ch, 0, 0);
2518 if (ret < 0) {
2519 pr_err("%s: failed to set cpu chan map, err:%d\n",
2520 __func__, ret);
2521 goto end;
2522 }
2523end:
2524 return ret;
2525}
2526
2527static int msm_afe_set_config(struct snd_soc_codec *codec)
2528{
2529 int rc;
2530 void *config_data;
2531 struct snd_soc_card *card = codec->component.card;
2532 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2533
2534 pr_debug("%s: enter\n", __func__);
2535
2536 if (!pdata->msm8952_codec_fn.get_afe_config_fn) {
2537 dev_err(codec->dev, "%s: codec get afe config not init'ed\n",
2538 __func__);
2539 return -EINVAL;
2540 }
2541 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2542 AFE_CDC_REGISTERS_CONFIG);
2543 if (config_data) {
2544 rc = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0);
2545 if (rc) {
2546 pr_err("%s: Failed to set codec registers config %d\n",
2547 __func__, rc);
2548 return rc;
2549 }
2550 }
2551
2552 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2553 AFE_CDC_REGISTER_PAGE_CONFIG);
2554 if (config_data) {
2555 rc = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data,
2556 0);
2557 if (rc)
2558 pr_err("%s: Failed to set cdc register page config\n",
2559 __func__);
2560 }
2561
2562 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2563 AFE_SLIMBUS_SLAVE_CONFIG);
2564 if (config_data) {
2565 rc = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0);
2566 if (rc) {
2567 pr_err("%s: Failed to set slimbus slave config %d\n",
2568 __func__, rc);
2569 return rc;
2570 }
2571 }
2572
2573 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2574 AFE_AANC_VERSION);
2575 if (config_data) {
2576 rc = afe_set_config(AFE_AANC_VERSION, config_data, 0);
2577 if (rc) {
2578 pr_err("%s: Failed to set AANC version %d\n",
2579 __func__, rc);
2580 return rc;
2581 }
2582 }
2583
2584 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2585 AFE_CDC_CLIP_REGISTERS_CONFIG);
2586 if (config_data) {
2587 rc = afe_set_config(AFE_CDC_CLIP_REGISTERS_CONFIG,
2588 config_data, 0);
2589 if (rc) {
2590 pr_err("%s: Failed to set clip registers %d\n",
2591 __func__, rc);
2592 return rc;
2593 }
2594 }
2595
2596 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2597 AFE_CLIP_BANK_SEL);
2598 if (config_data) {
2599 rc = afe_set_config(AFE_CLIP_BANK_SEL,
2600 config_data, 0);
2601 if (rc) {
2602 pr_err("%s: Failed to set AFE bank selection %d\n",
2603 __func__, rc);
2604 return rc;
2605 }
2606 }
2607
2608 config_data = pdata->msm8952_codec_fn.get_afe_config_fn(codec,
2609 AFE_CDC_REGISTER_PAGE_CONFIG);
2610 if (config_data) {
2611 rc = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data,
2612 0);
2613 if (rc)
2614 pr_err("%s: Failed to set cdc register page config\n",
2615 __func__);
2616 }
2617
2618 return 0;
2619}
2620
2621static void msm_afe_clear_config(void)
2622{
2623 afe_clear_config(AFE_CDC_REGISTERS_CONFIG);
2624 afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
2625}
2626
2627static int quat_mi2s_clk_ctl(struct snd_pcm_substream *substream, bool enable)
2628{
2629 int ret = 0;
2630
2631 if (enable) {
2632 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2633 mi2s_rx_clk.enable = enable;
2634 mi2s_rx_clk.clk_id =
2635 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT;
2636 if ((mi2s_rx_bit_format == SNDRV_PCM_FORMAT_S24_LE) ||
2637 (mi2s_rx_bit_format ==
2638 SNDRV_PCM_FORMAT_S24_3LE))
2639 mi2s_rx_clk.clk_freq_in_hz =
2640 Q6AFE_LPASS_IBIT_CLK_3_P072_MHZ;
2641 else
2642 mi2s_rx_clk.clk_freq_in_hz =
2643 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ;
2644 ret = afe_set_lpass_clock_v2(
2645 AFE_PORT_ID_QUATERNARY_MI2S_RX,
2646 &mi2s_rx_clk);
2647 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
2648 mi2s_tx_clk.enable = enable;
2649 mi2s_tx_clk.clk_id =
2650 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT;
2651 mi2s_tx_clk.clk_freq_in_hz =
2652 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ;
2653 ret = afe_set_lpass_clock_v2(
2654 AFE_PORT_ID_QUATERNARY_MI2S_TX,
2655 &mi2s_tx_clk);
2656 } else {
2657 pr_err("%s:Not valid substream.\n", __func__);
2658 }
2659
2660 if (ret < 0)
2661 pr_err("%s:afe_set_lpass_clock failed %d\n",
2662 __func__, ret);
2663 } else {
2664 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2665 mi2s_rx_clk.enable = enable;
2666 mi2s_rx_clk.clk_id =
2667 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT;
2668 ret = afe_set_lpass_clock_v2(
2669 AFE_PORT_ID_QUATERNARY_MI2S_RX,
2670 &mi2s_rx_clk);
2671 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
2672 mi2s_tx_clk.enable = enable;
2673 mi2s_tx_clk.clk_id =
2674 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT;
2675 ret = afe_set_lpass_clock_v2(
2676 AFE_PORT_ID_QUATERNARY_MI2S_TX,
2677 &mi2s_tx_clk);
2678 } else
2679 pr_err("%s:Not valid substream %d\n", __func__,
2680 substream->stream);
2681
2682 if (ret < 0)
2683 pr_err("%s:afe_set_lpass_clock failed ret=%d\n",
2684 __func__, ret);
2685 }
2686 return ret;
2687}
2688
2689static int quin_mi2s_sclk_ctl(struct snd_pcm_substream *substream, bool enable)
2690{
2691 int ret = 0;
2692
2693 if (enable) {
2694 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2695 mi2s_rx_clk.enable = enable;
2696 mi2s_rx_clk.clk_id =
2697 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT;
2698 if ((mi2s_rx_bit_format == SNDRV_PCM_FORMAT_S24_LE) ||
2699 (mi2s_rx_bit_format ==
2700 SNDRV_PCM_FORMAT_S24_3LE))
2701 mi2s_rx_clk.clk_freq_in_hz =
2702 Q6AFE_LPASS_IBIT_CLK_3_P072_MHZ;
2703 else
2704 mi2s_rx_clk.clk_freq_in_hz =
2705 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ;
2706 ret = afe_set_lpass_clock_v2(
2707 AFE_PORT_ID_QUINARY_MI2S_RX,
2708 &mi2s_rx_clk);
2709 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
2710 mi2s_tx_clk.enable = enable;
2711 mi2s_tx_clk.clk_id =
2712 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT;
2713 mi2s_tx_clk.clk_freq_in_hz =
2714 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ;
2715 ret = afe_set_lpass_clock_v2(
2716 AFE_PORT_ID_QUINARY_MI2S_TX,
2717 &mi2s_tx_clk);
2718 } else {
2719 pr_err("%s:Not valid substream.\n", __func__);
2720 }
2721
2722 if (ret < 0)
2723 pr_err("%s:afe_set_lpass_clock failed\n", __func__);
2724 } else {
2725 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2726 mi2s_rx_clk.enable = enable;
2727 mi2s_rx_clk.clk_id =
2728 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT;
2729 ret = afe_set_lpass_clock_v2(
2730 AFE_PORT_ID_QUINARY_MI2S_RX,
2731 &mi2s_rx_clk);
2732 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
2733 mi2s_tx_clk.enable = enable;
2734 mi2s_tx_clk.clk_id =
2735 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT;
2736 ret = afe_set_lpass_clock_v2(
2737 AFE_PORT_ID_QUINARY_MI2S_TX,
2738 &mi2s_tx_clk);
2739 } else
2740 pr_err("%s:Not valid substream %d\n", __func__,
2741 substream->stream);
2742
2743 if (ret < 0)
2744 pr_err("%s:afe_set_lpass_clock failed ret=%d\n",
2745 __func__, ret);
2746 }
2747 return ret;
2748}
2749
2750static int msm8952_adsp_state_callback(struct notifier_block *nb,
2751 unsigned long value, void *priv)
2752{
2753 if (value == SUBSYS_BEFORE_SHUTDOWN) {
2754 pr_debug("%s: ADSP is about to shutdown. Clearing AFE config\n",
2755 __func__);
2756 msm_afe_clear_config();
2757 } else if (value == SUBSYS_AFTER_POWERUP) {
2758 pr_debug("%s: ADSP is up\n", __func__);
2759 }
2760
2761 return NOTIFY_OK;
2762}
2763
2764static struct notifier_block adsp_state_notifier_block = {
2765 .notifier_call = msm8952_adsp_state_callback,
2766 .priority = -INT_MAX,
2767};
2768
2769void msm_quat_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
2770{
2771 int ret = 0;
2772 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2773 struct snd_soc_card *card = rtd->card;
2774 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2775
2776 pr_debug("%s(): substream = %s stream = %d, ext_pa = %d\n", __func__,
2777 substream->name, substream->stream, pdata->ext_pa);
2778
2779 ret = quat_mi2s_clk_ctl(substream, false);
2780 if (ret < 0)
2781 pr_err("%s:clock disable failed\n", __func__);
2782 if (atomic_read(&pdata->clk_ref.quat_mi2s_clk_ref) > 0)
2783 atomic_dec(&pdata->clk_ref.quat_mi2s_clk_ref);
2784 if (pdata->mi2s_gpio_p[QUAT_MI2S]) {
2785 ret = msm_cdc_pinctrl_select_sleep_state(
2786 pdata->mi2s_gpio_p[QUAT_MI2S]);
2787 if (ret < 0) {
2788 pr_err("%s: failed to disable quat gpio's state\n",
2789 __func__);
2790 return;
2791 }
2792 }
2793}
2794
2795int msm_prim_auxpcm_startup(struct snd_pcm_substream *substream)
2796{
2797 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2798 struct snd_soc_card *card = rtd->card;
2799 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2800 int ret = 0, val = 0;
2801
2802 pr_debug("%s(): substream = %s\n",
2803 __func__, substream->name);
2804
2805 /* mux config to route the AUX MI2S */
2806 if (pdata->vaddr_gpio_mux_mic_ctl) {
2807 val = ioread32(pdata->vaddr_gpio_mux_mic_ctl);
2808 val = val | 0x2;
2809 iowrite32(val, pdata->vaddr_gpio_mux_mic_ctl);
2810 }
2811 if (pdata->vaddr_gpio_mux_pcm_ctl) {
2812 val = ioread32(pdata->vaddr_gpio_mux_pcm_ctl);
2813 val = val | 0x1;
2814 iowrite32(val, pdata->vaddr_gpio_mux_pcm_ctl);
2815 }
2816 atomic_inc(&pdata->clk_ref.auxpcm_mi2s_clk_ref);
2817
2818 /* enable the gpio's used for the external AUXPCM interface */
2819 if (pdata->mi2s_gpio_p[QUAT_MI2S]) {
2820 ret = msm_cdc_pinctrl_select_active_state(
2821 pdata->mi2s_gpio_p[QUAT_MI2S]);
2822 if (ret < 0)
2823 pr_err("%s(): configure gpios failed = %s\n",
2824 __func__, "quat_i2s");
2825 }
2826 return ret;
2827}
2828
2829void msm_prim_auxpcm_shutdown(struct snd_pcm_substream *substream)
2830{
2831 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2832 struct snd_soc_card *card = rtd->card;
2833 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2834 int ret;
2835
2836 pr_debug("%s(): substream = %s\n",
2837 __func__, substream->name);
2838 if (atomic_read(&pdata->clk_ref.auxpcm_mi2s_clk_ref) > 0)
2839 atomic_dec(&pdata->clk_ref.auxpcm_mi2s_clk_ref);
2840 if (pdata->mi2s_gpio_p[QUAT_MI2S]) {
2841 ret = msm_cdc_pinctrl_select_sleep_state(
2842 pdata->mi2s_gpio_p[QUAT_MI2S]);
2843 if (ret < 0)
2844 pr_err("%s(): configure gpios failed = %s\n",
2845 __func__, "quat_i2s");
2846 }
2847}
2848
2849int msm_quat_mi2s_snd_startup(struct snd_pcm_substream *substream)
2850{
2851 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2852 struct snd_soc_card *card = rtd->card;
2853 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2854 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2855 int ret = 0, val;
2856
2857 pr_debug("%s(): substream = %s stream = %d\n", __func__,
2858 substream->name, substream->stream);
2859
2860 /* Configure mux for quaternary i2s */
2861 if (pdata->vaddr_gpio_mux_mic_ctl) {
2862 val = ioread32(pdata->vaddr_gpio_mux_mic_ctl);
2863 val = val | 0x02020002;
2864 iowrite32(val, pdata->vaddr_gpio_mux_mic_ctl);
2865 }
2866 ret = quat_mi2s_clk_ctl(substream, true);
2867 if (ret < 0) {
2868 pr_err("%s: failed to enable bit clock\n",
2869 __func__);
2870 return ret;
2871 }
2872
2873 if (pdata->mi2s_gpio_p[QUAT_MI2S]) {
2874 ret = msm_cdc_pinctrl_select_active_state(
2875 pdata->mi2s_gpio_p[QUAT_MI2S]);
2876 if (ret < 0) {
2877 pr_err("%s: failed to actiavte the quat gpio's state\n",
2878 __func__);
2879 goto err;
2880 }
2881 }
2882
2883 if (atomic_inc_return(&pdata->clk_ref.quat_mi2s_clk_ref) == 1) {
2884 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
2885 if (ret < 0)
2886 pr_err("%s: set fmt cpu dai failed\n", __func__);
2887 }
2888 return ret;
2889
2890err:
2891 ret = quat_mi2s_clk_ctl(substream, false);
2892 if (ret < 0)
2893 pr_err("%s:failed to disable sclk\n", __func__);
2894 return ret;
2895}
2896
2897int msm_quin_mi2s_snd_startup(struct snd_pcm_substream *substream)
2898{
2899 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2900 struct snd_soc_card *card = rtd->card;
2901 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2902 struct msm8952_asoc_mach_data *pdata =
2903 snd_soc_card_get_drvdata(card);
2904 int ret = 0, val = 0;
2905
2906 pr_debug("%s(): substream = %s stream = %d\n", __func__,
2907 substream->name, substream->stream);
2908 if (pdata->vaddr_gpio_mux_quin_ctl) {
2909 val = ioread32(pdata->vaddr_gpio_mux_quin_ctl);
2910 val = val | 0x00000001;
2911 iowrite32(val, pdata->vaddr_gpio_mux_quin_ctl);
2912 } else {
2913 return -EINVAL;
2914 }
2915 ret = quin_mi2s_sclk_ctl(substream, true);
2916 if (ret < 0) {
2917 pr_err("failed to enable sclk\n");
2918 return ret;
2919 }
2920 if (pdata->mi2s_gpio_p[QUIN_MI2S]) {
2921 ret = msm_cdc_pinctrl_select_active_state(
2922 pdata->mi2s_gpio_p[QUIN_MI2S]);
2923 if (ret < 0) {
2924 pr_err("failed to enable codec gpios\n");
2925 goto err;
2926 }
2927 }
2928
2929 if (atomic_inc_return(&pdata->clk_ref.quin_mi2s_clk_ref) == 1) {
2930 ret = snd_soc_dai_set_fmt(cpu_dai, SND_SOC_DAIFMT_CBS_CFS);
2931 if (ret < 0)
2932 pr_debug("%s: set fmt cpu dai failed\n", __func__);
2933 }
2934 return ret;
2935err:
2936 ret = quin_mi2s_sclk_ctl(substream, false);
2937 if (ret < 0)
2938 pr_err("failed to disable sclk\n");
2939 return ret;
2940}
2941
2942void msm_quin_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
2943{
2944 int ret;
2945 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2946 struct snd_soc_card *card = rtd->card;
2947 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
2948
2949 pr_debug("%s(): substream = %s stream = %d\n", __func__,
2950 substream->name, substream->stream);
2951 ret = quin_mi2s_sclk_ctl(substream, false);
2952 if (ret < 0)
2953 pr_err("%s:clock disable failed\n", __func__);
2954 if (atomic_read(&pdata->clk_ref.quin_mi2s_clk_ref) > 0)
2955 atomic_dec(&pdata->clk_ref.quin_mi2s_clk_ref);
2956 if (pdata->mi2s_gpio_p[QUIN_MI2S]) {
2957 ret = msm_cdc_pinctrl_select_sleep_state(
2958 pdata->mi2s_gpio_p[QUIN_MI2S]);
2959 if (ret < 0) {
2960 pr_err("%s: gpio set cannot be de-activated %sd",
2961 __func__, "quin_i2s");
2962 return;
2963 }
2964 }
2965}
2966
2967int msm_tdm_startup(struct snd_pcm_substream *substream)
2968{
2969 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2970 struct snd_soc_card *card = rtd->card;
2971 struct msm8952_asoc_mach_data *pdata =
2972 snd_soc_card_get_drvdata(card);
2973 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2974 int ret = 0, val = 0;
2975
2976 pr_debug("%s(): substream = %s stream = %d\n", __func__,
2977 substream->name, substream->stream);
2978 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
2979
2980 switch (cpu_dai->id) {
2981 case AFE_PORT_ID_PRIMARY_TDM_RX:
2982 case AFE_PORT_ID_PRIMARY_TDM_RX_1:
2983 case AFE_PORT_ID_PRIMARY_TDM_RX_2:
2984 case AFE_PORT_ID_PRIMARY_TDM_RX_3:
2985 case AFE_PORT_ID_PRIMARY_TDM_RX_4:
2986 case AFE_PORT_ID_PRIMARY_TDM_RX_5:
2987 case AFE_PORT_ID_PRIMARY_TDM_RX_6:
2988 case AFE_PORT_ID_PRIMARY_TDM_RX_7:
2989 case AFE_PORT_ID_PRIMARY_TDM_TX:
2990 case AFE_PORT_ID_PRIMARY_TDM_TX_1:
2991 case AFE_PORT_ID_PRIMARY_TDM_TX_2:
2992 case AFE_PORT_ID_PRIMARY_TDM_TX_3:
2993 case AFE_PORT_ID_PRIMARY_TDM_TX_4:
2994 case AFE_PORT_ID_PRIMARY_TDM_TX_5:
2995 case AFE_PORT_ID_PRIMARY_TDM_TX_6:
2996 case AFE_PORT_ID_PRIMARY_TDM_TX_7:
2997 /* Configure mux for Primary TDM */
2998 if (pdata->vaddr_gpio_mux_pcm_ctl) {
2999 val = ioread32(pdata->vaddr_gpio_mux_pcm_ctl);
3000 val = val | 0x00000001;
3001 iowrite32(val, pdata->vaddr_gpio_mux_pcm_ctl);
3002 } else {
3003 return -EINVAL;
3004 }
3005
3006 if (pdata->vaddr_gpio_mux_mic_ctl) {
3007 val = ioread32(pdata->vaddr_gpio_mux_mic_ctl);
3008 val = val | 0x00000002;
3009 iowrite32(val, pdata->vaddr_gpio_mux_mic_ctl);
3010 } else {
3011 return -EINVAL;
3012 }
3013 if (pdata->mi2s_gpio_p[QUAT_MI2S]) {
3014 ret = msm_cdc_pinctrl_select_active_state(
3015 pdata->mi2s_gpio_p[QUAT_MI2S]);
3016 if (ret < 0)
3017 pr_err("%s: failed to activate pri TDM gpio\n",
3018 __func__);
3019 }
3020 break;
3021 case AFE_PORT_ID_SECONDARY_TDM_RX:
3022 case AFE_PORT_ID_SECONDARY_TDM_RX_1:
3023 case AFE_PORT_ID_SECONDARY_TDM_RX_2:
3024 case AFE_PORT_ID_SECONDARY_TDM_RX_3:
3025 case AFE_PORT_ID_SECONDARY_TDM_RX_4:
3026 case AFE_PORT_ID_SECONDARY_TDM_RX_5:
3027 case AFE_PORT_ID_SECONDARY_TDM_RX_6:
3028 case AFE_PORT_ID_SECONDARY_TDM_RX_7:
3029 case AFE_PORT_ID_SECONDARY_TDM_TX:
3030 case AFE_PORT_ID_SECONDARY_TDM_TX_1:
3031 case AFE_PORT_ID_SECONDARY_TDM_TX_2:
3032 case AFE_PORT_ID_SECONDARY_TDM_TX_3:
3033 case AFE_PORT_ID_SECONDARY_TDM_TX_4:
3034 case AFE_PORT_ID_SECONDARY_TDM_TX_5:
3035 case AFE_PORT_ID_SECONDARY_TDM_TX_6:
3036 case AFE_PORT_ID_SECONDARY_TDM_TX_7:
3037 /* Configure mux for Secondary TDM */
3038 if (pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl) {
3039 val = ioread32(
3040 pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl);
3041 val = val | 0x00000001;
3042 iowrite32(val,
3043 pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl);
3044 } else {
3045 return -EINVAL;
3046 }
3047
3048 if (pdata->vaddr_gpio_mux_quin_ctl) {
3049 val = ioread32(pdata->vaddr_gpio_mux_quin_ctl);
3050 val = val | 0x00000001;
3051 iowrite32(val, pdata->vaddr_gpio_mux_quin_ctl);
3052 } else {
3053 return -EINVAL;
3054 }
3055
3056 if (pdata->vaddr_gpio_mux_mic_ext_clk_ctl) {
3057 val = ioread32(pdata->vaddr_gpio_mux_mic_ext_clk_ctl);
3058 val = val | 0x00000001;
3059 iowrite32(val, pdata->vaddr_gpio_mux_mic_ext_clk_ctl);
3060 } else {
3061 return -EINVAL;
3062 }
3063
3064 if (pdata->vaddr_gpio_mux_sec_tlmm_ctl) {
3065 val = ioread32(pdata->vaddr_gpio_mux_sec_tlmm_ctl);
3066 val = val | 0x00000002;
3067 iowrite32(val, pdata->vaddr_gpio_mux_sec_tlmm_ctl);
3068 } else {
3069 return -EINVAL;
3070 }
3071
3072 if (pdata->vaddr_gpio_mux_spkr_ctl) {
3073 val = ioread32(pdata->vaddr_gpio_mux_spkr_ctl);
3074 val = val | 0x00000002;
3075 iowrite32(val, pdata->vaddr_gpio_mux_spkr_ctl);
3076 } else {
3077 return -EINVAL;
3078 }
3079 if (pdata->mi2s_gpio_p[QUIN_MI2S]) {
3080 ret = msm_cdc_pinctrl_select_active_state(
3081 pdata->mi2s_gpio_p[QUIN_MI2S]);
3082 if (ret < 0)
3083 pr_err("%s: failed to activate sec TDM gpio\n",
3084 __func__);
3085 }
3086 break;
3087 default:
3088 pr_err("%s: dai id 0x%x not supported\n",
3089 __func__, cpu_dai->id);
3090 break;
3091 return -EINVAL;
3092 }
3093 return ret;
3094}
3095
3096void msm_tdm_shutdown(struct snd_pcm_substream *substream)
3097{
3098 struct snd_soc_pcm_runtime *rtd = substream->private_data;
3099 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
3100 struct snd_soc_card *card = rtd->card;
3101 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
3102 int ret;
3103
3104 switch (cpu_dai->id) {
3105 case AFE_PORT_ID_PRIMARY_TDM_RX:
3106 case AFE_PORT_ID_PRIMARY_TDM_RX_1:
3107 case AFE_PORT_ID_PRIMARY_TDM_RX_2:
3108 case AFE_PORT_ID_PRIMARY_TDM_RX_3:
3109 case AFE_PORT_ID_PRIMARY_TDM_RX_4:
3110 case AFE_PORT_ID_PRIMARY_TDM_RX_5:
3111 case AFE_PORT_ID_PRIMARY_TDM_RX_6:
3112 case AFE_PORT_ID_PRIMARY_TDM_RX_7:
3113 case AFE_PORT_ID_PRIMARY_TDM_TX:
3114 case AFE_PORT_ID_PRIMARY_TDM_TX_1:
3115 case AFE_PORT_ID_PRIMARY_TDM_TX_2:
3116 case AFE_PORT_ID_PRIMARY_TDM_TX_3:
3117 case AFE_PORT_ID_PRIMARY_TDM_TX_4:
3118 case AFE_PORT_ID_PRIMARY_TDM_TX_5:
3119 case AFE_PORT_ID_PRIMARY_TDM_TX_6:
3120 case AFE_PORT_ID_PRIMARY_TDM_TX_7:
3121 if (pdata->mi2s_gpio_p[QUAT_MI2S]) {
3122 ret = msm_cdc_pinctrl_select_sleep_state(
3123 pdata->mi2s_gpio_p[QUAT_MI2S]);
3124 if (ret < 0) {
3125 pr_err("%s: gpio cannot be de-activated %s\n",
3126 __func__, "pri_tdm");
3127 return;
3128 }
3129 }
3130 break;
3131 case AFE_PORT_ID_SECONDARY_TDM_RX:
3132 case AFE_PORT_ID_SECONDARY_TDM_RX_1:
3133 case AFE_PORT_ID_SECONDARY_TDM_RX_2:
3134 case AFE_PORT_ID_SECONDARY_TDM_RX_3:
3135 case AFE_PORT_ID_SECONDARY_TDM_RX_4:
3136 case AFE_PORT_ID_SECONDARY_TDM_RX_5:
3137 case AFE_PORT_ID_SECONDARY_TDM_RX_6:
3138 case AFE_PORT_ID_SECONDARY_TDM_RX_7:
3139 case AFE_PORT_ID_SECONDARY_TDM_TX:
3140 case AFE_PORT_ID_SECONDARY_TDM_TX_1:
3141 case AFE_PORT_ID_SECONDARY_TDM_TX_2:
3142 case AFE_PORT_ID_SECONDARY_TDM_TX_3:
3143 case AFE_PORT_ID_SECONDARY_TDM_TX_4:
3144 case AFE_PORT_ID_SECONDARY_TDM_TX_5:
3145 case AFE_PORT_ID_SECONDARY_TDM_TX_6:
3146 case AFE_PORT_ID_SECONDARY_TDM_TX_7:
3147 if (pdata->mi2s_gpio_p[QUIN_MI2S]) {
3148 ret = msm_cdc_pinctrl_select_sleep_state(
3149 pdata->mi2s_gpio_p[QUIN_MI2S]);
3150 if (ret < 0) {
3151 pr_err("%s: gpio cannot be de-activated %s",
3152 __func__, "sec_tdm");
3153 return;
3154 }
3155 }
3156 break;
3157 }
3158}
3159
3160static int msm8952_mclk_event(struct snd_soc_dapm_widget *w,
3161 struct snd_kcontrol *kcontrol, int event)
3162{
3163 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
3164
3165 pr_debug("%s: event = %d\n", __func__, event);
3166
3167 switch (event) {
3168 case SND_SOC_DAPM_PRE_PMU:
3169 return msm8952_enable_codec_mclk(codec, 1, true);
3170 case SND_SOC_DAPM_POST_PMD:
3171 return msm8952_enable_codec_mclk(codec, 0, true);
3172 }
3173 return 0;
3174}
3175
3176static const struct snd_soc_dapm_widget msm8952_tasha_dapm_widgets[] = {
3177
3178 SND_SOC_DAPM_SUPPLY_S("MCLK", -1, SND_SOC_NOPM, 0, 0,
3179 msm8952_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3180
3181 SND_SOC_DAPM_SPK("Lineout_1 amp", NULL),
3182 SND_SOC_DAPM_SPK("Lineout_3 amp", NULL),
3183 SND_SOC_DAPM_SPK("Lineout_2 amp", NULL),
3184 SND_SOC_DAPM_SPK("Lineout_4 amp", NULL),
3185 SND_SOC_DAPM_MIC("Handset Mic", NULL),
3186 SND_SOC_DAPM_MIC("Headset Mic", NULL),
3187 SND_SOC_DAPM_MIC("Secondary Mic", NULL),
3188 SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL),
3189 SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL),
3190 SND_SOC_DAPM_MIC("Analog Mic4", NULL),
3191 SND_SOC_DAPM_MIC("Analog Mic6", NULL),
3192 SND_SOC_DAPM_MIC("Analog Mic7", NULL),
3193 SND_SOC_DAPM_MIC("Analog Mic8", NULL),
3194
3195 SND_SOC_DAPM_MIC("Digital Mic0", NULL),
3196 SND_SOC_DAPM_MIC("Digital Mic1", NULL),
3197 SND_SOC_DAPM_MIC("Digital Mic2", NULL),
3198 SND_SOC_DAPM_MIC("Digital Mic3", NULL),
3199 SND_SOC_DAPM_MIC("Digital Mic4", NULL),
3200 SND_SOC_DAPM_MIC("Digital Mic5", NULL),
3201 SND_SOC_DAPM_MIC("Digital Mic6", NULL),
3202};
3203
3204static struct snd_soc_dapm_route wcd9335_audio_paths[] = {
3205 {"MIC BIAS1", NULL, "MCLK"},
3206 {"MIC BIAS2", NULL, "MCLK"},
3207 {"MIC BIAS3", NULL, "MCLK"},
3208 {"MIC BIAS4", NULL, "MCLK"},
3209};
3210
3211int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
3212{
3213 int err;
3214 struct snd_soc_codec *codec = rtd->codec;
3215 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
3216 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
3217 struct snd_soc_dai *codec_dai = rtd->codec_dai;
3218 struct snd_card *card;
3219 struct snd_soc_component *aux_comp;
3220 struct snd_info_entry *entry;
3221 struct msm8952_asoc_mach_data *pdata =
3222 snd_soc_card_get_drvdata(rtd->card);
3223
3224 /* Codec SLIMBUS configuration
3225 * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13
3226 * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13
3227 * TX14, TX15, TX16
3228 */
3229 unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150,
3230 151, 152, 153, 154, 155, 156};
3231 unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133,
3232 134, 135, 136, 137, 138, 139,
3233 140, 141, 142, 143};
3234
3235 pr_debug("%s: dev_name%s\n", __func__, dev_name(cpu_dai->dev));
3236
3237 rtd->pmdown_time = 0;
3238
3239 err = snd_soc_add_codec_controls(codec, msm_snd_controls,
3240 ARRAY_SIZE(msm_snd_controls));
3241 if (err < 0) {
3242 pr_err("%s: add_codec_controls failed, err%d\n",
3243 __func__, err);
3244 return err;
3245 }
3246
3247 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
3248 pdata->msm8952_codec_fn.get_afe_config_fn =
3249 tasha_get_afe_config;
3250 snd_soc_dapm_new_controls(dapm, msm8952_tasha_dapm_widgets,
3251 ARRAY_SIZE(msm8952_tasha_dapm_widgets));
3252 snd_soc_dapm_add_routes(dapm, wcd9335_audio_paths,
3253 ARRAY_SIZE(wcd9335_audio_paths));
3254 }
3255
3256 snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp");
3257 snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp");
3258 snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp");
3259 snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp");
3260
3261 snd_soc_dapm_ignore_suspend(dapm, "MADINPUT");
3262 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT");
3263 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
3264 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
3265 snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic");
3266 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
3267 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
3268 snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp");
3269 snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp");
3270 snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp");
3271 snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp");
3272 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
3273 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
3274 snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic");
3275 snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic");
3276 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
3277 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
3278 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
3279 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
3280 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
3281 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4");
3282 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6");
3283 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic7");
3284 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic8");
3285 snd_soc_dapm_ignore_suspend(dapm, "MADINPUT");
3286 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT");
3287
3288 snd_soc_dapm_ignore_suspend(dapm, "EAR");
3289 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1");
3290 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2");
3291 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3");
3292 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4");
3293 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
3294 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
3295 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
3296 snd_soc_dapm_ignore_suspend(dapm, "AMIC4");
3297 snd_soc_dapm_ignore_suspend(dapm, "AMIC5");
3298 snd_soc_dapm_ignore_suspend(dapm, "AMIC6");
3299 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
3300 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
3301 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
3302 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
3303 snd_soc_dapm_ignore_suspend(dapm, "DMIC5");
3304 snd_soc_dapm_ignore_suspend(dapm, "DMIC6");
3305 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6");
3306 snd_soc_dapm_ignore_suspend(dapm, "ANC EAR");
3307 snd_soc_dapm_ignore_suspend(dapm, "ANC HEADPHONE");
3308 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
3309 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
3310 snd_soc_dapm_ignore_suspend(dapm, "DMIC0");
3311 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
3312 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
3313 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
3314 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
3315 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL");
3316 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR");
3317 snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1");
3318 snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2");
3319 snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI");
3320 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT");
3321
3322 }
3323
3324 snd_soc_dapm_sync(dapm);
3325 snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
3326 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
3327
3328 err = msm_afe_set_config(codec);
3329 if (err) {
3330 pr_err("%s: Failed to set AFE config %d\n", __func__, err);
3331 goto out;
3332 }
3333
3334 adsp_state_notifier =
3335 subsys_notif_register_notifier("adsp",
3336 &adsp_state_notifier_block);
3337 if (!adsp_state_notifier) {
3338 pr_err("%s: Failed to register adsp state notifier\n",
3339 __func__);
3340 err = -EFAULT;
3341 goto out;
3342 }
3343
3344 if (rtd->card->num_aux_devs &&
3345 !list_empty(&rtd->card->aux_comp_list)) {
3346 aux_comp = list_first_entry(&rtd->card->aux_comp_list,
3347 struct snd_soc_component, list_aux);
3348 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
3349 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
3350 tasha_set_spkr_mode(rtd->codec, SPKR_MODE_1);
3351 tasha_set_spkr_gain_offset(rtd->codec,
3352 RX_GAIN_OFFSET_M1P5_DB);
3353 }
3354 }
3355
3356 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
3357 wcd_mbhc_cfg.calibration = def_tasha_mbhc_cal();
3358 if (wcd_mbhc_cfg.calibration) {
3359 pdata->codec = codec;
3360 err = tasha_mbhc_hs_detect(codec, &wcd_mbhc_cfg);
3361 if (err < 0)
3362 pr_err("%s: Failed to intialise mbhc %d\n",
3363 __func__, err);
3364 } else {
3365 pr_err("%s: wcd_mbhc_cfg calibration is NULL\n",
3366 __func__);
3367 err = -ENOMEM;
3368 goto out;
3369 }
3370
3371 }
3372
3373 codec_reg_done = true;
3374
3375 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
3376 card = rtd->card->snd_card;
3377 entry = snd_info_create_subdir(card->module,
3378 "codecs",
3379 card->proc_root);
3380 if (!entry) {
3381 pr_debug("%s: Cannot create codecs module entry\n",
3382 __func__);
3383 err = 0;
3384 goto out;
3385 }
3386 pdata->codec_root = entry;
3387 tasha_codec_info_create_codec_entry(pdata->codec_root,
3388 codec);
3389 }
3390 return 0;
3391out:
3392 return err;
3393}
3394
3395static bool msm8952_swap_gnd_mic(struct snd_soc_codec *codec, bool active)
3396{
3397 struct snd_soc_card *card = codec->component.card;
3398 struct msm8952_asoc_mach_data *pdata = NULL;
3399 int value = 0;
3400 int ret = 0;
3401
3402 pdata = snd_soc_card_get_drvdata(card);
3403 if (!gpio_is_valid(pdata->us_euro_gpio)) {
3404 pr_err("%s: Invalid gpio: %d", __func__, pdata->us_euro_gpio);
3405 return false;
3406 }
3407 value = gpio_get_value_cansleep(pdata->us_euro_gpio);
3408 if (pdata->us_euro_gpio_p) {
3409 ret = msm_cdc_pinctrl_select_active_state(
3410 pdata->us_euro_gpio_p);
3411 if (ret < 0) {
3412 pr_err("%s: gpio set cannot be activated %sd",
3413 __func__, "us_eu_gpio");
3414 return false;
3415 }
3416 }
3417 gpio_set_value_cansleep(pdata->us_euro_gpio, !value);
3418 pr_debug("%s: swap select switch %d to %d\n", __func__, value, !value);
3419 if (pdata->us_euro_gpio_p) {
3420 ret = msm_cdc_pinctrl_select_sleep_state(
3421 pdata->us_euro_gpio_p);
3422 if (ret < 0) {
3423 pr_err("%s: gpio set cannot be de-activated %sd",
3424 __func__, "us_eu_gpio");
3425 return false;
3426 }
3427 }
3428 return true;
3429}
3430
3431static int is_us_eu_switch_gpio_support(struct platform_device *pdev,
3432 struct msm8952_asoc_mach_data *pdata)
3433{
3434 pr_debug("%s\n", __func__);
3435
3436 /* check if US-EU GPIO is supported */
3437 pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node,
3438 "qcom,cdc-us-euro-gpios", 0);
3439 if (pdata->us_euro_gpio < 0) {
3440 dev_err(&pdev->dev,
3441 "property %s in node %s not found %d\n",
3442 "qcom,cdc-us-euro-gpios", pdev->dev.of_node->full_name,
3443 pdata->us_euro_gpio);
3444 } else {
3445 if (!gpio_is_valid(pdata->us_euro_gpio)) {
3446 pr_err("%s: Invalid gpio: %d", __func__,
3447 pdata->us_euro_gpio);
3448 return -EINVAL;
3449 }
3450 pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node,
3451 "qcom,cdc-us-eu-gpios", 0);
3452 wcd_mbhc_cfg.swap_gnd_mic = msm8952_swap_gnd_mic;
3453 }
3454 return 0;
3455}
3456
3457static int msm8952_populate_dai_link_component_of_node(
3458 struct snd_soc_card *card)
3459{
3460 int i, index, ret = 0;
3461 struct device *cdev = card->dev;
3462 struct snd_soc_dai_link *dai_link = card->dai_link;
3463 struct device_node *phandle;
3464
3465 if (!cdev) {
3466 pr_err("%s: Sound card device memory NULL\n", __func__);
3467 return -ENODEV;
3468 }
3469
3470 for (i = 0; i < card->num_links; i++) {
3471 if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node)
3472 continue;
3473 /* populate platform_of_node for snd card dai links */
3474 if (dai_link[i].platform_name &&
3475 !dai_link[i].platform_of_node) {
3476 index = of_property_match_string(cdev->of_node,
3477 "asoc-platform-names",
3478 dai_link[i].platform_name);
3479 if (index < 0) {
3480 pr_err("%s: No match found for platform name: %s\n",
3481 __func__, dai_link[i].platform_name);
3482 ret = index;
3483 goto cpu_dai;
3484 }
3485 phandle = of_parse_phandle(cdev->of_node,
3486 "asoc-platform",
3487 index);
3488 if (!phandle) {
3489 pr_err("%s: retrieving phandle for platform %s, index %d failed\n",
3490 __func__, dai_link[i].platform_name,
3491 index);
3492 ret = -ENODEV;
3493 goto err;
3494 }
3495 dai_link[i].platform_of_node = phandle;
3496 dai_link[i].platform_name = NULL;
3497 }
3498cpu_dai:
3499 /* populate cpu_of_node for snd card dai links */
3500 if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) {
3501 index = of_property_match_string(cdev->of_node,
3502 "asoc-cpu-names",
3503 dai_link[i].cpu_dai_name);
3504 if (index < 0) {
3505 pr_debug("cpu-names not found index = %d\n", i);
3506 goto codec_dai;
3507 }
3508 phandle = of_parse_phandle(cdev->of_node, "asoc-cpu",
3509 index);
3510 if (!phandle) {
3511 pr_err("%s: phandle for cpu dai %s failed\n",
3512 __func__, dai_link[i].cpu_dai_name);
3513 ret = -ENODEV;
3514 goto err;
3515 }
3516 dai_link[i].cpu_of_node = phandle;
3517 dai_link[i].cpu_dai_name = NULL;
3518 }
3519codec_dai:
3520 /* populate codec_of_node for snd card dai links */
3521 if (dai_link[i].codec_name && !dai_link[i].codec_of_node) {
3522 index = of_property_match_string(cdev->of_node,
3523 "asoc-codec-names",
3524 dai_link[i].codec_name);
3525 if (index < 0)
3526 continue;
3527 phandle = of_parse_phandle(cdev->of_node, "asoc-codec",
3528 index);
3529 if (!phandle) {
3530 pr_err("%s: retrieving phandle for codec dai %s failed\n",
3531 __func__, dai_link[i].codec_name);
3532 ret = -ENODEV;
3533 goto err;
3534 }
3535 dai_link[i].codec_of_node = phandle;
3536 dai_link[i].codec_name = NULL;
3537 }
3538 }
3539err:
3540 return ret;
3541}
3542
3543static int msm8952_asoc_machine_probe(struct platform_device *pdev)
3544{
3545 struct snd_soc_card *card;
3546 struct msm8952_asoc_mach_data *pdata = NULL;
3547 const char *ext_pa = "qcom,msm-ext-pa";
3548 const char *ext_pa_str = NULL;
3549 int num_strings = 0;
3550 int ret, i;
3551 struct resource *muxsel;
3552
3553 pdata = devm_kzalloc(&pdev->dev,
3554 sizeof(struct msm8952_asoc_mach_data), GFP_KERNEL);
3555 if (!pdata)
3556 return -ENOMEM;
3557
3558 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3559 "csr_gp_io_mux_mic_ctl");
3560 if (!muxsel) {
3561 dev_err(&pdev->dev, "MUX addr invalid for MIC CTL\n");
3562 ret = -ENODEV;
3563 goto err;
3564 }
3565 pdata->vaddr_gpio_mux_mic_ctl =
3566 ioremap(muxsel->start, resource_size(muxsel));
3567 if (pdata->vaddr_gpio_mux_mic_ctl == NULL) {
3568 pr_err("%s ioremap failure for muxsel virt addr\n",
3569 __func__);
3570 ret = -ENOMEM;
3571 goto err;
3572 }
3573
3574 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3575 "csr_gp_io_lpaif_pri_pcm_pri_mode_muxsel");
3576 if (!muxsel) {
3577 dev_err(&pdev->dev, "MUX addr invalid for QUAT I2S\n");
3578 ret = -ENODEV;
3579 goto err;
3580 }
3581 pdata->vaddr_gpio_mux_pcm_ctl =
3582 ioremap(muxsel->start, resource_size(muxsel));
3583 if (pdata->vaddr_gpio_mux_pcm_ctl == NULL) {
3584 pr_err("%s ioremap failure for muxsel virt addr\n",
3585 __func__);
3586 ret = -ENOMEM;
3587 goto err;
3588 }
3589
3590 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3591 "csr_gp_io_mux_spkr_ctl");
3592 if (!muxsel) {
3593 dev_err(&pdev->dev, "MUX addr invalid for SPKR CTL\n");
3594 ret = -ENODEV;
3595 goto err;
3596 }
3597 pdata->vaddr_gpio_mux_spkr_ctl =
3598 ioremap(muxsel->start, resource_size(muxsel));
3599 if (pdata->vaddr_gpio_mux_spkr_ctl == NULL) {
3600 pr_err("%s ioremap failure for muxsel virt addr\n",
3601 __func__);
3602 ret = -ENOMEM;
3603 goto err;
3604 }
3605
3606 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3607 "csr_gp_io_mux_quin_ctl");
3608 if (!muxsel) {
3609 dev_dbg(&pdev->dev, "MUX addr invalid for QUIN I2S\n");
3610 ret = -ENODEV;
3611 } else {
3612 pdata->vaddr_gpio_mux_quin_ctl =
3613 ioremap(muxsel->start, resource_size(muxsel));
3614 if (pdata->vaddr_gpio_mux_quin_ctl == NULL) {
3615 pr_err("%s ioremap failure for muxsel virt addr\n",
3616 __func__);
3617 ret = -ENOMEM;
3618 goto err;
3619 }
3620 }
3621
3622 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3623 "csr_gp_io_lpaif_qui_pcm_sec_mode_muxsel");
3624 if (!muxsel) {
3625 dev_err(&pdev->dev, "MUX addr invalid for QUIN PCM\n");
3626 ret = -ENODEV;
3627 } else {
3628 pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl =
3629 ioremap(muxsel->start, resource_size(muxsel));
3630 if (pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl == NULL) {
3631 pr_err("%s ioremap failure for muxsel virt addr\n",
3632 __func__);
3633 ret = -ENOMEM;
3634 goto err;
3635 }
3636 }
3637
3638 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3639 "csr_gp_io_mux_mic_ext_clk_ctl");
3640 if (!muxsel) {
3641 dev_err(&pdev->dev, "MUX addr invalid for EXT CLK CTL\n");
3642 ret = -ENODEV;
3643 } else {
3644 pdata->vaddr_gpio_mux_mic_ext_clk_ctl =
3645 ioremap(muxsel->start, resource_size(muxsel));
3646 if (pdata->vaddr_gpio_mux_mic_ext_clk_ctl == NULL) {
3647 pr_err("%s ioremap failure for muxsel virt addr\n",
3648 __func__);
3649 ret = -ENOMEM;
3650 goto err;
3651 }
3652 }
3653
3654 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
3655 "csr_gp_io_mux_sec_tlmm_ctl");
3656 if (!muxsel) {
3657 dev_err(&pdev->dev, "MUX addr invalid for SEC TLMM CTL\n");
3658 ret = -ENODEV;
3659 } else {
3660 pdata->vaddr_gpio_mux_sec_tlmm_ctl =
3661 ioremap(muxsel->start, resource_size(muxsel));
3662 if (pdata->vaddr_gpio_mux_sec_tlmm_ctl == NULL) {
3663 pr_err("%s ioremap failure for muxsel virt addr\n",
3664 __func__);
3665 ret = -ENOMEM;
3666 goto err;
3667 }
3668 }
3669
3670 pdev->id = 0;
3671
3672 atomic_set(&pdata->clk_ref.quat_mi2s_clk_ref, 0);
3673 atomic_set(&pdata->clk_ref.auxpcm_mi2s_clk_ref, 0);
3674 card = populate_snd_card_dailinks(&pdev->dev);
3675 if (!card) {
3676 ret = -EPROBE_DEFER;
3677 goto err;
3678 }
3679 card->dev = &pdev->dev;
3680 platform_set_drvdata(pdev, card);
3681 snd_soc_card_set_drvdata(card, pdata);
3682
3683 ret = snd_soc_of_parse_audio_routing(card,
3684 "qcom,audio-routing");
3685 if (ret)
3686 goto err;
3687
3688 ret = msm8952_populate_dai_link_component_of_node(card);
3689 if (ret) {
3690 ret = -EPROBE_DEFER;
3691 goto err;
3692 }
3693
3694 ret = msm8952_init_wsa_dev(pdev, card);
3695 if (ret)
3696 goto err;
3697
3698 ret = devm_snd_soc_register_card(&pdev->dev, card);
3699 if (ret) {
3700 if (codec_reg_done)
3701 ret = -EINVAL;
3702 dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
3703 ret);
3704 goto err;
3705 }
3706 num_strings = of_property_count_strings(pdev->dev.of_node,
3707 ext_pa);
3708 if (num_strings < 0) {
3709 dev_err(&pdev->dev,
3710 "%s: missing %s in dt node or length is incorrect\n",
3711 __func__, ext_pa);
3712 pdata->ext_pa = 0;
3713 }
3714 for (i = 0; i < num_strings; i++) {
3715 of_property_read_string_index(pdev->dev.of_node,
3716 ext_pa, i, &ext_pa_str);
3717 if (!strcmp(ext_pa_str, "primary"))
3718 pdata->ext_pa = (pdata->ext_pa | PRI_MI2S_ID);
3719 else if (!strcmp(ext_pa_str, "secondary"))
3720 pdata->ext_pa = (pdata->ext_pa | SEC_MI2S_ID);
3721 else if (!strcmp(ext_pa_str, "tertiary"))
3722 pdata->ext_pa = (pdata->ext_pa | TER_MI2S_ID);
3723 else if (!strcmp(ext_pa_str, "quaternary"))
3724 pdata->ext_pa = (pdata->ext_pa | QUAT_MI2S_ID);
3725 else if (!strcmp(ext_pa_str, "quinary"))
3726 pdata->ext_pa = (pdata->ext_pa | QUIN_MI2S_ID);
3727 }
3728
3729 /* Parse US-Euro gpio info from DT. Report no error if us-euro
3730 * entry is not found in DT file as some targets do not support
3731 * US-Euro detection
3732 */
3733 ret = is_us_eu_switch_gpio_support(pdev, pdata);
3734 if (ret < 0) {
3735 pr_err("%s: failed to is_us_eu_switch_gpio_support %d\n",
3736 __func__, ret);
3737 goto err;
3738 }
3739 pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
3740 "qcom,quat-mi2s-gpios", 0);
3741 pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
3742 "qcom,quin-mi2s-gpios", 0);
3743
3744 return 0;
3745err:
3746 if (pdata->us_euro_gpio > 0) {
3747 dev_dbg(&pdev->dev, "%s free us_euro gpio %d\n",
3748 __func__, pdata->us_euro_gpio);
3749 gpio_free(pdata->us_euro_gpio);
3750 pdata->us_euro_gpio = 0;
3751 }
3752 if (pdata->vaddr_gpio_mux_spkr_ctl)
3753 iounmap(pdata->vaddr_gpio_mux_spkr_ctl);
3754 if (pdata->vaddr_gpio_mux_mic_ctl)
3755 iounmap(pdata->vaddr_gpio_mux_mic_ctl);
3756 if (pdata->vaddr_gpio_mux_pcm_ctl)
3757 iounmap(pdata->vaddr_gpio_mux_pcm_ctl);
3758 if (pdata->vaddr_gpio_mux_quin_ctl)
3759 iounmap(pdata->vaddr_gpio_mux_quin_ctl);
3760 if (pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl)
3761 iounmap(pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl);
3762 if (pdata->vaddr_gpio_mux_mic_ext_clk_ctl)
3763 iounmap(pdata->vaddr_gpio_mux_mic_ext_clk_ctl);
3764 if (pdata->vaddr_gpio_mux_sec_tlmm_ctl)
3765 iounmap(pdata->vaddr_gpio_mux_sec_tlmm_ctl);
3766 devm_kfree(&pdev->dev, pdata);
3767 return ret;
3768}
3769
3770static int msm8952_asoc_machine_remove(struct platform_device *pdev)
3771{
3772 struct snd_soc_card *card = platform_get_drvdata(pdev);
3773 struct msm8952_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
3774
3775 if (pdata->us_euro_gpio > 0) {
3776 dev_dbg(&pdev->dev, "%s free us_euro gpio %d\n",
3777 __func__, pdata->us_euro_gpio);
3778 gpio_free(pdata->us_euro_gpio);
3779 pdata->us_euro_gpio = 0;
3780 }
3781 if (pdata->vaddr_gpio_mux_spkr_ctl)
3782 iounmap(pdata->vaddr_gpio_mux_spkr_ctl);
3783 if (pdata->vaddr_gpio_mux_mic_ctl)
3784 iounmap(pdata->vaddr_gpio_mux_mic_ctl);
3785 if (pdata->vaddr_gpio_mux_pcm_ctl)
3786 iounmap(pdata->vaddr_gpio_mux_pcm_ctl);
3787 if (pdata->vaddr_gpio_mux_quin_ctl)
3788 iounmap(pdata->vaddr_gpio_mux_quin_ctl);
3789 if (pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl)
3790 iounmap(pdata->vaddr_gpio_mux_qui_pcm_sec_mode_ctl);
3791 if (pdata->vaddr_gpio_mux_mic_ext_clk_ctl)
3792 iounmap(pdata->vaddr_gpio_mux_mic_ext_clk_ctl);
3793 if (pdata->vaddr_gpio_mux_sec_tlmm_ctl)
3794 iounmap(pdata->vaddr_gpio_mux_sec_tlmm_ctl);
3795 msm895x_free_auxdev_mem(pdev);
3796
3797 snd_soc_unregister_card(card);
3798 return 0;
3799}
3800
3801static const struct of_device_id msm8952_asoc_machine_of_match[] = {
3802 { .compatible = "qcom,msm8952-audio-slim-codec", },
3803 {},
3804};
3805
3806static struct platform_driver msm8952_asoc_machine_driver = {
3807 .driver = {
3808 .name = DRV_NAME,
3809 .owner = THIS_MODULE,
3810 .pm = &snd_soc_pm_ops,
3811 .of_match_table = msm8952_asoc_machine_of_match,
3812 },
3813 .probe = msm8952_asoc_machine_probe,
3814 .remove = msm8952_asoc_machine_remove,
3815};
3816
3817static int __init msm8952_slim_machine_init(void)
3818{
3819 return platform_driver_register(&msm8952_asoc_machine_driver);
3820}
3821module_init(msm8952_slim_machine_init);
3822
3823static void __exit msm8952_slim_machine_exit(void)
3824{
3825 return platform_driver_unregister(&msm8952_asoc_machine_driver);
3826}
3827module_exit(msm8952_slim_machine_exit);
3828
3829MODULE_DESCRIPTION("ALSA SoC msm");
3830MODULE_LICENSE("GPL v2");
3831MODULE_ALIAS("platform:" DRV_NAME);
3832MODULE_DEVICE_TABLE(of, msm8952_asoc_machine_of_match);