2 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/clk.h>
15 #include <linux/delay.h>
16 #include <linux/gpio.h>
17 #include <linux/of_gpio.h>
18 #include <linux/platform_device.h>
19 #include <linux/slab.h>
20 #include <linux/regulator/consumer.h>
22 #include <linux/module.h>
23 #include <linux/switch.h>
24 #include <linux/input.h>
25 #include <linux/of_device.h>
26 #include <linux/mfd/msm-cdc-pinctrl.h>
27 #include <sound/core.h>
28 #include <sound/soc.h>
29 #include <sound/soc-dapm.h>
30 #include <sound/pcm.h>
31 #include <sound/jack.h>
32 #include <sound/q6afe-v2.h>
33 #include <sound/q6core.h>
34 #include <sound/pcm_params.h>
35 #include <sound/info.h>
36 #include <device_event.h>
37 #include <linux/qdsp6v2/audio_notifier.h>
38 #include "qdsp6v2/msm-pcm-routing-v2.h"
39 #include "../codecs/wcd9335.h"
40 #include "../codecs/wcd934x/wcd934x.h"
41 #include "../codecs/wcd934x/wcd934x-mbhc.h"
42 #include "../codecs/wsa881x.h"
44 #ifdef CONFIG_MACH_XIAOMI_MSM8998
45 #include <soc/qcom/socinfo.h>
46 #include <linux/mfd/spk-id.h>
47 #include "../codecs/usb-headset.h"
50 #define DRV_NAME "msm8998-asoc-snd"
52 #define __CHIPSET__ "MSM8998 "
53 #define MSM_DAILINK_NAME(name) (__CHIPSET__#name)
55 #define SAMPLING_RATE_8KHZ 8000
56 #define SAMPLING_RATE_11P025KHZ 11025
57 #define SAMPLING_RATE_16KHZ 16000
58 #define SAMPLING_RATE_22P05KHZ 22050
59 #define SAMPLING_RATE_32KHZ 32000
60 #define SAMPLING_RATE_44P1KHZ 44100
61 #define SAMPLING_RATE_48KHZ 48000
62 #define SAMPLING_RATE_88P2KHZ 88200
63 #define SAMPLING_RATE_96KHZ 96000
64 #define SAMPLING_RATE_176P4KHZ 176400
65 #define SAMPLING_RATE_192KHZ 192000
66 #define SAMPLING_RATE_352P8KHZ 352800
67 #define SAMPLING_RATE_384KHZ 384000
69 #define WCD9XXX_MBHC_DEF_BUTTONS 8
70 #define WCD9XXX_MBHC_DEF_RLOADS 5
71 #define CODEC_EXT_CLK_RATE 9600000
72 #define ADSP_STATE_READY_TIMEOUT_MS 3000
73 #define DEV_NAME_STR_LEN 32
75 #define WSA8810_NAME_1 "wsa881x.20170211"
76 #define WSA8810_NAME_2 "wsa881x.20170212"
78 #define WCN_CDC_SLIM_RX_CH_MAX 2
79 #define WCN_CDC_SLIM_TX_CH_MAX 3
81 #define TDM_CHANNEL_MAX 16
82 #define TDM_SLOT_OFFSET_MAX 32
128 PCM_I2S_SEL_PRIM = 0,
135 struct mi2s_aux_pcm_common_conf {
137 void *pcm_i2s_sel_vt_addr;
143 u32 msm_is_mi2s_master;
163 struct msm_wsa881x_dev_info {
164 struct device_node *of_node;
168 enum pinctrl_pin_state {
169 STATE_DISABLE = 0, /* All pins are in sleep state */
170 STATE_MI2S_ACTIVE, /* IS2 = active, TDM = sleep */
171 STATE_TDM_ACTIVE, /* IS2 = sleep, TDM = active */
174 struct msm_pinctrl_info {
175 struct pinctrl *pinctrl;
176 struct pinctrl_state *mi2s_disable;
177 struct pinctrl_state *tdm_disable;
178 struct pinctrl_state *mi2s_active;
179 struct pinctrl_state *tdm_active;
180 enum pinctrl_pin_state curr_state;
183 struct msm_asoc_mach_data {
185 int us_euro_gpio; /* used by gpio driver API */
186 struct device_node *us_euro_gpio_p; /* used by pinctrl API */
187 struct device_node *hph_en1_gpio_p; /* used by pinctrl API */
188 struct device_node *hph_en0_gpio_p; /* used by pinctrl API */
189 struct snd_info_entry *codec_root;
190 struct msm_pinctrl_info pinctrl_info;
191 #ifdef CONFIG_MACH_XIAOMI_MSM8998
192 struct device_node *spk_id_gpio_p;
193 struct device_node *rcv_id_gpio_p;
194 struct regulator *us_p_power;
195 struct regulator *us_n_power;
199 struct msm_asoc_wcd93xx_codec {
200 void* (*get_afe_config_fn)(struct snd_soc_codec *codec,
201 enum afe_config_type config_type);
202 void (*mbhc_hs_detect_exit)(struct snd_soc_codec *codec);
205 static const char *const pin_states[] = {"sleep", "i2s-active",
233 /* TDM default config */
234 static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
236 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
237 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
238 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
239 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
240 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
241 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
242 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
243 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
246 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
247 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
248 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
249 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
250 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
251 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
252 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
253 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
256 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
257 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
258 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
259 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
260 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
261 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
262 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
263 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
266 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
267 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
268 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
269 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
270 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
271 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
272 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
273 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
277 /* TDM default config */
278 static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
280 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
281 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
282 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
283 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
284 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
285 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
286 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
287 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
290 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
291 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
292 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
293 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
294 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
295 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
296 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
297 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
300 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
301 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
302 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
303 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
304 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
305 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
306 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
307 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
310 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
311 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
312 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
313 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
314 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
315 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
316 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
317 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
321 /*TDM default offset currently only supporting TDM_RX_0 and TDM_TX_0 */
322 static unsigned int tdm_slot_offset[TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
323 {0, 4, 8, 12, 16, 20, 24, 28},/* TX_0 | RX_0 */
324 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_1 | RX_1 */
325 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_2 | RX_2 */
326 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_3 | RX_3 */
327 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_4 | RX_4 */
328 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_5 | RX_5 */
329 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_6 | RX_6 */
330 {AFE_SLOT_MAPPING_OFFSET_INVALID},/* TX_7 | RX_7 */
333 /* Default configuration of slimbus channels */
334 static struct dev_config slim_rx_cfg[] = {
335 [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
336 #ifdef CONFIG_MACH_XIAOMI_MSM8998
337 [SLIM_RX_1] = {SAMPLING_RATE_96KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
339 [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
341 [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
342 [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
343 [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
344 [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
345 [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
346 [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
349 static struct dev_config slim_tx_cfg[] = {
350 [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
351 #ifdef CONFIG_MACH_XIAOMI_MSM8998
352 [SLIM_TX_1] = {SAMPLING_RATE_96KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
354 [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
356 [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
357 [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
358 [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
359 [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
360 [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
361 [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
362 [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
366 /* Default configuration of external display BE */
367 static struct dev_config ext_disp_rx_cfg[] = {
368 [HDMI_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
369 [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
372 static struct dev_config usb_rx_cfg = {
373 .sample_rate = SAMPLING_RATE_48KHZ,
374 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
378 static struct dev_config usb_tx_cfg = {
379 .sample_rate = SAMPLING_RATE_48KHZ,
380 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
384 static struct dev_config proxy_rx_cfg = {
385 .sample_rate = SAMPLING_RATE_48KHZ,
386 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
390 /* Default configuration of MI2S channels */
391 static struct dev_config mi2s_rx_cfg[] = {
392 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
393 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
394 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
395 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
398 static struct dev_config mi2s_tx_cfg[] = {
399 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
400 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
401 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
402 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
405 static struct dev_config aux_pcm_rx_cfg[] = {
406 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
407 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
408 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
409 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
412 static struct dev_config aux_pcm_tx_cfg[] = {
413 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
414 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
415 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
416 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
419 /* TDM default slot config */
420 struct tdm_slot_cfg {
425 static struct tdm_slot_cfg tdm_slot[TDM_INTERFACE_MAX] = {
436 static unsigned int tdm_rx_slot_offset
437 [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
439 {0, 4, 8, 12, 16, 20, 24, 28,
440 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
441 {0xFFFF}, /* not used */
442 {0xFFFF}, /* not used */
443 {0xFFFF}, /* not used */
444 {0xFFFF}, /* not used */
445 {0xFFFF}, /* not used */
446 {0xFFFF}, /* not used */
447 {0xFFFF}, /* not used */
450 {0, 4, 8, 12, 16, 20, 24, 28,
451 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
452 {0xFFFF}, /* not used */
453 {0xFFFF}, /* not used */
454 {0xFFFF}, /* not used */
455 {0xFFFF}, /* not used */
456 {0xFFFF}, /* not used */
457 {0xFFFF}, /* not used */
458 {0xFFFF}, /* not used */
461 {0, 4, 8, 12, 16, 20, 24, 28,
462 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
463 {0xFFFF}, /* not used */
464 {0xFFFF}, /* not used */
465 {0xFFFF}, /* not used */
466 {0xFFFF}, /* not used */
467 {0xFFFF}, /* not used */
468 {0xFFFF}, /* not used */
469 {0xFFFF}, /* not used */
472 {0, 4, 8, 12, 16, 20, 24, 28,
473 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
474 {0xFFFF}, /* not used */
475 {0xFFFF}, /* not used */
476 {0xFFFF}, /* not used */
477 {0xFFFF}, /* not used */
478 {0xFFFF}, /* not used */
479 {0xFFFF}, /* not used */
483 static unsigned int tdm_tx_slot_offset
484 [TDM_INTERFACE_MAX][TDM_PORT_MAX][TDM_SLOT_OFFSET_MAX] = {
486 {0, 4, 8, 12, 16, 20, 24, 28,
487 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
488 {0xFFFF}, /* not used */
489 {0xFFFF}, /* not used */
490 {0xFFFF}, /* not used */
491 {0xFFFF}, /* not used */
492 {0xFFFF}, /* not used */
493 {0xFFFF}, /* not used */
494 {0xFFFF}, /* not used */
497 {0, 4, 8, 12, 16, 20, 24, 28,
498 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
499 {0xFFFF}, /* not used */
500 {0xFFFF}, /* not used */
501 {0xFFFF}, /* not used */
502 {0xFFFF}, /* not used */
503 {0xFFFF}, /* not used */
504 {0xFFFF}, /* not used */
505 {0xFFFF}, /* not used */
508 {0, 4, 8, 12, 16, 20, 24, 28,
509 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},
510 {0xFFFF}, /* not used */
511 {0xFFFF}, /* not used */
512 {0xFFFF}, /* not used */
513 {0xFFFF}, /* not used */
514 {0xFFFF}, /* not used */
515 {0xFFFF}, /* not used */
516 {0xFFFF}, /* not used */
519 {0, 4, 8, 12, 16, 20, 24, 28,
520 32, 36, 40, 44, 48, 52, 56, 60, 0xFFFF},/*MIC ARR*/
521 {0xFFFF}, /* not used */
522 {0xFFFF}, /* not used */
523 {0xFFFF}, /* not used */
524 {0xFFFF}, /* not used */
525 {0xFFFF}, /* not used */
526 {0xFFFF}, /* not used */
527 {0xFFFF}, /* not used */
530 static int msm_vi_feed_tx_ch = 2;
531 static const char *const slim_rx_ch_text[] = {"One", "Two", "Three", "Four",
532 "Five", "Six", "Seven",
534 static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four",
535 "Five", "Six", "Seven",
537 static const char *const vi_feed_ch_text[] = {"One", "Two"};
538 static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE",
540 static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE"};
541 static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16",
542 "KHZ_32", "KHZ_44P1", "KHZ_48",
543 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
544 "KHZ_192", "KHZ_352P8", "KHZ_384"};
545 static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_48"};
546 static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16", "KHZ_48"};
547 static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16", "KHZ_48"};
548 static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four",
549 "Five", "Six", "Seven",
551 static char const *ch_text[] = {"Two", "Three", "Four", "Five",
552 "Six", "Seven", "Eight"};
553 static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
554 "KHZ_16", "KHZ_22P05",
555 "KHZ_32", "KHZ_44P1", "KHZ_48",
556 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
557 "KHZ_192", "KHZ_352P8", "KHZ_384"};
558 static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96",
559 "KHZ_192", "KHZ_32", "KHZ_44P1",
560 "KHZ_88P2", "KHZ_176P4"};
561 static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
562 "Five", "Six", "Seven", "Eight",
563 "Nine", "Ten", "Eleven", "Twelve",
564 "Thirteen", "Fourteen", "Fifteen",
566 static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"};
567 static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32",
568 "KHZ_44P1", "KHZ_48", "KHZ_96",
569 "KHZ_192", "KHZ_352P8", "KHZ_384"};
570 static const char *const tdm_slot_num_text[] = {"One", "Two", "Four",
571 "Eight", "Sixteen", "ThirtyTwo"};
572 static const char *const tdm_slot_width_text[] = {"16", "24", "32"};
573 static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"};
574 static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_16",
575 "KHZ_32", "KHZ_44P1", "KHZ_48",
576 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
578 static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four",
579 "Five", "Six", "Seven",
581 static const char *const hifi_text[] = {"Off", "On"};
583 #ifdef CONFIG_MACH_XIAOMI_MSM8998
584 static const char *const ras_switch_text[] = {"None", "Speaker", "Receiver"};
585 static const char *const vendor_id_text[] = {"None", "AAC", "Goer", "SSI", "Unknown"};
586 static const char *const ultrasound_power_text[] = {"Off", "On"};
589 static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text);
590 static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text);
591 static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text);
592 static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text);
593 static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text);
594 static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text);
595 static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text);
596 static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text);
597 static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text);
598 static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text);
599 static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text);
600 static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text);
601 static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text);
602 static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text);
603 static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text);
604 static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text);
605 static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text);
606 static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text);
607 static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text);
608 static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text);
609 static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text);
610 static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text);
611 static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text);
612 static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
613 static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text);
614 static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text);
615 static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text);
616 static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text);
617 static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate,
618 ext_disp_sample_rate_text);
619 static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text);
620 static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text);
621 static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text);
622 static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text);
623 static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text);
624 static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text);
625 static SOC_ENUM_SINGLE_EXT_DECL(tdm_slot_num, tdm_slot_num_text);
626 static SOC_ENUM_SINGLE_EXT_DECL(tdm_slot_width, tdm_slot_width_text);
627 static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text);
628 static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text);
629 static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text);
630 static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text);
631 static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text);
632 static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text);
633 static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text);
634 static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text);
635 static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text);
636 static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text);
637 static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text);
638 static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text);
639 static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text);
640 static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text);
641 static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text);
642 static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text);
643 static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text);
644 static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text);
645 static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text);
646 static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text);
647 static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text);
648 static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text);
649 static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text);
650 static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text);
651 static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text);
652 static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text);
653 static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text);
655 #ifdef CONFIG_MACH_XIAOMI_MSM8998
656 static SOC_ENUM_SINGLE_EXT_DECL(ras_switch, ras_switch_text);
657 static SOC_ENUM_SINGLE_EXT_DECL(vendor_id, vendor_id_text);
658 static SOC_ENUM_SINGLE_EXT_DECL(ultrasound_power, ultrasound_power_text);
661 static struct platform_device *spdev;
662 static int msm_hifi_control;
664 static bool is_initial_boot;
665 static bool codec_reg_done;
666 static struct snd_soc_aux_dev *msm_aux_dev;
667 static struct snd_soc_codec_conf *msm_codec_conf;
668 static struct msm_asoc_wcd93xx_codec msm_codec_fn;
670 #ifdef CONFIG_MACH_XIAOMI_MSM8998
671 static int ras_switch_en_gpio = -1;
672 static int ras_switch_sel_gpio = -1;
673 static int ultrasound_power_state;
676 static void *def_tasha_mbhc_cal(void);
677 static void *def_tavil_mbhc_cal(void);
678 static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec,
679 int enable, bool dapm);
680 static int msm_wsa881x_init(struct snd_soc_component *component);
683 * Need to report LINEIN
684 * if R/L channel impedance is larger than 5K ohm
686 static struct wcd_mbhc_config wcd_mbhc_cfg = {
687 .read_fw_bin = false,
689 .detect_extn_cable = true,
690 .mono_stero_detection = false,
691 .swap_gnd_mic = NULL,
692 .hs_ext_micbias = true,
693 .key_code[0] = KEY_MEDIA,
694 #ifdef CONFIG_MACH_XIAOMI_MSM8998
695 .key_code[1] = KEY_VOLUMEUP,
696 .key_code[2] = KEY_VOLUMEDOWN,
699 .key_code[1] = KEY_VOICECOMMAND,
700 .key_code[2] = KEY_VOLUMEUP,
701 .key_code[3] = KEY_VOLUMEDOWN,
708 #ifdef CONFIG_MACH_XIAOMI_MSM8998
709 .moisture_en = false,
713 .mbhc_micbias = MIC_BIAS_2,
714 .anc_micbias = MIC_BIAS_2,
715 .enable_anc_mic_detect = false,
718 static struct snd_soc_dapm_route wcd_audio_paths_tasha[] = {
719 {"MIC BIAS1", NULL, "MCLK TX"},
720 {"MIC BIAS2", NULL, "MCLK TX"},
721 {"MIC BIAS3", NULL, "MCLK TX"},
722 {"MIC BIAS4", NULL, "MCLK TX"},
725 static struct snd_soc_dapm_route wcd_audio_paths[] = {
726 {"MIC BIAS1", NULL, "MCLK"},
727 {"MIC BIAS2", NULL, "MCLK"},
728 {"MIC BIAS3", NULL, "MCLK"},
729 {"MIC BIAS4", NULL, "MCLK"},
732 static u32 mi2s_ebit_clk[MI2S_MAX] = {
733 Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
734 Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
735 Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
736 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT,
739 static struct afe_clk_set mi2s_clk[MI2S_MAX] = {
741 AFE_API_VERSION_I2S_CONFIG,
742 Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT,
743 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
744 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
745 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
749 AFE_API_VERSION_I2S_CONFIG,
750 Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
751 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
752 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
753 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
757 AFE_API_VERSION_I2S_CONFIG,
758 Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT,
759 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
760 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
761 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
765 AFE_API_VERSION_I2S_CONFIG,
766 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
767 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
768 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
769 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
774 static struct mi2s_aux_pcm_common_conf mi2s_auxpcm_conf[PCM_I2S_SEL_MAX];
775 static struct mi2s_conf mi2s_intf_conf[MI2S_MAX];
776 static struct auxpcm_conf auxpcm_intf_conf[AUX_PCM_MAX];
778 static int slim_get_sample_rate_val(int sample_rate)
780 int sample_rate_val = 0;
782 switch (sample_rate) {
783 case SAMPLING_RATE_8KHZ:
786 case SAMPLING_RATE_16KHZ:
789 case SAMPLING_RATE_32KHZ:
792 case SAMPLING_RATE_44P1KHZ:
795 case SAMPLING_RATE_48KHZ:
798 case SAMPLING_RATE_88P2KHZ:
801 case SAMPLING_RATE_96KHZ:
804 case SAMPLING_RATE_176P4KHZ:
807 case SAMPLING_RATE_192KHZ:
810 case SAMPLING_RATE_352P8KHZ:
813 case SAMPLING_RATE_384KHZ:
814 sample_rate_val = 10;
820 return sample_rate_val;
823 static int slim_get_sample_rate(int value)
829 sample_rate = SAMPLING_RATE_8KHZ;
832 sample_rate = SAMPLING_RATE_16KHZ;
835 sample_rate = SAMPLING_RATE_32KHZ;
838 sample_rate = SAMPLING_RATE_44P1KHZ;
841 sample_rate = SAMPLING_RATE_48KHZ;
844 sample_rate = SAMPLING_RATE_88P2KHZ;
847 sample_rate = SAMPLING_RATE_96KHZ;
850 sample_rate = SAMPLING_RATE_176P4KHZ;
853 sample_rate = SAMPLING_RATE_192KHZ;
856 sample_rate = SAMPLING_RATE_352P8KHZ;
859 sample_rate = SAMPLING_RATE_384KHZ;
862 sample_rate = SAMPLING_RATE_48KHZ;
868 static int slim_get_bit_format_val(int bit_format)
872 switch (bit_format) {
873 case SNDRV_PCM_FORMAT_S32_LE:
876 case SNDRV_PCM_FORMAT_S24_3LE:
879 case SNDRV_PCM_FORMAT_S24_LE:
882 case SNDRV_PCM_FORMAT_S16_LE:
890 static int slim_get_bit_format(int val)
892 int bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
896 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
899 bit_fmt = SNDRV_PCM_FORMAT_S24_LE;
902 bit_fmt = SNDRV_PCM_FORMAT_S24_3LE;
905 bit_fmt = SNDRV_PCM_FORMAT_S32_LE;
908 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
914 static int slim_get_port_idx(struct snd_kcontrol *kcontrol)
918 if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX")))
920 else if (strnstr(kcontrol->id.name, "SLIM_2_RX", sizeof("SLIM_2_RX")))
922 else if (strnstr(kcontrol->id.name, "SLIM_5_RX", sizeof("SLIM_5_RX")))
924 else if (strnstr(kcontrol->id.name, "SLIM_6_RX", sizeof("SLIM_6_RX")))
926 else if (strnstr(kcontrol->id.name, "SLIM_0_TX", sizeof("SLIM_0_TX")))
928 else if (strnstr(kcontrol->id.name, "SLIM_1_TX", sizeof("SLIM_1_TX")))
931 pr_err("%s: unsupported channel: %s",
932 __func__, kcontrol->id.name);
939 static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
940 struct snd_ctl_elem_value *ucontrol)
942 int ch_num = slim_get_port_idx(kcontrol);
947 ucontrol->value.enumerated.item[0] =
948 slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate);
950 pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__,
951 ch_num, slim_rx_cfg[ch_num].sample_rate,
952 ucontrol->value.enumerated.item[0]);
957 static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
958 struct snd_ctl_elem_value *ucontrol)
960 int ch_num = slim_get_port_idx(kcontrol);
965 slim_rx_cfg[ch_num].sample_rate =
966 slim_get_sample_rate(ucontrol->value.enumerated.item[0]);
968 pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__,
969 ch_num, slim_rx_cfg[ch_num].sample_rate,
970 ucontrol->value.enumerated.item[0]);
975 static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
976 struct snd_ctl_elem_value *ucontrol)
978 int ch_num = slim_get_port_idx(kcontrol);
983 ucontrol->value.enumerated.item[0] =
984 slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate);
986 pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__,
987 ch_num, slim_tx_cfg[ch_num].sample_rate,
988 ucontrol->value.enumerated.item[0]);
993 static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
994 struct snd_ctl_elem_value *ucontrol)
997 int ch_num = slim_get_port_idx(kcontrol);
1002 sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]);
1003 if (sample_rate == SAMPLING_RATE_44P1KHZ) {
1004 pr_err("%s: Unsupported sample rate %d: for Tx path\n",
1005 __func__, sample_rate);
1008 slim_tx_cfg[ch_num].sample_rate = sample_rate;
1010 pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__,
1011 ch_num, slim_tx_cfg[ch_num].sample_rate,
1012 ucontrol->value.enumerated.item[0]);
1017 static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol,
1018 struct snd_ctl_elem_value *ucontrol)
1020 int ch_num = slim_get_port_idx(kcontrol);
1025 ucontrol->value.enumerated.item[0] =
1026 slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format);
1028 pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n",
1029 __func__, ch_num, slim_rx_cfg[ch_num].bit_format,
1030 ucontrol->value.enumerated.item[0]);
1035 static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol,
1036 struct snd_ctl_elem_value *ucontrol)
1038 int ch_num = slim_get_port_idx(kcontrol);
1043 slim_rx_cfg[ch_num].bit_format =
1044 slim_get_bit_format(ucontrol->value.enumerated.item[0]);
1046 pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n",
1047 __func__, ch_num, slim_rx_cfg[ch_num].bit_format,
1048 ucontrol->value.enumerated.item[0]);
1053 static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol,
1054 struct snd_ctl_elem_value *ucontrol)
1056 int ch_num = slim_get_port_idx(kcontrol);
1061 ucontrol->value.enumerated.item[0] =
1062 slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format);
1064 pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n",
1065 __func__, ch_num, slim_tx_cfg[ch_num].bit_format,
1066 ucontrol->value.enumerated.item[0]);
1071 static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol,
1072 struct snd_ctl_elem_value *ucontrol)
1074 int ch_num = slim_get_port_idx(kcontrol);
1079 slim_tx_cfg[ch_num].bit_format =
1080 slim_get_bit_format(ucontrol->value.enumerated.item[0]);
1082 pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n",
1083 __func__, ch_num, slim_tx_cfg[ch_num].bit_format,
1084 ucontrol->value.enumerated.item[0]);
1089 static int msm_slim_rx_ch_get(struct snd_kcontrol *kcontrol,
1090 struct snd_ctl_elem_value *ucontrol)
1092 int ch_num = slim_get_port_idx(kcontrol);
1097 pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__,
1098 ch_num, slim_rx_cfg[ch_num].channels);
1099 ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1;
1104 static int msm_slim_rx_ch_put(struct snd_kcontrol *kcontrol,
1105 struct snd_ctl_elem_value *ucontrol)
1107 int ch_num = slim_get_port_idx(kcontrol);
1112 slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1;
1113 pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__,
1114 ch_num, slim_rx_cfg[ch_num].channels);
1119 static int msm_slim_tx_ch_get(struct snd_kcontrol *kcontrol,
1120 struct snd_ctl_elem_value *ucontrol)
1122 int ch_num = slim_get_port_idx(kcontrol);
1127 pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__,
1128 ch_num, slim_tx_cfg[ch_num].channels);
1129 ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1;
1134 static int msm_slim_tx_ch_put(struct snd_kcontrol *kcontrol,
1135 struct snd_ctl_elem_value *ucontrol)
1137 int ch_num = slim_get_port_idx(kcontrol);
1142 slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1;
1143 pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__,
1144 ch_num, slim_tx_cfg[ch_num].channels);
1149 static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
1150 struct snd_ctl_elem_value *ucontrol)
1152 ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1;
1153 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
1154 ucontrol->value.integer.value[0]);
1158 static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
1159 struct snd_ctl_elem_value *ucontrol)
1161 msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1;
1163 pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch);
1167 static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol,
1168 struct snd_ctl_elem_value *ucontrol)
1171 * Slimbus_7_Rx/Tx sample rate values should always be in sync (same)
1172 * when used for BT_SCO use case. Return either Rx or Tx sample rate
1175 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
1176 case SAMPLING_RATE_48KHZ:
1177 ucontrol->value.integer.value[0] = 2;
1179 case SAMPLING_RATE_16KHZ:
1180 ucontrol->value.integer.value[0] = 1;
1182 case SAMPLING_RATE_8KHZ:
1184 ucontrol->value.integer.value[0] = 0;
1187 pr_debug("%s: sample rate = %d", __func__,
1188 slim_rx_cfg[SLIM_RX_7].sample_rate);
1193 static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol,
1194 struct snd_ctl_elem_value *ucontrol)
1196 switch (ucontrol->value.integer.value[0]) {
1198 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
1199 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
1202 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
1203 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
1207 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
1208 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
1211 pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n",
1213 slim_rx_cfg[SLIM_RX_7].sample_rate,
1214 slim_tx_cfg[SLIM_TX_7].sample_rate,
1215 ucontrol->value.enumerated.item[0]);
1220 static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol,
1221 struct snd_ctl_elem_value *ucontrol)
1223 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
1224 case SAMPLING_RATE_48KHZ:
1225 ucontrol->value.integer.value[0] = 2;
1227 case SAMPLING_RATE_16KHZ:
1228 ucontrol->value.integer.value[0] = 1;
1230 case SAMPLING_RATE_8KHZ:
1232 ucontrol->value.integer.value[0] = 0;
1235 pr_debug("%s: sample rate = %d", __func__,
1236 slim_rx_cfg[SLIM_RX_7].sample_rate);
1241 static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol,
1242 struct snd_ctl_elem_value *ucontrol)
1244 switch (ucontrol->value.integer.value[0]) {
1246 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
1249 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
1253 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
1256 pr_debug("%s: sample rates: slim7_rx = %d, value = %d\n",
1258 slim_rx_cfg[SLIM_RX_7].sample_rate,
1259 ucontrol->value.enumerated.item[0]);
1264 static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol,
1265 struct snd_ctl_elem_value *ucontrol)
1267 switch (slim_tx_cfg[SLIM_TX_7].sample_rate) {
1268 case SAMPLING_RATE_48KHZ:
1269 ucontrol->value.integer.value[0] = 2;
1271 case SAMPLING_RATE_16KHZ:
1272 ucontrol->value.integer.value[0] = 1;
1274 case SAMPLING_RATE_8KHZ:
1276 ucontrol->value.integer.value[0] = 0;
1279 pr_debug("%s: sample rate = %d", __func__,
1280 slim_tx_cfg[SLIM_TX_7].sample_rate);
1285 static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol,
1286 struct snd_ctl_elem_value *ucontrol)
1288 switch (ucontrol->value.integer.value[0]) {
1290 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
1293 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
1297 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
1300 pr_debug("%s: sample rates: slim7_tx = %d, value = %d\n",
1302 slim_tx_cfg[SLIM_TX_7].sample_rate,
1303 ucontrol->value.enumerated.item[0]);
1308 static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol,
1309 struct snd_ctl_elem_value *ucontrol)
1311 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__,
1312 usb_rx_cfg.channels);
1313 ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1;
1317 static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol,
1318 struct snd_ctl_elem_value *ucontrol)
1320 usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1322 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels);
1326 static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1327 struct snd_ctl_elem_value *ucontrol)
1329 int sample_rate_val;
1331 switch (usb_rx_cfg.sample_rate) {
1332 case SAMPLING_RATE_384KHZ:
1333 sample_rate_val = 12;
1335 case SAMPLING_RATE_352P8KHZ:
1336 sample_rate_val = 11;
1338 case SAMPLING_RATE_192KHZ:
1339 sample_rate_val = 10;
1341 case SAMPLING_RATE_176P4KHZ:
1342 sample_rate_val = 9;
1344 case SAMPLING_RATE_96KHZ:
1345 sample_rate_val = 8;
1347 case SAMPLING_RATE_88P2KHZ:
1348 sample_rate_val = 7;
1350 case SAMPLING_RATE_48KHZ:
1351 sample_rate_val = 6;
1353 case SAMPLING_RATE_44P1KHZ:
1354 sample_rate_val = 5;
1356 case SAMPLING_RATE_32KHZ:
1357 sample_rate_val = 4;
1359 case SAMPLING_RATE_22P05KHZ:
1360 sample_rate_val = 3;
1362 case SAMPLING_RATE_16KHZ:
1363 sample_rate_val = 2;
1365 case SAMPLING_RATE_11P025KHZ:
1366 sample_rate_val = 1;
1368 case SAMPLING_RATE_8KHZ:
1370 sample_rate_val = 0;
1374 ucontrol->value.integer.value[0] = sample_rate_val;
1375 pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__,
1376 usb_rx_cfg.sample_rate);
1380 static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1381 struct snd_ctl_elem_value *ucontrol)
1383 switch (ucontrol->value.integer.value[0]) {
1385 usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
1388 usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
1391 usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
1394 usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
1397 usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
1400 usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
1403 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1406 usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
1409 usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
1412 usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
1415 usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
1418 usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
1421 usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
1424 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1428 pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n",
1429 __func__, ucontrol->value.integer.value[0],
1430 usb_rx_cfg.sample_rate);
1434 static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol,
1435 struct snd_ctl_elem_value *ucontrol)
1437 switch (usb_rx_cfg.bit_format) {
1438 case SNDRV_PCM_FORMAT_S32_LE:
1439 ucontrol->value.integer.value[0] = 3;
1441 case SNDRV_PCM_FORMAT_S24_3LE:
1442 ucontrol->value.integer.value[0] = 2;
1444 case SNDRV_PCM_FORMAT_S24_LE:
1445 ucontrol->value.integer.value[0] = 1;
1447 case SNDRV_PCM_FORMAT_S16_LE:
1449 ucontrol->value.integer.value[0] = 0;
1453 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
1454 __func__, usb_rx_cfg.bit_format,
1455 ucontrol->value.integer.value[0]);
1459 static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol,
1460 struct snd_ctl_elem_value *ucontrol)
1464 switch (ucontrol->value.integer.value[0]) {
1466 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
1469 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1472 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
1476 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
1479 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
1480 __func__, usb_rx_cfg.bit_format,
1481 ucontrol->value.integer.value[0]);
1486 static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol,
1487 struct snd_ctl_elem_value *ucontrol)
1489 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__,
1490 usb_tx_cfg.channels);
1491 ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1;
1495 static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol,
1496 struct snd_ctl_elem_value *ucontrol)
1498 usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1500 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels);
1504 static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1505 struct snd_ctl_elem_value *ucontrol)
1507 int sample_rate_val;
1509 switch (usb_tx_cfg.sample_rate) {
1510 case SAMPLING_RATE_384KHZ:
1511 sample_rate_val = 12;
1513 case SAMPLING_RATE_352P8KHZ:
1514 sample_rate_val = 11;
1516 case SAMPLING_RATE_192KHZ:
1517 sample_rate_val = 10;
1519 case SAMPLING_RATE_176P4KHZ:
1520 sample_rate_val = 9;
1522 case SAMPLING_RATE_96KHZ:
1523 sample_rate_val = 8;
1525 case SAMPLING_RATE_88P2KHZ:
1526 sample_rate_val = 7;
1528 case SAMPLING_RATE_48KHZ:
1529 sample_rate_val = 6;
1531 case SAMPLING_RATE_44P1KHZ:
1532 sample_rate_val = 5;
1534 case SAMPLING_RATE_32KHZ:
1535 sample_rate_val = 4;
1537 case SAMPLING_RATE_22P05KHZ:
1538 sample_rate_val = 3;
1540 case SAMPLING_RATE_16KHZ:
1541 sample_rate_val = 2;
1543 case SAMPLING_RATE_11P025KHZ:
1544 sample_rate_val = 1;
1546 case SAMPLING_RATE_8KHZ:
1547 sample_rate_val = 0;
1550 sample_rate_val = 6;
1554 ucontrol->value.integer.value[0] = sample_rate_val;
1555 pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__,
1556 usb_tx_cfg.sample_rate);
1560 static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1561 struct snd_ctl_elem_value *ucontrol)
1563 switch (ucontrol->value.integer.value[0]) {
1565 usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
1568 usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
1571 usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
1574 usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
1577 usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
1580 usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
1583 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1586 usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
1589 usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
1592 usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
1595 usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
1598 usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
1601 usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
1604 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1608 pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n",
1609 __func__, ucontrol->value.integer.value[0],
1610 usb_tx_cfg.sample_rate);
1614 static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol,
1615 struct snd_ctl_elem_value *ucontrol)
1617 switch (usb_tx_cfg.bit_format) {
1618 case SNDRV_PCM_FORMAT_S32_LE:
1619 ucontrol->value.integer.value[0] = 3;
1621 case SNDRV_PCM_FORMAT_S24_3LE:
1622 ucontrol->value.integer.value[0] = 2;
1624 case SNDRV_PCM_FORMAT_S24_LE:
1625 ucontrol->value.integer.value[0] = 1;
1627 case SNDRV_PCM_FORMAT_S16_LE:
1629 ucontrol->value.integer.value[0] = 0;
1633 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
1634 __func__, usb_tx_cfg.bit_format,
1635 ucontrol->value.integer.value[0]);
1639 static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol,
1640 struct snd_ctl_elem_value *ucontrol)
1644 switch (ucontrol->value.integer.value[0]) {
1646 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
1649 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1652 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
1656 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
1659 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
1660 __func__, usb_tx_cfg.bit_format,
1661 ucontrol->value.integer.value[0]);
1666 static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol)
1670 if (strnstr(kcontrol->id.name, "HDMI_RX", sizeof("HDMI_RX")))
1672 else if (strnstr(kcontrol->id.name, "Display Port RX",
1673 sizeof("Display Port RX")))
1676 pr_err("%s: unsupported BE: %s",
1677 __func__, kcontrol->id.name);
1684 static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol,
1685 struct snd_ctl_elem_value *ucontrol)
1687 int idx = ext_disp_get_port_idx(kcontrol);
1692 switch (ext_disp_rx_cfg[idx].bit_format) {
1693 case SNDRV_PCM_FORMAT_S24_LE:
1694 ucontrol->value.integer.value[0] = 1;
1697 case SNDRV_PCM_FORMAT_S16_LE:
1699 ucontrol->value.integer.value[0] = 0;
1703 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
1704 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
1705 ucontrol->value.integer.value[0]);
1709 static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol,
1710 struct snd_ctl_elem_value *ucontrol)
1712 int idx = ext_disp_get_port_idx(kcontrol);
1717 switch (ucontrol->value.integer.value[0]) {
1719 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE;
1723 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE;
1726 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
1727 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
1728 ucontrol->value.integer.value[0]);
1733 static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol,
1734 struct snd_ctl_elem_value *ucontrol)
1736 int idx = ext_disp_get_port_idx(kcontrol);
1741 ucontrol->value.integer.value[0] =
1742 ext_disp_rx_cfg[idx].channels - 2;
1744 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
1745 idx, ext_disp_rx_cfg[idx].channels);
1750 static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol,
1751 struct snd_ctl_elem_value *ucontrol)
1753 int idx = ext_disp_get_port_idx(kcontrol);
1758 ext_disp_rx_cfg[idx].channels =
1759 ucontrol->value.integer.value[0] + 2;
1761 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
1762 idx, ext_disp_rx_cfg[idx].channels);
1766 static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1767 struct snd_ctl_elem_value *ucontrol)
1769 int sample_rate_val;
1770 int idx = ext_disp_get_port_idx(kcontrol);
1775 switch (ext_disp_rx_cfg[idx].sample_rate) {
1776 case SAMPLING_RATE_176P4KHZ:
1777 sample_rate_val = 6;
1780 case SAMPLING_RATE_88P2KHZ:
1781 sample_rate_val = 5;
1784 case SAMPLING_RATE_44P1KHZ:
1785 sample_rate_val = 4;
1788 case SAMPLING_RATE_32KHZ:
1789 sample_rate_val = 3;
1792 case SAMPLING_RATE_192KHZ:
1793 sample_rate_val = 2;
1796 case SAMPLING_RATE_96KHZ:
1797 sample_rate_val = 1;
1800 case SAMPLING_RATE_48KHZ:
1802 sample_rate_val = 0;
1806 ucontrol->value.integer.value[0] = sample_rate_val;
1807 pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__,
1808 idx, ext_disp_rx_cfg[idx].sample_rate);
1813 static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1814 struct snd_ctl_elem_value *ucontrol)
1816 int idx = ext_disp_get_port_idx(kcontrol);
1821 switch (ucontrol->value.integer.value[0]) {
1823 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ;
1826 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ;
1829 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ;
1832 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ;
1835 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ;
1838 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ;
1842 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ;
1846 pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n",
1847 __func__, ucontrol->value.integer.value[0], idx,
1848 ext_disp_rx_cfg[idx].sample_rate);
1852 static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol,
1853 struct snd_ctl_elem_value *ucontrol)
1855 pr_debug("%s: proxy_rx channels = %d\n",
1856 __func__, proxy_rx_cfg.channels);
1857 ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2;
1862 static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol,
1863 struct snd_ctl_elem_value *ucontrol)
1865 proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2;
1866 pr_debug("%s: proxy_rx channels = %d\n",
1867 __func__, proxy_rx_cfg.channels);
1872 static int tdm_get_sample_rate(int value)
1874 int sample_rate = 0;
1878 sample_rate = SAMPLING_RATE_8KHZ;
1881 sample_rate = SAMPLING_RATE_16KHZ;
1884 sample_rate = SAMPLING_RATE_32KHZ;
1887 sample_rate = SAMPLING_RATE_44P1KHZ;
1890 sample_rate = SAMPLING_RATE_48KHZ;
1893 sample_rate = SAMPLING_RATE_96KHZ;
1896 sample_rate = SAMPLING_RATE_192KHZ;
1899 sample_rate = SAMPLING_RATE_352P8KHZ;
1902 sample_rate = SAMPLING_RATE_384KHZ;
1905 sample_rate = SAMPLING_RATE_48KHZ;
1911 static int aux_pcm_get_sample_rate(int value)
1917 sample_rate = SAMPLING_RATE_16KHZ;
1921 sample_rate = SAMPLING_RATE_8KHZ;
1927 static int tdm_get_sample_rate_val(int sample_rate)
1929 int sample_rate_val = 0;
1931 switch (sample_rate) {
1932 case SAMPLING_RATE_8KHZ:
1933 sample_rate_val = 0;
1935 case SAMPLING_RATE_16KHZ:
1936 sample_rate_val = 1;
1938 case SAMPLING_RATE_32KHZ:
1939 sample_rate_val = 2;
1941 case SAMPLING_RATE_44P1KHZ:
1942 sample_rate_val = 3;
1944 case SAMPLING_RATE_48KHZ:
1945 sample_rate_val = 4;
1947 case SAMPLING_RATE_96KHZ:
1948 sample_rate_val = 5;
1950 case SAMPLING_RATE_192KHZ:
1951 sample_rate_val = 6;
1953 case SAMPLING_RATE_352P8KHZ:
1954 sample_rate_val = 7;
1956 case SAMPLING_RATE_384KHZ:
1957 sample_rate_val = 8;
1960 sample_rate_val = 4;
1963 return sample_rate_val;
1966 static int aux_pcm_get_sample_rate_val(int sample_rate)
1968 int sample_rate_val;
1970 switch (sample_rate) {
1971 case SAMPLING_RATE_16KHZ:
1972 sample_rate_val = 1;
1974 case SAMPLING_RATE_8KHZ:
1976 sample_rate_val = 0;
1979 return sample_rate_val;
1982 static int tdm_get_mode(struct snd_kcontrol *kcontrol)
1986 if (strnstr(kcontrol->id.name, "PRI",
1987 sizeof(kcontrol->id.name))) {
1989 } else if (strnstr(kcontrol->id.name, "SEC",
1990 sizeof(kcontrol->id.name))) {
1992 } else if (strnstr(kcontrol->id.name, "TERT",
1993 sizeof(kcontrol->id.name))) {
1995 } else if (strnstr(kcontrol->id.name, "QUAT",
1996 sizeof(kcontrol->id.name))) {
1999 pr_err("%s: unsupported mode in: %s",
2000 __func__, kcontrol->id.name);
2007 static int tdm_get_channel(struct snd_kcontrol *kcontrol)
2011 if (strnstr(kcontrol->id.name, "RX_0",
2012 sizeof(kcontrol->id.name)) ||
2013 strnstr(kcontrol->id.name, "TX_0",
2014 sizeof(kcontrol->id.name))) {
2016 } else if (strnstr(kcontrol->id.name, "RX_1",
2017 sizeof(kcontrol->id.name)) ||
2018 strnstr(kcontrol->id.name, "TX_1",
2019 sizeof(kcontrol->id.name))) {
2021 } else if (strnstr(kcontrol->id.name, "RX_2",
2022 sizeof(kcontrol->id.name)) ||
2023 strnstr(kcontrol->id.name, "TX_2",
2024 sizeof(kcontrol->id.name))) {
2026 } else if (strnstr(kcontrol->id.name, "RX_3",
2027 sizeof(kcontrol->id.name)) ||
2028 strnstr(kcontrol->id.name, "TX_3",
2029 sizeof(kcontrol->id.name))) {
2031 } else if (strnstr(kcontrol->id.name, "RX_4",
2032 sizeof(kcontrol->id.name)) ||
2033 strnstr(kcontrol->id.name, "TX_4",
2034 sizeof(kcontrol->id.name))) {
2036 } else if (strnstr(kcontrol->id.name, "RX_5",
2037 sizeof(kcontrol->id.name)) ||
2038 strnstr(kcontrol->id.name, "TX_5",
2039 sizeof(kcontrol->id.name))) {
2041 } else if (strnstr(kcontrol->id.name, "RX_6",
2042 sizeof(kcontrol->id.name)) ||
2043 strnstr(kcontrol->id.name, "TX_6",
2044 sizeof(kcontrol->id.name))) {
2046 } else if (strnstr(kcontrol->id.name, "RX_7",
2047 sizeof(kcontrol->id.name)) ||
2048 strnstr(kcontrol->id.name, "TX_7",
2049 sizeof(kcontrol->id.name))) {
2052 pr_err("%s: unsupported channel in: %s",
2053 __func__, kcontrol->id.name);
2060 static int tdm_get_port_idx(struct snd_kcontrol *kcontrol,
2061 struct tdm_port *port)
2064 port->mode = tdm_get_mode(kcontrol);
2068 port->channel = tdm_get_channel(kcontrol);
2069 if (port->channel < 0)
2070 return port->channel;
2076 static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2077 struct snd_ctl_elem_value *ucontrol)
2079 struct tdm_port port;
2080 int ret = tdm_get_port_idx(kcontrol, &port);
2083 pr_err("%s: unsupported control: %s",
2084 __func__, kcontrol->id.name);
2086 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
2087 tdm_rx_cfg[port.mode][port.channel].sample_rate);
2089 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
2090 tdm_rx_cfg[port.mode][port.channel].sample_rate,
2091 ucontrol->value.enumerated.item[0]);
2096 static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2097 struct snd_ctl_elem_value *ucontrol)
2099 struct tdm_port port;
2100 int ret = tdm_get_port_idx(kcontrol, &port);
2103 pr_err("%s: unsupported control: %s",
2104 __func__, kcontrol->id.name);
2106 tdm_rx_cfg[port.mode][port.channel].sample_rate =
2107 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2109 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
2110 tdm_rx_cfg[port.mode][port.channel].sample_rate,
2111 ucontrol->value.enumerated.item[0]);
2116 static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2117 struct snd_ctl_elem_value *ucontrol)
2119 struct tdm_port port;
2120 int ret = tdm_get_port_idx(kcontrol, &port);
2123 pr_err("%s: unsupported control: %s",
2124 __func__, kcontrol->id.name);
2126 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
2127 tdm_tx_cfg[port.mode][port.channel].sample_rate);
2129 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
2130 tdm_tx_cfg[port.mode][port.channel].sample_rate,
2131 ucontrol->value.enumerated.item[0]);
2136 static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2137 struct snd_ctl_elem_value *ucontrol)
2139 struct tdm_port port;
2140 int ret = tdm_get_port_idx(kcontrol, &port);
2143 pr_err("%s: unsupported control: %s",
2144 __func__, kcontrol->id.name);
2146 tdm_tx_cfg[port.mode][port.channel].sample_rate =
2147 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2149 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
2150 tdm_tx_cfg[port.mode][port.channel].sample_rate,
2151 ucontrol->value.enumerated.item[0]);
2156 static int tdm_get_format(int value)
2162 format = SNDRV_PCM_FORMAT_S16_LE;
2165 format = SNDRV_PCM_FORMAT_S24_LE;
2168 format = SNDRV_PCM_FORMAT_S32_LE;
2171 format = SNDRV_PCM_FORMAT_S16_LE;
2177 static int tdm_get_format_val(int format)
2182 case SNDRV_PCM_FORMAT_S16_LE:
2185 case SNDRV_PCM_FORMAT_S24_LE:
2188 case SNDRV_PCM_FORMAT_S32_LE:
2198 static int tdm_rx_format_get(struct snd_kcontrol *kcontrol,
2199 struct snd_ctl_elem_value *ucontrol)
2201 struct tdm_port port;
2202 int ret = tdm_get_port_idx(kcontrol, &port);
2205 pr_err("%s: unsupported control: %s",
2206 __func__, kcontrol->id.name);
2208 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
2209 tdm_rx_cfg[port.mode][port.channel].bit_format);
2211 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
2212 tdm_rx_cfg[port.mode][port.channel].bit_format,
2213 ucontrol->value.enumerated.item[0]);
2218 static int tdm_rx_format_put(struct snd_kcontrol *kcontrol,
2219 struct snd_ctl_elem_value *ucontrol)
2221 struct tdm_port port;
2222 int ret = tdm_get_port_idx(kcontrol, &port);
2225 pr_err("%s: unsupported control: %s",
2226 __func__, kcontrol->id.name);
2228 tdm_rx_cfg[port.mode][port.channel].bit_format =
2229 tdm_get_format(ucontrol->value.enumerated.item[0]);
2231 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
2232 tdm_rx_cfg[port.mode][port.channel].bit_format,
2233 ucontrol->value.enumerated.item[0]);
2238 static int tdm_tx_format_get(struct snd_kcontrol *kcontrol,
2239 struct snd_ctl_elem_value *ucontrol)
2241 struct tdm_port port;
2242 int ret = tdm_get_port_idx(kcontrol, &port);
2245 pr_err("%s: unsupported control: %s",
2246 __func__, kcontrol->id.name);
2248 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
2249 tdm_tx_cfg[port.mode][port.channel].bit_format);
2251 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
2252 tdm_tx_cfg[port.mode][port.channel].bit_format,
2253 ucontrol->value.enumerated.item[0]);
2258 static int tdm_tx_format_put(struct snd_kcontrol *kcontrol,
2259 struct snd_ctl_elem_value *ucontrol)
2261 struct tdm_port port;
2262 int ret = tdm_get_port_idx(kcontrol, &port);
2265 pr_err("%s: unsupported control: %s",
2266 __func__, kcontrol->id.name);
2268 tdm_tx_cfg[port.mode][port.channel].bit_format =
2269 tdm_get_format(ucontrol->value.enumerated.item[0]);
2271 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
2272 tdm_tx_cfg[port.mode][port.channel].bit_format,
2273 ucontrol->value.enumerated.item[0]);
2278 static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol,
2279 struct snd_ctl_elem_value *ucontrol)
2281 struct tdm_port port;
2282 int ret = tdm_get_port_idx(kcontrol, &port);
2285 pr_err("%s: unsupported control: %s",
2286 __func__, kcontrol->id.name);
2289 ucontrol->value.enumerated.item[0] =
2290 tdm_rx_cfg[port.mode][port.channel].channels - 1;
2292 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
2293 tdm_rx_cfg[port.mode][port.channel].channels - 1,
2294 ucontrol->value.enumerated.item[0]);
2299 static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol,
2300 struct snd_ctl_elem_value *ucontrol)
2302 struct tdm_port port;
2303 int ret = tdm_get_port_idx(kcontrol, &port);
2306 pr_err("%s: unsupported control: %s",
2307 __func__, kcontrol->id.name);
2309 tdm_rx_cfg[port.mode][port.channel].channels =
2310 ucontrol->value.enumerated.item[0] + 1;
2312 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
2313 tdm_rx_cfg[port.mode][port.channel].channels,
2314 ucontrol->value.enumerated.item[0] + 1);
2319 static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol,
2320 struct snd_ctl_elem_value *ucontrol)
2322 struct tdm_port port;
2323 int ret = tdm_get_port_idx(kcontrol, &port);
2326 pr_err("%s: unsupported control: %s",
2327 __func__, kcontrol->id.name);
2329 ucontrol->value.enumerated.item[0] =
2330 tdm_tx_cfg[port.mode][port.channel].channels - 1;
2332 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
2333 tdm_tx_cfg[port.mode][port.channel].channels - 1,
2334 ucontrol->value.enumerated.item[0]);
2339 static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol,
2340 struct snd_ctl_elem_value *ucontrol)
2342 struct tdm_port port;
2343 int ret = tdm_get_port_idx(kcontrol, &port);
2346 pr_err("%s: unsupported control: %s",
2347 __func__, kcontrol->id.name);
2349 tdm_tx_cfg[port.mode][port.channel].channels =
2350 ucontrol->value.enumerated.item[0] + 1;
2352 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
2353 tdm_tx_cfg[port.mode][port.channel].channels,
2354 ucontrol->value.enumerated.item[0] + 1);
2359 static int tdm_get_slot_num_val(int slot_num)
2386 return slot_num_val;
2389 static int tdm_slot_num_get(struct snd_kcontrol *kcontrol,
2390 struct snd_ctl_elem_value *ucontrol)
2392 int mode = tdm_get_mode(kcontrol);
2395 pr_err("%s: unsupported control: %s",
2396 __func__, kcontrol->id.name);
2400 ucontrol->value.enumerated.item[0] =
2401 tdm_get_slot_num_val(tdm_slot[mode].num);
2403 pr_debug("%s: mode = %d, tdm_slot_num = %d, item = %d\n", __func__,
2404 mode, tdm_slot[mode].num,
2405 ucontrol->value.enumerated.item[0]);
2410 static int tdm_get_slot_num(int value)
2440 static int tdm_slot_num_put(struct snd_kcontrol *kcontrol,
2441 struct snd_ctl_elem_value *ucontrol)
2443 int mode = tdm_get_mode(kcontrol);
2446 pr_err("%s: unsupported control: %s",
2447 __func__, kcontrol->id.name);
2451 tdm_slot[mode].num =
2452 tdm_get_slot_num(ucontrol->value.enumerated.item[0]);
2454 pr_debug("%s: mode = %d, tdm_slot_num = %d, item = %d\n", __func__,
2455 mode, tdm_slot[mode].num,
2456 ucontrol->value.enumerated.item[0]);
2461 static int tdm_get_slot_width_val(int slot_width)
2465 switch (slot_width) {
2479 return slot_width_val;
2482 static int tdm_slot_width_get(struct snd_kcontrol *kcontrol,
2483 struct snd_ctl_elem_value *ucontrol)
2485 int mode = tdm_get_mode(kcontrol);
2488 pr_err("%s: unsupported control: %s",
2489 __func__, kcontrol->id.name);
2493 ucontrol->value.enumerated.item[0] =
2494 tdm_get_slot_width_val(tdm_slot[mode].width);
2496 pr_debug("%s: mode = %d, tdm_slot_width = %d, item = %d\n", __func__,
2497 mode, tdm_slot[mode].width,
2498 ucontrol->value.enumerated.item[0]);
2503 static int tdm_get_slot_width(int value)
2524 static int tdm_slot_width_put(struct snd_kcontrol *kcontrol,
2525 struct snd_ctl_elem_value *ucontrol)
2527 int mode = tdm_get_mode(kcontrol);
2530 pr_err("%s: unsupported control: %s",
2531 __func__, kcontrol->id.name);
2535 tdm_slot[mode].width =
2536 tdm_get_slot_width(ucontrol->value.enumerated.item[0]);
2538 pr_debug("%s: mode = %d, tdm_slot_width = %d, item = %d\n", __func__,
2539 mode, tdm_slot[mode].width,
2540 ucontrol->value.enumerated.item[0]);
2545 static int tdm_rx_slot_mapping_get(struct snd_kcontrol *kcontrol,
2546 struct snd_ctl_elem_value *ucontrol)
2548 unsigned int *slot_offset;
2550 struct tdm_port port;
2551 int ret = tdm_get_port_idx(kcontrol, &port);
2554 pr_err("%s: unsupported control: %s",
2555 __func__, kcontrol->id.name);
2557 if (port.mode < TDM_INTERFACE_MAX &&
2558 port.channel < TDM_PORT_MAX) {
2560 tdm_rx_slot_offset[port.mode][port.channel];
2561 pr_debug("%s: mode = %d, channel = %d\n",
2562 __func__, port.mode, port.channel);
2563 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
2564 ucontrol->value.integer.value[i] =
2566 pr_debug("%s: offset %d, value %d\n",
2567 __func__, i, slot_offset[i]);
2570 pr_err("%s: unsupported mode/channel", __func__);
2576 static int tdm_rx_slot_mapping_put(struct snd_kcontrol *kcontrol,
2577 struct snd_ctl_elem_value *ucontrol)
2579 unsigned int *slot_offset;
2581 struct tdm_port port;
2582 int ret = tdm_get_port_idx(kcontrol, &port);
2585 pr_err("%s: unsupported control: %s",
2586 __func__, kcontrol->id.name);
2588 if (port.mode < TDM_INTERFACE_MAX &&
2589 port.channel < TDM_PORT_MAX) {
2591 tdm_rx_slot_offset[port.mode][port.channel];
2592 pr_debug("%s: mode = %d, channel = %d\n",
2593 __func__, port.mode, port.channel);
2594 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
2596 ucontrol->value.integer.value[i];
2597 pr_debug("%s: offset %d, value %d\n",
2598 __func__, i, slot_offset[i]);
2601 pr_err("%s: unsupported mode/channel", __func__);
2607 static int tdm_tx_slot_mapping_get(struct snd_kcontrol *kcontrol,
2608 struct snd_ctl_elem_value *ucontrol)
2610 unsigned int *slot_offset;
2612 struct tdm_port port;
2613 int ret = tdm_get_port_idx(kcontrol, &port);
2616 pr_err("%s: unsupported control: %s",
2617 __func__, kcontrol->id.name);
2619 if (port.mode < TDM_INTERFACE_MAX &&
2620 port.channel < TDM_PORT_MAX) {
2622 tdm_tx_slot_offset[port.mode][port.channel];
2623 pr_debug("%s: mode = %d, channel = %d\n",
2624 __func__, port.mode, port.channel);
2625 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
2626 ucontrol->value.integer.value[i] =
2628 pr_debug("%s: offset %d, value %d\n",
2629 __func__, i, slot_offset[i]);
2632 pr_err("%s: unsupported mode/channel", __func__);
2638 static int tdm_tx_slot_mapping_put(struct snd_kcontrol *kcontrol,
2639 struct snd_ctl_elem_value *ucontrol)
2641 unsigned int *slot_offset;
2643 struct tdm_port port;
2644 int ret = tdm_get_port_idx(kcontrol, &port);
2647 pr_err("%s: unsupported control: %s",
2648 __func__, kcontrol->id.name);
2650 if (port.mode < TDM_INTERFACE_MAX &&
2651 port.channel < TDM_PORT_MAX) {
2653 tdm_tx_slot_offset[port.mode][port.channel];
2654 pr_debug("%s: mode = %d, channel = %d\n",
2655 __func__, port.mode, port.channel);
2656 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
2658 ucontrol->value.integer.value[i];
2659 pr_debug("%s: offset %d, value %d\n",
2660 __func__, i, slot_offset[i]);
2663 pr_err("%s: unsupported mode/channel", __func__);
2669 static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol)
2673 if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM",
2674 sizeof("PRIM_AUX_PCM")))
2676 else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM",
2677 sizeof("SEC_AUX_PCM")))
2679 else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM",
2680 sizeof("TERT_AUX_PCM")))
2682 else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM",
2683 sizeof("QUAT_AUX_PCM")))
2686 pr_err("%s: unsupported port: %s",
2687 __func__, kcontrol->id.name);
2694 static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2695 struct snd_ctl_elem_value *ucontrol)
2697 int idx = aux_pcm_get_port_idx(kcontrol);
2702 aux_pcm_rx_cfg[idx].sample_rate =
2703 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2705 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2706 idx, aux_pcm_rx_cfg[idx].sample_rate,
2707 ucontrol->value.enumerated.item[0]);
2712 static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2713 struct snd_ctl_elem_value *ucontrol)
2715 int idx = aux_pcm_get_port_idx(kcontrol);
2720 ucontrol->value.enumerated.item[0] =
2721 aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate);
2723 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2724 idx, aux_pcm_rx_cfg[idx].sample_rate,
2725 ucontrol->value.enumerated.item[0]);
2730 static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2731 struct snd_ctl_elem_value *ucontrol)
2733 int idx = aux_pcm_get_port_idx(kcontrol);
2738 aux_pcm_tx_cfg[idx].sample_rate =
2739 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2741 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2742 idx, aux_pcm_tx_cfg[idx].sample_rate,
2743 ucontrol->value.enumerated.item[0]);
2748 static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2749 struct snd_ctl_elem_value *ucontrol)
2751 int idx = aux_pcm_get_port_idx(kcontrol);
2756 ucontrol->value.enumerated.item[0] =
2757 aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate);
2759 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2760 idx, aux_pcm_tx_cfg[idx].sample_rate,
2761 ucontrol->value.enumerated.item[0]);
2766 static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol)
2770 if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX",
2771 sizeof("PRIM_MI2S_RX")))
2773 else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX",
2774 sizeof("SEC_MI2S_RX")))
2776 else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX",
2777 sizeof("TERT_MI2S_RX")))
2779 else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX",
2780 sizeof("QUAT_MI2S_RX")))
2782 else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX",
2783 sizeof("PRIM_MI2S_TX")))
2785 else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX",
2786 sizeof("SEC_MI2S_TX")))
2788 else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX",
2789 sizeof("TERT_MI2S_TX")))
2791 else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX",
2792 sizeof("QUAT_MI2S_TX")))
2795 pr_err("%s: unsupported channel: %s",
2796 __func__, kcontrol->id.name);
2803 static int mi2s_get_sample_rate_val(int sample_rate)
2805 int sample_rate_val;
2807 switch (sample_rate) {
2808 case SAMPLING_RATE_8KHZ:
2809 sample_rate_val = 0;
2811 case SAMPLING_RATE_16KHZ:
2812 sample_rate_val = 1;
2814 case SAMPLING_RATE_32KHZ:
2815 sample_rate_val = 2;
2817 case SAMPLING_RATE_44P1KHZ:
2818 sample_rate_val = 3;
2820 case SAMPLING_RATE_48KHZ:
2821 sample_rate_val = 4;
2823 case SAMPLING_RATE_88P2KHZ:
2824 sample_rate_val = 5;
2826 case SAMPLING_RATE_96KHZ:
2827 sample_rate_val = 6;
2829 case SAMPLING_RATE_176P4KHZ:
2830 sample_rate_val = 7;
2832 case SAMPLING_RATE_192KHZ:
2833 sample_rate_val = 8;
2836 sample_rate_val = 4;
2839 return sample_rate_val;
2842 static int mi2s_get_sample_rate(int value)
2848 sample_rate = SAMPLING_RATE_8KHZ;
2851 sample_rate = SAMPLING_RATE_16KHZ;
2854 sample_rate = SAMPLING_RATE_32KHZ;
2857 sample_rate = SAMPLING_RATE_44P1KHZ;
2860 sample_rate = SAMPLING_RATE_48KHZ;
2863 sample_rate = SAMPLING_RATE_88P2KHZ;
2866 sample_rate = SAMPLING_RATE_96KHZ;
2869 sample_rate = SAMPLING_RATE_176P4KHZ;
2872 sample_rate = SAMPLING_RATE_192KHZ;
2875 sample_rate = SAMPLING_RATE_48KHZ;
2881 static int mi2s_get_format(int value)
2887 format = SNDRV_PCM_FORMAT_S16_LE;
2890 format = SNDRV_PCM_FORMAT_S24_LE;
2893 format = SNDRV_PCM_FORMAT_S24_3LE;
2896 format = SNDRV_PCM_FORMAT_S32_LE;
2899 format = SNDRV_PCM_FORMAT_S16_LE;
2905 static int mi2s_get_format_value(int format)
2910 case SNDRV_PCM_FORMAT_S16_LE:
2913 case SNDRV_PCM_FORMAT_S24_LE:
2916 case SNDRV_PCM_FORMAT_S24_3LE:
2919 case SNDRV_PCM_FORMAT_S32_LE:
2929 static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2930 struct snd_ctl_elem_value *ucontrol)
2932 int idx = mi2s_get_port_idx(kcontrol);
2937 mi2s_rx_cfg[idx].sample_rate =
2938 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
2940 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2941 idx, mi2s_rx_cfg[idx].sample_rate,
2942 ucontrol->value.enumerated.item[0]);
2947 static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2948 struct snd_ctl_elem_value *ucontrol)
2950 int idx = mi2s_get_port_idx(kcontrol);
2955 ucontrol->value.enumerated.item[0] =
2956 mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate);
2958 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2959 idx, mi2s_rx_cfg[idx].sample_rate,
2960 ucontrol->value.enumerated.item[0]);
2965 static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2966 struct snd_ctl_elem_value *ucontrol)
2968 int idx = mi2s_get_port_idx(kcontrol);
2973 mi2s_tx_cfg[idx].sample_rate =
2974 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
2976 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2977 idx, mi2s_tx_cfg[idx].sample_rate,
2978 ucontrol->value.enumerated.item[0]);
2983 static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2984 struct snd_ctl_elem_value *ucontrol)
2986 int idx = mi2s_get_port_idx(kcontrol);
2991 ucontrol->value.enumerated.item[0] =
2992 mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate);
2994 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2995 idx, mi2s_tx_cfg[idx].sample_rate,
2996 ucontrol->value.enumerated.item[0]);
3001 static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol,
3002 struct snd_ctl_elem_value *ucontrol)
3004 int idx = mi2s_get_port_idx(kcontrol);
3009 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
3010 idx, mi2s_rx_cfg[idx].channels);
3011 ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1;
3016 static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol,
3017 struct snd_ctl_elem_value *ucontrol)
3019 int idx = mi2s_get_port_idx(kcontrol);
3024 mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
3025 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
3026 idx, mi2s_rx_cfg[idx].channels);
3031 static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol,
3032 struct snd_ctl_elem_value *ucontrol)
3034 int idx = mi2s_get_port_idx(kcontrol);
3039 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
3040 idx, mi2s_tx_cfg[idx].channels);
3041 ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1;
3046 static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol,
3047 struct snd_ctl_elem_value *ucontrol)
3049 int idx = mi2s_get_port_idx(kcontrol);
3054 mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
3055 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
3056 idx, mi2s_tx_cfg[idx].channels);
3061 static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol,
3062 struct snd_ctl_elem_value *ucontrol)
3064 int idx = mi2s_get_port_idx(kcontrol);
3069 ucontrol->value.enumerated.item[0] =
3070 mi2s_get_format_value(mi2s_rx_cfg[idx].bit_format);
3072 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
3073 idx, mi2s_rx_cfg[idx].bit_format,
3074 ucontrol->value.enumerated.item[0]);
3079 static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol,
3080 struct snd_ctl_elem_value *ucontrol)
3082 int idx = mi2s_get_port_idx(kcontrol);
3087 mi2s_rx_cfg[idx].bit_format =
3088 mi2s_get_format(ucontrol->value.enumerated.item[0]);
3090 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
3091 idx, mi2s_rx_cfg[idx].bit_format,
3092 ucontrol->value.enumerated.item[0]);
3097 static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol,
3098 struct snd_ctl_elem_value *ucontrol)
3100 int idx = mi2s_get_port_idx(kcontrol);
3105 ucontrol->value.enumerated.item[0] =
3106 mi2s_get_format_value(mi2s_tx_cfg[idx].bit_format);
3108 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
3109 idx, mi2s_tx_cfg[idx].bit_format,
3110 ucontrol->value.enumerated.item[0]);
3115 static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol,
3116 struct snd_ctl_elem_value *ucontrol)
3118 int idx = mi2s_get_port_idx(kcontrol);
3123 mi2s_tx_cfg[idx].bit_format =
3124 mi2s_get_format(ucontrol->value.enumerated.item[0]);
3126 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
3127 idx, mi2s_tx_cfg[idx].bit_format,
3128 ucontrol->value.enumerated.item[0]);
3133 static int msm_hifi_ctrl(struct snd_soc_codec *codec)
3135 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
3136 struct snd_soc_card *card = codec->component.card;
3137 struct msm_asoc_mach_data *pdata =
3138 snd_soc_card_get_drvdata(card);
3140 pr_debug("%s: msm_hifi_control = %d", __func__,
3143 if (!pdata || !pdata->hph_en1_gpio_p) {
3144 pr_err("%s: hph_en1_gpio is invalid\n", __func__);
3147 if (msm_hifi_control == MSM_HIFI_ON) {
3148 msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p);
3149 /* 5msec delay needed as per HW requirement */
3150 usleep_range(5000, 5010);
3152 msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p);
3154 snd_soc_dapm_sync(dapm);
3159 static int msm_hifi_get(struct snd_kcontrol *kcontrol,
3160 struct snd_ctl_elem_value *ucontrol)
3162 pr_debug("%s: msm_hifi_control = %d\n",
3163 __func__, msm_hifi_control);
3164 ucontrol->value.integer.value[0] = msm_hifi_control;
3169 static int msm_hifi_put(struct snd_kcontrol *kcontrol,
3170 struct snd_ctl_elem_value *ucontrol)
3172 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
3174 pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n",
3175 __func__, ucontrol->value.integer.value[0]);
3177 msm_hifi_control = ucontrol->value.integer.value[0];
3178 msm_hifi_ctrl(codec);
3183 #ifdef CONFIG_MACH_XIAOMI_MSM8998
3184 static int ras_switch_get(struct snd_kcontrol *kcontrol,
3185 struct snd_ctl_elem_value *ucontrol)
3190 if (gpio_is_valid(ras_switch_en_gpio))
3191 en = gpio_get_value(ras_switch_en_gpio);
3192 if (gpio_is_valid(ras_switch_sel_gpio))
3193 sel = gpio_get_value(ras_switch_sel_gpio);
3194 pr_debug("%s: ras pin state, en(%d) = %d, sel(%d)=%d\n", __func__,
3195 ras_switch_en_gpio, en, ras_switch_sel_gpio, sel);
3198 ucontrol->value.integer.value[0] = 0;
3200 ucontrol->value.integer.value[0] = 1;
3202 ucontrol->value.integer.value[0] = 2;
3206 static int ras_switch_put(struct snd_kcontrol *kcontrol,
3207 struct snd_ctl_elem_value *ucontrol)
3209 int value = ucontrol->value.integer.value[0];
3211 pr_debug("%s: value = %d\n", __func__, value);
3213 if (gpio_is_valid(ras_switch_en_gpio) &&
3214 gpio_is_valid(ras_switch_sel_gpio)) {
3217 gpio_direction_output(ras_switch_en_gpio, 0);
3218 gpio_direction_output(ras_switch_sel_gpio, 0);
3221 gpio_direction_output(ras_switch_en_gpio, 1);
3222 gpio_direction_output(ras_switch_sel_gpio, 0);
3225 gpio_direction_output(ras_switch_en_gpio, 1);
3226 gpio_direction_output(ras_switch_sel_gpio, 1);
3235 static int usbhs_direction_get(struct snd_kcontrol *kcontrol,
3236 struct snd_ctl_elem_value *ucontrol)
3238 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
3239 struct snd_soc_card *card = codec->component.card;
3240 struct msm_asoc_mach_data *pdata =
3241 snd_soc_card_get_drvdata(card);
3243 ucontrol->value.integer.value[0] = 0;
3245 codec = snd_soc_kcontrol_codec(kcontrol);
3247 card = codec->component.card;
3249 pdata = snd_soc_card_get_drvdata(card);
3255 if (pdata->us_euro_gpio_p)
3256 ucontrol->value.integer.value[0] = msm_cdc_pinctrl_get_state(pdata->us_euro_gpio_p);
3257 else if (pdata->us_euro_gpio >= 0)
3258 ucontrol->value.integer.value[0] = gpio_get_value_cansleep(pdata->us_euro_gpio);
3263 static int spk_id_get(struct device_node *np, int type)
3268 state = spk_id_get_pin_3state(np);
3270 pr_err("%s: Can not get id pin state, %d\n", __func__, state);
3271 return VENDOR_ID_NONE;
3282 id = VENDOR_ID_UNKNOWN;
3291 id = VENDOR_ID_UNKNOWN;
3298 static int vendor_id_get(struct snd_kcontrol *kcontrol,
3299 struct snd_ctl_elem_value *ucontrol)
3301 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
3302 struct snd_soc_card *card = codec->component.card;
3303 struct msm_asoc_mach_data *pdata =
3304 snd_soc_card_get_drvdata(card);
3306 ucontrol->value.integer.value[0] = 0;
3308 codec = snd_soc_kcontrol_codec(kcontrol);
3310 card = codec->component.card;
3312 pdata = snd_soc_card_get_drvdata(card);
3318 if (!strncmp(kcontrol->id.name, "SPK ID", strlen("SPK ID"))) {
3319 if (pdata->spk_id_gpio_p)
3320 ucontrol->value.integer.value[0] = spk_id_get(pdata->spk_id_gpio_p, 0);
3322 if (pdata->rcv_id_gpio_p)
3323 ucontrol->value.integer.value[0] = spk_id_get(pdata->rcv_id_gpio_p, 1);
3329 static int ultrasound_power_get(struct snd_kcontrol *kcontrol,
3330 struct snd_ctl_elem_value *ucontrol)
3332 ucontrol->value.integer.value[0] = ultrasound_power_state;
3336 static int ultrasound_power_put(struct snd_kcontrol *kcontrol,
3337 struct snd_ctl_elem_value *ucontrol)
3339 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
3340 struct snd_soc_card *card = codec->component.card;
3341 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
3344 ultrasound_power_state = ucontrol->value.integer.value[0];
3345 pr_debug("%s: ultrasound power %d\n", __func__, ultrasound_power_state);
3347 if (ultrasound_power_state == 1) {
3348 if (pdata->us_p_power)
3349 ret = regulator_enable(pdata->us_p_power);
3350 if (pdata->us_n_power)
3351 ret = regulator_enable(pdata->us_n_power);
3353 if (pdata->us_p_power)
3354 ret = regulator_disable(pdata->us_p_power);
3355 if (pdata->us_n_power)
3356 ret = regulator_disable(pdata->us_n_power);
3363 static const struct snd_kcontrol_new msm_snd_controls[] = {
3364 SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs,
3365 msm_slim_rx_ch_get, msm_slim_rx_ch_put),
3366 SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs,
3367 msm_slim_rx_ch_get, msm_slim_rx_ch_put),
3368 SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs,
3369 msm_slim_tx_ch_get, msm_slim_tx_ch_put),
3370 SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs,
3371 msm_slim_tx_ch_get, msm_slim_tx_ch_put),
3372 SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs,
3373 msm_slim_rx_ch_get, msm_slim_rx_ch_put),
3374 SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs,
3375 msm_slim_rx_ch_get, msm_slim_rx_ch_put),
3376 SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs,
3377 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
3378 SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
3379 usb_audio_rx_ch_get, usb_audio_rx_ch_put),
3380 SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
3381 usb_audio_tx_ch_get, usb_audio_tx_ch_put),
3382 SOC_ENUM_EXT("HDMI_RX Channels", ext_disp_rx_chs,
3383 ext_disp_rx_ch_get, ext_disp_rx_ch_put),
3384 SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
3385 ext_disp_rx_ch_get, ext_disp_rx_ch_put),
3386 SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs,
3387 proxy_rx_ch_get, proxy_rx_ch_put),
3388 SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format,
3389 slim_rx_bit_format_get, slim_rx_bit_format_put),
3390 SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format,
3391 slim_rx_bit_format_get, slim_rx_bit_format_put),
3392 SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format,
3393 slim_rx_bit_format_get, slim_rx_bit_format_put),
3394 SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format,
3395 slim_tx_bit_format_get, slim_tx_bit_format_put),
3396 SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
3397 usb_audio_rx_format_get, usb_audio_rx_format_put),
3398 SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
3399 usb_audio_tx_format_get, usb_audio_tx_format_put),
3400 SOC_ENUM_EXT("HDMI_RX Bit Format", ext_disp_rx_format,
3401 ext_disp_rx_format_get, ext_disp_rx_format_put),
3402 SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
3403 ext_disp_rx_format_get, ext_disp_rx_format_put),
3404 SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate,
3405 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3406 SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate,
3407 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3408 SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate,
3409 slim_tx_sample_rate_get, slim_tx_sample_rate_put),
3410 SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate,
3411 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3412 SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate,
3413 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3414 SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
3415 msm_bt_sample_rate_get,
3416 msm_bt_sample_rate_put),
3417 SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
3418 msm_bt_sample_rate_rx_get,
3419 msm_bt_sample_rate_rx_put),
3420 SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
3421 msm_bt_sample_rate_tx_get,
3422 msm_bt_sample_rate_tx_put),
3423 SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate,
3424 usb_audio_rx_sample_rate_get,
3425 usb_audio_rx_sample_rate_put),
3426 SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate,
3427 usb_audio_tx_sample_rate_get,
3428 usb_audio_tx_sample_rate_put),
3429 SOC_ENUM_EXT("HDMI_RX SampleRate", ext_disp_rx_sample_rate,
3430 ext_disp_rx_sample_rate_get,
3431 ext_disp_rx_sample_rate_put),
3432 SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate,
3433 ext_disp_rx_sample_rate_get,
3434 ext_disp_rx_sample_rate_put),
3435 SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3436 tdm_rx_sample_rate_get,
3437 tdm_rx_sample_rate_put),
3438 SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3439 tdm_tx_sample_rate_get,
3440 tdm_tx_sample_rate_put),
3441 SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format,
3444 SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format,
3447 SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs,
3450 SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs,
3453 SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3454 tdm_rx_sample_rate_get,
3455 tdm_rx_sample_rate_put),
3456 SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3457 tdm_tx_sample_rate_get,
3458 tdm_tx_sample_rate_put),
3459 SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format,
3462 SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format,
3465 SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs,
3468 SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs,
3471 SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3472 tdm_rx_sample_rate_get,
3473 tdm_rx_sample_rate_put),
3474 SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3475 tdm_tx_sample_rate_get,
3476 tdm_tx_sample_rate_put),
3477 SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format,
3480 SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format,
3483 SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs,
3486 SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs,
3489 SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3490 tdm_rx_sample_rate_get,
3491 tdm_rx_sample_rate_put),
3492 SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3493 tdm_tx_sample_rate_get,
3494 tdm_tx_sample_rate_put),
3495 SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format,
3498 SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format,
3501 SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs,
3504 SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs,
3507 SOC_ENUM_EXT("PRI_TDM SlotNumber", tdm_slot_num,
3508 tdm_slot_num_get, tdm_slot_num_put),
3509 SOC_ENUM_EXT("PRI_TDM SlotWidth", tdm_slot_width,
3510 tdm_slot_width_get, tdm_slot_width_put),
3511 SOC_ENUM_EXT("SEC_TDM SlotNumber", tdm_slot_num,
3512 tdm_slot_num_get, tdm_slot_num_put),
3513 SOC_ENUM_EXT("SEC_TDM SlotWidth", tdm_slot_width,
3514 tdm_slot_width_get, tdm_slot_width_put),
3515 SOC_ENUM_EXT("TERT_TDM SlotNumber", tdm_slot_num,
3516 tdm_slot_num_get, tdm_slot_num_put),
3517 SOC_ENUM_EXT("TERT_TDM SlotWidth", tdm_slot_width,
3518 tdm_slot_width_get, tdm_slot_width_put),
3519 SOC_ENUM_EXT("QUAT_TDM SlotNumber", tdm_slot_num,
3520 tdm_slot_num_get, tdm_slot_num_put),
3521 SOC_ENUM_EXT("QUAT_TDM SlotWidth", tdm_slot_width,
3522 tdm_slot_width_get, tdm_slot_width_put),
3523 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_0 SlotMapping",
3524 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3525 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3526 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_1 SlotMapping",
3527 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3528 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3529 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_2 SlotMapping",
3530 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3531 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3532 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_3 SlotMapping",
3533 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3534 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3535 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_4 SlotMapping",
3536 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3537 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3538 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_5 SlotMapping",
3539 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3540 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3541 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_6 SlotMapping",
3542 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3543 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3544 SOC_SINGLE_MULTI_EXT("PRI_TDM_RX_7 SlotMapping",
3545 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3546 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3547 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_0 SlotMapping",
3548 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3549 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3550 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_1 SlotMapping",
3551 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3552 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3553 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_2 SlotMapping",
3554 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3555 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3556 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_3 SlotMapping",
3557 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3558 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3559 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_4 SlotMapping",
3560 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3561 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3562 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_5 SlotMapping",
3563 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3564 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3565 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_6 SlotMapping",
3566 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3567 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3568 SOC_SINGLE_MULTI_EXT("PRI_TDM_TX_7 SlotMapping",
3569 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3570 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3571 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_0 SlotMapping",
3572 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3573 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3574 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_1 SlotMapping",
3575 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3576 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3577 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_2 SlotMapping",
3578 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3579 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3580 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_3 SlotMapping",
3581 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3582 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3583 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_4 SlotMapping",
3584 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3585 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3586 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_5 SlotMapping",
3587 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3588 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3589 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_6 SlotMapping",
3590 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3591 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3592 SOC_SINGLE_MULTI_EXT("SEC_TDM_RX_7 SlotMapping",
3593 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3594 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3595 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_0 SlotMapping",
3596 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3597 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3598 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_1 SlotMapping",
3599 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3600 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3601 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_2 SlotMapping",
3602 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3603 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3604 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_3 SlotMapping",
3605 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3606 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3607 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_4 SlotMapping",
3608 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3609 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3610 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_5 SlotMapping",
3611 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3612 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3613 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_6 SlotMapping",
3614 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3615 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3616 SOC_SINGLE_MULTI_EXT("SEC_TDM_TX_7 SlotMapping",
3617 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3618 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3619 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_0 SlotMapping",
3620 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3621 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3622 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_1 SlotMapping",
3623 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3624 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3625 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_2 SlotMapping",
3626 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3627 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3628 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_3 SlotMapping",
3629 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3630 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3631 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_4 SlotMapping",
3632 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3633 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3634 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_5 SlotMapping",
3635 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3636 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3637 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_6 SlotMapping",
3638 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3639 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3640 SOC_SINGLE_MULTI_EXT("TERT_TDM_RX_7 SlotMapping",
3641 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3642 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3643 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_0 SlotMapping",
3644 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3645 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3646 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_1 SlotMapping",
3647 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3648 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3649 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_2 SlotMapping",
3650 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3651 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3652 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_3 SlotMapping",
3653 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3654 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3655 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_4 SlotMapping",
3656 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3657 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3658 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_5 SlotMapping",
3659 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3660 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3661 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_6 SlotMapping",
3662 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3663 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3664 SOC_SINGLE_MULTI_EXT("TERT_TDM_TX_7 SlotMapping",
3665 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3666 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3667 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_0 SlotMapping",
3668 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3669 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3670 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_1 SlotMapping",
3671 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3672 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3673 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_2 SlotMapping",
3674 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3675 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3676 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_3 SlotMapping",
3677 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3678 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3679 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_4 SlotMapping",
3680 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3681 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3682 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_5 SlotMapping",
3683 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3684 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3685 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_6 SlotMapping",
3686 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3687 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3688 SOC_SINGLE_MULTI_EXT("QUAT_TDM_RX_7 SlotMapping",
3689 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3690 tdm_rx_slot_mapping_get, tdm_rx_slot_mapping_put),
3691 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_0 SlotMapping",
3692 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3693 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3694 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_1 SlotMapping",
3695 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3696 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3697 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_2 SlotMapping",
3698 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3699 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3700 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_3 SlotMapping",
3701 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3702 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3703 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_4 SlotMapping",
3704 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3705 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3706 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_5 SlotMapping",
3707 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3708 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3709 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_6 SlotMapping",
3710 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3711 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3712 SOC_SINGLE_MULTI_EXT("QUAT_TDM_TX_7 SlotMapping",
3713 SND_SOC_NOPM, 0, 0xFFFF, 0, TDM_SLOT_OFFSET_MAX,
3714 tdm_tx_slot_mapping_get, tdm_tx_slot_mapping_put),
3715 SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
3716 aux_pcm_rx_sample_rate_get,
3717 aux_pcm_rx_sample_rate_put),
3718 SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate,
3719 aux_pcm_rx_sample_rate_get,
3720 aux_pcm_rx_sample_rate_put),
3721 SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
3722 aux_pcm_rx_sample_rate_get,
3723 aux_pcm_rx_sample_rate_put),
3724 SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
3725 aux_pcm_rx_sample_rate_get,
3726 aux_pcm_rx_sample_rate_put),
3727 SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
3728 aux_pcm_tx_sample_rate_get,
3729 aux_pcm_tx_sample_rate_put),
3730 SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate,
3731 aux_pcm_tx_sample_rate_get,
3732 aux_pcm_tx_sample_rate_put),
3733 SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
3734 aux_pcm_tx_sample_rate_get,
3735 aux_pcm_tx_sample_rate_put),
3736 SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
3737 aux_pcm_tx_sample_rate_get,
3738 aux_pcm_tx_sample_rate_put),
3739 SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
3740 mi2s_rx_sample_rate_get,
3741 mi2s_rx_sample_rate_put),
3742 SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate,
3743 mi2s_rx_sample_rate_get,
3744 mi2s_rx_sample_rate_put),
3745 SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
3746 mi2s_rx_sample_rate_get,
3747 mi2s_rx_sample_rate_put),
3748 SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
3749 mi2s_rx_sample_rate_get,
3750 mi2s_rx_sample_rate_put),
3751 SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
3752 mi2s_tx_sample_rate_get,
3753 mi2s_tx_sample_rate_put),
3754 SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate,
3755 mi2s_tx_sample_rate_get,
3756 mi2s_tx_sample_rate_put),
3757 SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
3758 mi2s_tx_sample_rate_get,
3759 mi2s_tx_sample_rate_put),
3760 SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
3761 mi2s_tx_sample_rate_get,
3762 mi2s_tx_sample_rate_put),
3763 SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs,
3764 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3765 SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs,
3766 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3767 SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs,
3768 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3769 SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs,
3770 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3771 SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs,
3772 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3773 SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs,
3774 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3775 SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs,
3776 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3777 SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs,
3778 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3779 SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
3780 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3781 SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
3782 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3783 SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
3784 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3785 SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
3786 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3787 SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
3788 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3789 SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
3790 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3791 SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
3792 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3793 SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
3794 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3795 SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get,
3797 #ifdef CONFIG_MACH_XIAOMI_MSM8998
3798 SOC_ENUM_EXT("RAS Switch", ras_switch,
3799 ras_switch_get, ras_switch_put),
3800 SOC_SINGLE_EXT("USB Headset Direction", 0, 0, UINT_MAX, 0,
3801 usbhs_direction_get, NULL),
3802 SOC_ENUM_EXT("RCV ID", vendor_id, vendor_id_get, NULL),
3803 SOC_ENUM_EXT("SPK ID", vendor_id, vendor_id_get, NULL),
3804 SOC_ENUM_EXT("Ultrasound Power", ultrasound_power,
3805 ultrasound_power_get, ultrasound_power_put),
3809 static int msm_snd_enable_codec_ext_clk(struct snd_soc_codec *codec,
3810 int enable, bool dapm)
3814 if (!strcmp(dev_name(codec->dev), "tasha_codec"))
3815 ret = tasha_cdc_mclk_enable(codec, enable, dapm);
3816 else if (!strcmp(dev_name(codec->dev), "tavil_codec"))
3817 ret = tavil_cdc_mclk_enable(codec, enable);
3819 dev_err(codec->dev, "%s: unknown codec to enable ext clk\n",
3826 static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_codec *codec,
3827 int enable, bool dapm)
3831 if (!strcmp(dev_name(codec->dev), "tasha_codec"))
3832 ret = tasha_cdc_mclk_tx_enable(codec, enable, dapm);
3834 dev_err(codec->dev, "%s: unknown codec to enable ext clk\n",
3841 static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w,
3842 struct snd_kcontrol *kcontrol, int event)
3844 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
3846 pr_debug("%s: event = %d\n", __func__, event);
3849 case SND_SOC_DAPM_PRE_PMU:
3850 return msm_snd_enable_codec_ext_tx_clk(codec, 1, true);
3851 case SND_SOC_DAPM_POST_PMD:
3852 return msm_snd_enable_codec_ext_tx_clk(codec, 0, true);
3857 static int msm_mclk_event(struct snd_soc_dapm_widget *w,
3858 struct snd_kcontrol *kcontrol, int event)
3860 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
3862 pr_debug("%s: event = %d\n", __func__, event);
3865 case SND_SOC_DAPM_PRE_PMU:
3866 return msm_snd_enable_codec_ext_clk(codec, 1, true);
3867 case SND_SOC_DAPM_POST_PMD:
3868 return msm_snd_enable_codec_ext_clk(codec, 0, true);
3873 static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w,
3874 struct snd_kcontrol *k, int event)
3876 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
3877 struct snd_soc_card *card = codec->component.card;
3878 struct msm_asoc_mach_data *pdata =
3879 snd_soc_card_get_drvdata(card);
3881 pr_debug("%s: msm_hifi_control = %d", __func__, msm_hifi_control);
3883 if (!pdata || !pdata->hph_en0_gpio_p) {
3884 pr_err("%s: hph_en0_gpio is invalid\n", __func__);
3888 if (msm_hifi_control != MSM_HIFI_ON) {
3889 pr_debug("%s: HiFi mixer control is not set\n",
3895 case SND_SOC_DAPM_POST_PMU:
3896 msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p);
3898 case SND_SOC_DAPM_PRE_PMD:
3899 msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p);
3906 static const struct snd_soc_dapm_widget msm_dapm_widgets[] = {
3908 SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0,
3910 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3912 SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0,
3913 msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3915 SND_SOC_DAPM_SPK("Lineout_1 amp", NULL),
3916 SND_SOC_DAPM_SPK("Lineout_3 amp", NULL),
3917 SND_SOC_DAPM_SPK("Lineout_2 amp", NULL),
3918 SND_SOC_DAPM_SPK("Lineout_4 amp", NULL),
3919 SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event),
3920 SND_SOC_DAPM_MIC("Handset Mic", NULL),
3921 SND_SOC_DAPM_MIC("Headset Mic", NULL),
3922 SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL),
3923 SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL),
3924 SND_SOC_DAPM_MIC("Analog Mic5", NULL),
3925 SND_SOC_DAPM_MIC("Analog Mic6", NULL),
3927 SND_SOC_DAPM_MIC("Digital Mic0", NULL),
3928 SND_SOC_DAPM_MIC("Digital Mic1", NULL),
3929 SND_SOC_DAPM_MIC("Digital Mic2", NULL),
3930 SND_SOC_DAPM_MIC("Digital Mic3", NULL),
3931 SND_SOC_DAPM_MIC("Digital Mic4", NULL),
3932 SND_SOC_DAPM_MIC("Digital Mic5", NULL),
3935 static inline int param_is_mask(int p)
3937 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
3938 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
3941 static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p,
3944 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
3947 static void param_set_mask(struct snd_pcm_hw_params *p, int n, unsigned bit)
3949 if (bit >= SNDRV_MASK_MAX)
3951 if (param_is_mask(n)) {
3952 struct snd_mask *m = param_to_mask(p, n);
3956 m->bits[bit >> 5] |= (1 << (bit & 31));
3960 static int msm_slim_get_ch_from_beid(int32_t be_id)
3965 case MSM_BACKEND_DAI_SLIMBUS_0_RX:
3968 case MSM_BACKEND_DAI_SLIMBUS_1_RX:
3971 case MSM_BACKEND_DAI_SLIMBUS_2_RX:
3974 case MSM_BACKEND_DAI_SLIMBUS_3_RX:
3977 case MSM_BACKEND_DAI_SLIMBUS_4_RX:
3980 case MSM_BACKEND_DAI_SLIMBUS_6_RX:
3983 case MSM_BACKEND_DAI_SLIMBUS_0_TX:
3986 case MSM_BACKEND_DAI_SLIMBUS_3_TX:
3997 static int msm_ext_disp_get_idx_from_beid(int32_t be_id)
4002 case MSM_BACKEND_DAI_HDMI_RX:
4005 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
4009 pr_err("%s: Incorrect ext_disp be_id %d\n", __func__, be_id);
4017 static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
4018 struct snd_pcm_hw_params *params)
4020 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4021 struct snd_interval *rate = hw_param_interval(params,
4022 SNDRV_PCM_HW_PARAM_RATE);
4023 struct snd_interval *channels = hw_param_interval(params,
4024 SNDRV_PCM_HW_PARAM_CHANNELS);
4027 void *config = NULL;
4028 struct snd_soc_codec *codec = NULL;
4030 pr_debug("%s: format = %d, rate = %d\n",
4031 __func__, params_format(params), params_rate(params));
4033 switch (dai_link->be_id) {
4034 case MSM_BACKEND_DAI_SLIMBUS_0_RX:
4035 case MSM_BACKEND_DAI_SLIMBUS_1_RX:
4036 case MSM_BACKEND_DAI_SLIMBUS_2_RX:
4037 case MSM_BACKEND_DAI_SLIMBUS_3_RX:
4038 case MSM_BACKEND_DAI_SLIMBUS_4_RX:
4039 case MSM_BACKEND_DAI_SLIMBUS_6_RX:
4040 idx = msm_slim_get_ch_from_beid(dai_link->be_id);
4041 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4042 slim_rx_cfg[idx].bit_format);
4043 rate->min = rate->max = slim_rx_cfg[idx].sample_rate;
4044 channels->min = channels->max = slim_rx_cfg[idx].channels;
4047 case MSM_BACKEND_DAI_SLIMBUS_0_TX:
4048 case MSM_BACKEND_DAI_SLIMBUS_3_TX:
4049 idx = msm_slim_get_ch_from_beid(dai_link->be_id);
4050 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4051 slim_tx_cfg[idx].bit_format);
4052 rate->min = rate->max = slim_tx_cfg[idx].sample_rate;
4053 channels->min = channels->max = slim_tx_cfg[idx].channels;
4056 case MSM_BACKEND_DAI_SLIMBUS_1_TX:
4057 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4058 slim_tx_cfg[1].bit_format);
4059 rate->min = rate->max = slim_tx_cfg[1].sample_rate;
4060 channels->min = channels->max = slim_tx_cfg[1].channels;
4063 case MSM_BACKEND_DAI_SLIMBUS_4_TX:
4064 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4065 SNDRV_PCM_FORMAT_S32_LE);
4066 rate->min = rate->max = SAMPLING_RATE_8KHZ;
4067 channels->min = channels->max = msm_vi_feed_tx_ch;
4070 case MSM_BACKEND_DAI_SLIMBUS_5_RX:
4071 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4072 slim_rx_cfg[5].bit_format);
4073 rate->min = rate->max = slim_rx_cfg[5].sample_rate;
4074 channels->min = channels->max = slim_rx_cfg[5].channels;
4077 case MSM_BACKEND_DAI_SLIMBUS_5_TX:
4079 rate->min = rate->max = SAMPLING_RATE_16KHZ;
4080 channels->min = channels->max = 1;
4082 config = msm_codec_fn.get_afe_config_fn(codec,
4083 AFE_SLIMBUS_SLAVE_PORT_CONFIG);
4085 rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG,
4086 config, SLIMBUS_5_TX);
4088 pr_err("%s: Failed to set slimbus slave port config %d\n",
4093 case MSM_BACKEND_DAI_SLIMBUS_7_RX:
4094 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4095 slim_rx_cfg[SLIM_RX_7].bit_format);
4096 rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate;
4097 channels->min = channels->max =
4098 slim_rx_cfg[SLIM_RX_7].channels;
4101 case MSM_BACKEND_DAI_SLIMBUS_7_TX:
4102 rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate;
4103 channels->min = channels->max =
4104 slim_tx_cfg[SLIM_TX_7].channels;
4107 case MSM_BACKEND_DAI_SLIMBUS_8_TX:
4108 rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate;
4109 channels->min = channels->max =
4110 slim_tx_cfg[SLIM_TX_8].channels;
4113 case MSM_BACKEND_DAI_USB_RX:
4114 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4115 usb_rx_cfg.bit_format);
4116 rate->min = rate->max = usb_rx_cfg.sample_rate;
4117 channels->min = channels->max = usb_rx_cfg.channels;
4120 case MSM_BACKEND_DAI_USB_TX:
4121 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4122 usb_tx_cfg.bit_format);
4123 rate->min = rate->max = usb_tx_cfg.sample_rate;
4124 channels->min = channels->max = usb_tx_cfg.channels;
4127 case MSM_BACKEND_DAI_HDMI_RX:
4128 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
4129 idx = msm_ext_disp_get_idx_from_beid(dai_link->be_id);
4130 if (IS_ERR_VALUE(idx)) {
4131 pr_err("%s: Incorrect ext disp idx %d\n",
4137 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4138 ext_disp_rx_cfg[idx].bit_format);
4139 rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate;
4140 channels->min = channels->max = ext_disp_rx_cfg[idx].channels;
4143 case MSM_BACKEND_DAI_AFE_PCM_RX:
4144 channels->min = channels->max = proxy_rx_cfg.channels;
4145 rate->min = rate->max = SAMPLING_RATE_48KHZ;
4148 case MSM_BACKEND_DAI_PRI_TDM_RX_0:
4149 channels->min = channels->max =
4150 tdm_rx_cfg[TDM_PRI][TDM_0].channels;
4151 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4152 tdm_rx_cfg[TDM_PRI][TDM_0].bit_format);
4153 rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate;
4156 case MSM_BACKEND_DAI_PRI_TDM_TX_0:
4157 channels->min = channels->max =
4158 tdm_tx_cfg[TDM_PRI][TDM_0].channels;
4159 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4160 tdm_tx_cfg[TDM_PRI][TDM_0].bit_format);
4161 rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate;
4164 case MSM_BACKEND_DAI_SEC_TDM_RX_0:
4165 channels->min = channels->max =
4166 tdm_rx_cfg[TDM_SEC][TDM_0].channels;
4167 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4168 tdm_rx_cfg[TDM_SEC][TDM_0].bit_format);
4169 rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate;
4172 case MSM_BACKEND_DAI_SEC_TDM_TX_0:
4173 channels->min = channels->max =
4174 tdm_tx_cfg[TDM_SEC][TDM_0].channels;
4175 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4176 tdm_tx_cfg[TDM_SEC][TDM_0].bit_format);
4177 rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate;
4180 case MSM_BACKEND_DAI_TERT_TDM_RX_0:
4181 channels->min = channels->max =
4182 tdm_rx_cfg[TDM_TERT][TDM_0].channels;
4183 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4184 tdm_rx_cfg[TDM_TERT][TDM_0].bit_format);
4185 rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate;
4188 case MSM_BACKEND_DAI_TERT_TDM_TX_0:
4189 channels->min = channels->max =
4190 tdm_tx_cfg[TDM_TERT][TDM_0].channels;
4191 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4192 tdm_tx_cfg[TDM_TERT][TDM_0].bit_format);
4193 rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate;
4196 case MSM_BACKEND_DAI_QUAT_TDM_RX_0:
4197 channels->min = channels->max =
4198 tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
4199 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4200 tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format);
4201 rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate;
4204 case MSM_BACKEND_DAI_QUAT_TDM_TX_0:
4205 channels->min = channels->max =
4206 tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
4207 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4208 tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format);
4209 rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate;
4212 case MSM_BACKEND_DAI_AUXPCM_RX:
4213 rate->min = rate->max =
4214 aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate;
4215 channels->min = channels->max =
4216 aux_pcm_rx_cfg[PRIM_AUX_PCM].channels;
4219 case MSM_BACKEND_DAI_AUXPCM_TX:
4220 rate->min = rate->max =
4221 aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate;
4222 channels->min = channels->max =
4223 aux_pcm_tx_cfg[PRIM_AUX_PCM].channels;
4226 case MSM_BACKEND_DAI_SEC_AUXPCM_RX:
4227 rate->min = rate->max =
4228 aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate;
4229 channels->min = channels->max =
4230 aux_pcm_rx_cfg[SEC_AUX_PCM].channels;
4233 case MSM_BACKEND_DAI_SEC_AUXPCM_TX:
4234 rate->min = rate->max =
4235 aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate;
4236 channels->min = channels->max =
4237 aux_pcm_tx_cfg[SEC_AUX_PCM].channels;
4240 case MSM_BACKEND_DAI_TERT_AUXPCM_RX:
4241 rate->min = rate->max =
4242 aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate;
4243 channels->min = channels->max =
4244 aux_pcm_rx_cfg[TERT_AUX_PCM].channels;
4247 case MSM_BACKEND_DAI_TERT_AUXPCM_TX:
4248 rate->min = rate->max =
4249 aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate;
4250 channels->min = channels->max =
4251 aux_pcm_tx_cfg[TERT_AUX_PCM].channels;
4254 case MSM_BACKEND_DAI_QUAT_AUXPCM_RX:
4255 rate->min = rate->max =
4256 aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate;
4257 channels->min = channels->max =
4258 aux_pcm_rx_cfg[QUAT_AUX_PCM].channels;
4261 case MSM_BACKEND_DAI_QUAT_AUXPCM_TX:
4262 rate->min = rate->max =
4263 aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate;
4264 channels->min = channels->max =
4265 aux_pcm_tx_cfg[QUAT_AUX_PCM].channels;
4268 case MSM_BACKEND_DAI_PRI_MI2S_RX:
4269 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4270 mi2s_rx_cfg[PRIM_MI2S].bit_format);
4271 rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate;
4272 channels->min = channels->max =
4273 mi2s_rx_cfg[PRIM_MI2S].channels;
4276 case MSM_BACKEND_DAI_PRI_MI2S_TX:
4277 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4278 mi2s_tx_cfg[PRIM_MI2S].bit_format);
4279 rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate;
4280 channels->min = channels->max =
4281 mi2s_tx_cfg[PRIM_MI2S].channels;
4284 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
4285 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4286 mi2s_rx_cfg[SEC_MI2S].bit_format);
4287 rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate;
4288 channels->min = channels->max =
4289 mi2s_rx_cfg[SEC_MI2S].channels;
4292 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
4293 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4294 mi2s_tx_cfg[SEC_MI2S].bit_format);
4295 rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate;
4296 channels->min = channels->max =
4297 mi2s_tx_cfg[SEC_MI2S].channels;
4300 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
4301 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4302 mi2s_rx_cfg[TERT_MI2S].bit_format);
4303 rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate;
4304 channels->min = channels->max =
4305 mi2s_rx_cfg[TERT_MI2S].channels;
4308 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
4309 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4310 mi2s_tx_cfg[TERT_MI2S].bit_format);
4311 rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate;
4312 channels->min = channels->max =
4313 mi2s_tx_cfg[TERT_MI2S].channels;
4316 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
4317 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4318 mi2s_rx_cfg[QUAT_MI2S].bit_format);
4319 rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate;
4320 channels->min = channels->max =
4321 mi2s_rx_cfg[QUAT_MI2S].channels;
4324 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
4325 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4326 mi2s_tx_cfg[QUAT_MI2S].bit_format);
4327 rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate;
4328 channels->min = channels->max =
4329 mi2s_tx_cfg[QUAT_MI2S].channels;
4333 rate->min = rate->max = SAMPLING_RATE_48KHZ;
4341 static bool msm_swap_gnd_mic(struct snd_soc_codec *codec)
4343 struct snd_soc_card *card = codec->component.card;
4344 struct msm_asoc_mach_data *pdata =
4345 snd_soc_card_get_drvdata(card);
4348 if (pdata->us_euro_gpio_p) {
4349 value = msm_cdc_pinctrl_get_state(pdata->us_euro_gpio_p);
4351 msm_cdc_pinctrl_select_sleep_state(
4352 pdata->us_euro_gpio_p);
4354 msm_cdc_pinctrl_select_active_state(
4355 pdata->us_euro_gpio_p);
4356 } else if (pdata->us_euro_gpio >= 0) {
4357 value = gpio_get_value_cansleep(pdata->us_euro_gpio);
4358 gpio_set_value_cansleep(pdata->us_euro_gpio, !value);
4360 pr_debug("%s: swap select switch %d to %d\n", __func__, value, !value);
4364 static int msm_afe_set_config(struct snd_soc_codec *codec)
4367 void *config_data = NULL;
4369 if (!msm_codec_fn.get_afe_config_fn) {
4370 dev_err(codec->dev, "%s: codec get afe config not init'ed\n",
4375 config_data = msm_codec_fn.get_afe_config_fn(codec,
4376 AFE_CDC_REGISTERS_CONFIG);
4378 ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0);
4381 "%s: Failed to set codec registers config %d\n",
4387 config_data = msm_codec_fn.get_afe_config_fn(codec,
4388 AFE_CDC_REGISTER_PAGE_CONFIG);
4390 ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data,
4394 "%s: Failed to set cdc register page config\n",
4398 config_data = msm_codec_fn.get_afe_config_fn(codec,
4399 AFE_SLIMBUS_SLAVE_CONFIG);
4401 ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0);
4404 "%s: Failed to set slimbus slave config %d\n",
4413 static void msm_afe_clear_config(void)
4415 afe_clear_config(AFE_CDC_REGISTERS_CONFIG);
4416 afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
4419 static int msm_adsp_power_up_config(struct snd_soc_codec *codec)
4422 unsigned long timeout;
4426 msecs_to_jiffies(ADSP_STATE_READY_TIMEOUT_MS);
4429 if (q6core_is_adsp_ready()) {
4430 pr_debug("%s: ADSP Audio is ready\n", __func__);
4435 * ADSP will be coming up after subsystem restart and
4436 * it might not be fully up when the control reaches
4437 * here. So, wait for 50msec before checking ADSP state
4441 } while (time_after(timeout, jiffies));
4444 pr_err("%s: timed out waiting for ADSP Audio\n", __func__);
4449 ret = msm_afe_set_config(codec);
4451 pr_err("%s: Failed to set AFE config. err %d\n",
4460 static int msm8998_notifier_service_cb(struct notifier_block *this,
4461 unsigned long opcode, void *ptr)
4464 struct snd_soc_card *card = NULL;
4465 const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
4466 struct snd_soc_pcm_runtime *rtd;
4467 struct snd_soc_codec *codec;
4469 pr_debug("%s: Service opcode 0x%lx\n", __func__, opcode);
4472 case AUDIO_NOTIFIER_SERVICE_DOWN:
4474 * Use flag to ignore initial boot notifications
4475 * On initial boot msm_adsp_power_up_config is
4476 * called on init. There is no need to clear
4477 * and set the config again on initial boot.
4479 if (is_initial_boot)
4481 msm_afe_clear_config();
4483 case AUDIO_NOTIFIER_SERVICE_UP:
4484 if (is_initial_boot) {
4485 is_initial_boot = false;
4491 card = platform_get_drvdata(spdev);
4492 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
4495 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
4496 __func__, be_dl_name);
4502 ret = msm_adsp_power_up_config(codec);
4505 "%s: msm_adsp_power_up_config failed ret = %d!\n",
4517 static struct notifier_block service_nb = {
4518 .notifier_call = msm8998_notifier_service_cb,
4519 .priority = -INT_MAX,
4522 static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd)
4526 struct snd_soc_codec *codec = rtd->codec;
4527 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
4528 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4529 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4530 struct snd_soc_pcm_runtime *rtd_aux = rtd->card->rtd_aux;
4531 struct snd_card *card;
4532 struct snd_info_entry *entry;
4533 struct msm_asoc_mach_data *pdata =
4534 snd_soc_card_get_drvdata(rtd->card);
4536 /* Codec SLIMBUS configuration
4537 * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13
4538 * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13
4541 unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150,
4542 151, 152, 153, 154, 155, 156};
4543 unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133,
4544 134, 135, 136, 137, 138, 139,
4545 140, 141, 142, 143};
4547 /* Tavil Codec SLIMBUS configuration
4548 * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8
4549 * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13
4552 unsigned int rx_ch_tavil[WCD934X_RX_MAX] = {144, 145, 146, 147, 148,
4554 unsigned int tx_ch_tavil[WCD934X_TX_MAX] = {128, 129, 130, 131, 132,
4555 133, 134, 135, 136, 137,
4556 138, 139, 140, 141, 142,
4559 pr_info("%s: dev_name%s\n", __func__, dev_name(cpu_dai->dev));
4561 rtd->pmdown_time = 0;
4563 ret = snd_soc_add_codec_controls(codec, msm_snd_controls,
4564 ARRAY_SIZE(msm_snd_controls));
4566 pr_err("%s: add_codec_controls failed, err %d\n",
4571 snd_soc_dapm_new_controls(dapm, msm_dapm_widgets,
4572 ARRAY_SIZE(msm_dapm_widgets));
4574 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec"))
4575 snd_soc_dapm_add_routes(dapm, wcd_audio_paths_tasha,
4576 ARRAY_SIZE(wcd_audio_paths_tasha));
4578 snd_soc_dapm_add_routes(dapm, wcd_audio_paths,
4579 ARRAY_SIZE(wcd_audio_paths));
4581 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
4582 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
4583 snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic");
4584 snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic");
4585 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
4586 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
4587 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
4588 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
4589 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
4590 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
4591 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5");
4592 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6");
4593 snd_soc_dapm_ignore_suspend(dapm, "MADINPUT");
4594 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT");
4595 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1");
4596 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2");
4597 snd_soc_dapm_ignore_suspend(dapm, "EAR");
4598 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1");
4599 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2");
4600 snd_soc_dapm_ignore_suspend(dapm, "ANC EAR");
4601 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
4602 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
4603 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
4604 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
4605 snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI");
4606 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT");
4607 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL");
4608 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR");
4610 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
4611 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3");
4612 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4");
4613 snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1");
4614 snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2");
4617 snd_soc_dapm_sync(dapm);
4619 if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) {
4620 snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch_tavil),
4621 tx_ch_tavil, ARRAY_SIZE(rx_ch_tavil),
4624 snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
4625 tx_ch, ARRAY_SIZE(rx_ch),
4629 if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) {
4630 msm_codec_fn.get_afe_config_fn = tavil_get_afe_config;
4632 msm_codec_fn.get_afe_config_fn = tasha_get_afe_config;
4633 msm_codec_fn.mbhc_hs_detect_exit = tasha_mbhc_hs_detect_exit;
4636 ret = msm_adsp_power_up_config(codec);
4638 pr_err("%s: Failed to set AFE config %d\n", __func__, ret);
4642 config_data = msm_codec_fn.get_afe_config_fn(codec,
4645 ret = afe_set_config(AFE_AANC_VERSION, config_data, 0);
4647 pr_err("%s: Failed to set aanc version %d\n",
4653 if (!strcmp(dev_name(codec_dai->dev), "tasha_codec")) {
4654 config_data = msm_codec_fn.get_afe_config_fn(codec,
4655 AFE_CDC_CLIP_REGISTERS_CONFIG);
4657 ret = afe_set_config(AFE_CDC_CLIP_REGISTERS_CONFIG,
4660 pr_err("%s: Failed to set clip registers %d\n",
4665 config_data = msm_codec_fn.get_afe_config_fn(codec,
4668 ret = afe_set_config(AFE_CLIP_BANK_SEL, config_data, 0);
4670 pr_err("%s: Failed to set AFE bank selection %d\n",
4678 * Send speaker configuration only for WSA8810.
4679 * Defalut configuration is for WSA8815.
4681 pr_debug("%s: Number of aux devices: %d\n",
4682 __func__, rtd->card->num_aux_devs);
4683 if (!strcmp(dev_name(codec_dai->dev), "tavil_codec")) {
4684 if (rtd->card->num_aux_devs && rtd_aux && rtd_aux->component)
4685 if (!strcmp(rtd_aux->component->name, WSA8810_NAME_1) ||
4686 !strcmp(rtd_aux->component->name, WSA8810_NAME_2)) {
4687 tavil_set_spkr_mode(rtd->codec, SPKR_MODE_1);
4688 tavil_set_spkr_gain_offset(rtd->codec,
4689 RX_GAIN_OFFSET_M1P5_DB);
4691 card = rtd->card->snd_card;
4692 entry = snd_register_module_info(card->module, "codecs",
4695 pr_debug("%s: Cannot create codecs module entry\n",
4697 pdata->codec_root = NULL;
4700 pdata->codec_root = entry;
4701 tavil_codec_info_create_codec_entry(pdata->codec_root, codec);
4703 if (rtd->card->num_aux_devs && rtd_aux && rtd_aux->component)
4704 if (!strcmp(rtd_aux->component->name, WSA8810_NAME_1) ||
4705 !strcmp(rtd_aux->component->name, WSA8810_NAME_2)) {
4706 tasha_set_spkr_mode(rtd->codec, SPKR_MODE_1);
4707 tasha_set_spkr_gain_offset(rtd->codec,
4708 RX_GAIN_OFFSET_M1P5_DB);
4710 card = rtd->card->snd_card;
4711 entry = snd_register_module_info(card->module, "codecs",
4714 pr_debug("%s: Cannot create codecs module entry\n",
4717 goto err_snd_module;
4719 pdata->codec_root = entry;
4720 tasha_codec_info_create_codec_entry(pdata->codec_root, codec);
4723 codec_reg_done = true;
4731 static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
4733 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
4734 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161};
4735 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4737 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
4738 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
4741 static void *def_tasha_mbhc_cal(void)
4743 void *tasha_wcd_cal;
4744 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
4747 tasha_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
4748 WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
4752 #define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tasha_wcd_cal)->X) = (Y))
4753 #ifdef CONFIG_MACH_XIAOMI_MSM8998
4759 #define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tasha_wcd_cal)->X) = (Y))
4760 S(num_btn, WCD_MBHC_DEF_BUTTONS);
4763 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tasha_wcd_cal);
4764 btn_high = ((void *)&btn_cfg->_v_btn_low) +
4765 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
4768 #ifdef CONFIG_MACH_XIAOMI_MSM8998
4786 return tasha_wcd_cal;
4789 static void *def_tavil_mbhc_cal(void)
4791 void *tavil_wcd_cal;
4792 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
4795 tavil_wcd_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
4796 WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
4800 #define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(tavil_wcd_cal)->X) = (Y))
4803 #define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal)->X) = (Y))
4804 S(num_btn, WCD_MBHC_DEF_BUTTONS);
4807 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(tavil_wcd_cal);
4808 btn_high = ((void *)&btn_cfg->_v_btn_low) +
4809 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
4820 return tavil_wcd_cal;
4823 static int msm_snd_hw_params(struct snd_pcm_substream *substream,
4824 struct snd_pcm_hw_params *params)
4826 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4827 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4828 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4829 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4832 u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
4833 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
4834 u32 user_set_tx_ch = 0;
4837 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4838 ret = snd_soc_dai_get_channel_map(codec_dai,
4839 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
4841 pr_err("%s: failed to get codec chan map, err:%d\n",
4845 if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_5_RX) {
4846 pr_debug("%s: rx_5_ch=%d\n", __func__,
4847 slim_rx_cfg[5].channels);
4848 rx_ch_count = slim_rx_cfg[5].channels;
4849 } else if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_2_RX) {
4850 pr_debug("%s: rx_2_ch=%d\n", __func__,
4851 slim_rx_cfg[2].channels);
4852 rx_ch_count = slim_rx_cfg[2].channels;
4853 } else if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_6_RX) {
4854 pr_debug("%s: rx_6_ch=%d\n", __func__,
4855 slim_rx_cfg[6].channels);
4856 rx_ch_count = slim_rx_cfg[6].channels;
4858 pr_debug("%s: rx_0_ch=%d\n", __func__,
4859 slim_rx_cfg[0].channels);
4860 rx_ch_count = slim_rx_cfg[0].channels;
4862 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
4863 rx_ch_count, rx_ch);
4865 pr_err("%s: failed to set cpu chan map, err:%d\n",
4871 pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__,
4872 codec_dai->name, codec_dai->id, user_set_tx_ch);
4873 ret = snd_soc_dai_get_channel_map(codec_dai,
4874 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
4876 pr_err("%s: failed to get codec chan map\n, err:%d\n",
4880 /* For <codec>_tx1 case */
4881 if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_0_TX)
4882 user_set_tx_ch = slim_tx_cfg[0].channels;
4883 /* For <codec>_tx3 case */
4884 else if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_1_TX)
4885 user_set_tx_ch = slim_tx_cfg[1].channels;
4886 else if (dai_link->be_id == MSM_BACKEND_DAI_SLIMBUS_4_TX)
4887 user_set_tx_ch = msm_vi_feed_tx_ch;
4889 user_set_tx_ch = tx_ch_cnt;
4891 pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), be_id (%d)\n",
4892 __func__, slim_tx_cfg[0].channels, user_set_tx_ch,
4893 tx_ch_cnt, dai_link->be_id);
4895 ret = snd_soc_dai_set_channel_map(cpu_dai,
4896 user_set_tx_ch, tx_ch, 0, 0);
4898 pr_err("%s: failed to set cpu chan map, err:%d\n",
4906 static int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream,
4907 struct snd_pcm_hw_params *params)
4909 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4910 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4911 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4912 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4915 u32 tx_ch[SLIM_MAX_TX_PORTS];
4917 u32 user_set_tx_ch = 0;
4919 if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) {
4920 pr_err("%s: Invalid stream type %d\n",
4921 __func__, substream->stream);
4923 goto err_stream_type;
4926 pr_debug("%s: %s_tx_dai_id_%d\n", __func__,
4927 codec_dai->name, codec_dai->id);
4928 ret = snd_soc_dai_get_channel_map(codec_dai,
4929 &tx_ch_cnt, tx_ch, NULL, NULL);
4931 pr_err("%s: failed to get codec chan map\n, err:%d\n",
4936 user_set_tx_ch = tx_ch_cnt;
4938 pr_debug("%s: tx_ch_cnt(%d) be_id %d\n",
4939 __func__, tx_ch_cnt, dai_link->be_id);
4941 ret = snd_soc_dai_set_channel_map(cpu_dai,
4942 user_set_tx_ch, tx_ch, 0, 0);
4944 pr_err("%s: failed to set cpu chan map, err:%d\n",
4951 static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream,
4952 struct snd_pcm_hw_params *params)
4954 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4955 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4956 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4957 unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
4958 unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0;
4959 unsigned int num_tx_ch = 0;
4960 unsigned int num_rx_ch = 0;
4963 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4964 num_rx_ch = params_channels(params);
4965 pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__,
4966 codec_dai->name, codec_dai->id, num_rx_ch);
4967 ret = snd_soc_dai_get_channel_map(codec_dai,
4968 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
4970 pr_err("%s: failed to get codec chan map, err:%d\n",
4974 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
4977 pr_err("%s: failed to set cpu chan map, err:%d\n",
4982 num_tx_ch = params_channels(params);
4983 pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__,
4984 codec_dai->name, codec_dai->id, num_tx_ch);
4985 ret = snd_soc_dai_get_channel_map(codec_dai,
4986 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
4988 pr_err("%s: failed to get codec chan map, err:%d\n",
4992 ret = snd_soc_dai_set_channel_map(cpu_dai,
4993 num_tx_ch, tx_ch, 0, 0);
4995 pr_err("%s: failed to set cpu chan map, err:%d\n",
5005 static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
5006 struct snd_pcm_hw_params *params)
5008 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5009 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5010 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5011 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5012 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
5013 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
5016 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
5017 codec_dai->name, codec_dai->id);
5018 ret = snd_soc_dai_get_channel_map(codec_dai,
5019 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5022 "%s: failed to get BTFM codec chan map\n, err:%d\n",
5027 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) be_id %d\n",
5028 __func__, tx_ch_cnt, dai_link->be_id);
5030 ret = snd_soc_dai_set_channel_map(cpu_dai,
5031 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
5033 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
5040 static int msm_aux_pcm_snd_startup(struct snd_pcm_substream *substream)
5043 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5044 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5045 int index = cpu_dai->id - 1;
5047 dev_dbg(rtd->card->dev,
5048 "%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
5049 __func__, substream->name, substream->stream,
5050 cpu_dai->name, cpu_dai->id);
5052 if (index < PRIM_AUX_PCM || index > QUAT_AUX_PCM) {
5054 dev_err(rtd->card->dev,
5055 "%s: CPU DAI id (%d) out of range\n",
5056 __func__, cpu_dai->id);
5060 mutex_lock(&auxpcm_intf_conf[index].lock);
5061 if (++auxpcm_intf_conf[index].ref_cnt == 1) {
5062 if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) {
5063 mutex_lock(&mi2s_auxpcm_conf[index].lock);
5065 mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr);
5066 mutex_unlock(&mi2s_auxpcm_conf[index].lock);
5068 dev_err(rtd->card->dev,
5069 "%s lpaif_tert_muxsel_virt_addr is NULL\n",
5074 if (IS_ERR_VALUE(ret))
5075 auxpcm_intf_conf[index].ref_cnt--;
5077 mutex_unlock(&auxpcm_intf_conf[index].lock);
5083 static void msm_aux_pcm_snd_shutdown(struct snd_pcm_substream *substream)
5085 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5086 int index = rtd->cpu_dai->id - 1;
5088 dev_dbg(rtd->card->dev,
5089 "%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
5091 substream->name, substream->stream,
5092 rtd->cpu_dai->name, rtd->cpu_dai->id);
5094 if (index < PRIM_AUX_PCM || index > QUAT_AUX_PCM) {
5095 dev_err(rtd->card->dev,
5096 "%s: CPU DAI id (%d) out of range\n",
5097 __func__, rtd->cpu_dai->id);
5101 mutex_lock(&auxpcm_intf_conf[index].lock);
5102 if (--auxpcm_intf_conf[index].ref_cnt == 0) {
5103 if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) {
5104 mutex_lock(&mi2s_auxpcm_conf[index].lock);
5106 mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr);
5107 mutex_unlock(&mi2s_auxpcm_conf[index].lock);
5109 dev_err(rtd->card->dev,
5110 "%s lpaif_tert_muxsel_virt_addr is NULL\n",
5114 mutex_unlock(&auxpcm_intf_conf[index].lock);
5117 static int msm_get_port_id(int be_id)
5122 case MSM_BACKEND_DAI_PRI_MI2S_RX:
5123 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX;
5125 case MSM_BACKEND_DAI_PRI_MI2S_TX:
5126 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX;
5128 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
5129 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX;
5131 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
5132 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX;
5134 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
5135 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX;
5137 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
5138 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
5140 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
5141 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
5143 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
5144 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
5147 pr_err("%s: Invalid be_id: %d\n", __func__, be_id);
5148 afe_port_id = -EINVAL;
5154 static u32 get_mi2s_bits_per_sample(u32 bit_format)
5158 switch (bit_format) {
5159 case SNDRV_PCM_FORMAT_S32_LE:
5160 case SNDRV_PCM_FORMAT_S24_3LE:
5161 case SNDRV_PCM_FORMAT_S24_LE:
5162 bit_per_sample = 32;
5164 case SNDRV_PCM_FORMAT_S16_LE:
5166 bit_per_sample = 16;
5170 return bit_per_sample;
5173 static void update_mi2s_clk_val(int dai_id, int stream)
5177 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
5179 get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format);
5180 mi2s_clk[dai_id].clk_freq_in_hz =
5181 mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
5184 get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format);
5185 mi2s_clk[dai_id].clk_freq_in_hz =
5186 mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
5190 static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
5193 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5194 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5196 int index = cpu_dai->id;
5198 port_id = msm_get_port_id(rtd->dai_link->be_id);
5199 if (IS_ERR_VALUE(port_id)) {
5200 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
5206 update_mi2s_clk_val(index, substream->stream);
5207 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
5208 mi2s_clk[index].clk_freq_in_hz);
5211 mi2s_clk[index].enable = enable;
5212 ret = afe_set_lpass_clock_v2(port_id,
5215 dev_err(rtd->card->dev,
5216 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
5217 __func__, port_id, ret);
5225 static int msm_set_pinctrl(struct msm_pinctrl_info *pinctrl_info,
5226 enum pinctrl_pin_state new_state)
5231 if (pinctrl_info == NULL) {
5232 pr_err("%s: pinctrl_info is NULL\n", __func__);
5237 if (pinctrl_info->pinctrl == NULL) {
5238 pr_err("%s: pinctrl_info->pinctrl is NULL\n", __func__);
5243 curr_state = pinctrl_info->curr_state;
5244 pinctrl_info->curr_state = new_state;
5245 pr_debug("%s: curr_state = %s new_state = %s\n", __func__,
5246 pin_states[curr_state], pin_states[pinctrl_info->curr_state]);
5248 if (curr_state == pinctrl_info->curr_state) {
5249 pr_debug("%s: Already in same state\n", __func__);
5253 if (curr_state != STATE_DISABLE &&
5254 pinctrl_info->curr_state != STATE_DISABLE) {
5255 pr_debug("%s: state already active cannot switch\n", __func__);
5260 switch (pinctrl_info->curr_state) {
5261 case STATE_MI2S_ACTIVE:
5262 ret = pinctrl_select_state(pinctrl_info->pinctrl,
5263 pinctrl_info->mi2s_active);
5265 pr_err("%s: MI2S state select failed with %d\n",
5271 case STATE_TDM_ACTIVE:
5272 ret = pinctrl_select_state(pinctrl_info->pinctrl,
5273 pinctrl_info->tdm_active);
5275 pr_err("%s: TDM state select failed with %d\n",
5282 if (curr_state == STATE_MI2S_ACTIVE) {
5283 ret = pinctrl_select_state(pinctrl_info->pinctrl,
5284 pinctrl_info->mi2s_disable);
5286 ret = pinctrl_select_state(pinctrl_info->pinctrl,
5287 pinctrl_info->tdm_disable);
5290 pr_err("%s: state disable failed with %d\n",
5297 pr_err("%s: TLMM pin state is invalid\n", __func__);
5305 static void msm_release_pinctrl(struct platform_device *pdev)
5307 struct snd_soc_card *card = platform_get_drvdata(pdev);
5308 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
5309 struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
5311 if (pinctrl_info->pinctrl) {
5312 devm_pinctrl_put(pinctrl_info->pinctrl);
5313 pinctrl_info->pinctrl = NULL;
5317 static int msm_get_pinctrl(struct platform_device *pdev)
5319 struct snd_soc_card *card = platform_get_drvdata(pdev);
5320 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
5321 struct msm_pinctrl_info *pinctrl_info = NULL;
5322 struct pinctrl *pinctrl;
5325 pinctrl_info = &pdata->pinctrl_info;
5327 if (pinctrl_info == NULL) {
5328 pr_err("%s: pinctrl_info is NULL\n", __func__);
5332 pinctrl = devm_pinctrl_get(&pdev->dev);
5333 if (IS_ERR_OR_NULL(pinctrl)) {
5334 pr_err("%s: Unable to get pinctrl handle\n", __func__);
5337 pinctrl_info->pinctrl = pinctrl;
5339 /* get all the states handles from Device Tree */
5340 pinctrl_info->mi2s_disable = pinctrl_lookup_state(pinctrl,
5342 if (IS_ERR(pinctrl_info->mi2s_disable)) {
5343 pr_err("%s: could not get mi2s_disable pinstate\n", __func__);
5346 pinctrl_info->mi2s_active = pinctrl_lookup_state(pinctrl,
5347 "quat-mi2s-active");
5348 if (IS_ERR(pinctrl_info->mi2s_active)) {
5349 pr_err("%s: could not get mi2s_active pinstate\n", __func__);
5352 pinctrl_info->tdm_disable = pinctrl_lookup_state(pinctrl,
5354 if (IS_ERR(pinctrl_info->tdm_disable)) {
5355 pr_err("%s: could not get tdm_disable pinstate\n", __func__);
5358 pinctrl_info->tdm_active = pinctrl_lookup_state(pinctrl,
5360 if (IS_ERR(pinctrl_info->tdm_active)) {
5361 pr_err("%s: could not get tdm_active pinstate\n",
5365 /* Reset the TLMM pins to a default state */
5366 ret = pinctrl_select_state(pinctrl_info->pinctrl,
5367 pinctrl_info->mi2s_disable);
5369 pr_err("%s: Disable TLMM pins failed with %d\n",
5374 pinctrl_info->curr_state = STATE_DISABLE;
5379 devm_pinctrl_put(pinctrl);
5380 pinctrl_info->pinctrl = NULL;
5384 static int msm_tdm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
5385 struct snd_pcm_hw_params *params)
5387 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5388 struct snd_interval *rate = hw_param_interval(params,
5389 SNDRV_PCM_HW_PARAM_RATE);
5390 struct snd_interval *channels = hw_param_interval(params,
5391 SNDRV_PCM_HW_PARAM_CHANNELS);
5392 switch (cpu_dai->id) {
5393 case AFE_PORT_ID_PRIMARY_TDM_RX:
5394 channels->min = channels->max =
5395 tdm_rx_cfg[TDM_PRI][TDM_0].channels;
5396 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5397 tdm_rx_cfg[TDM_PRI][TDM_0].bit_format);
5398 rate->min = rate->max =
5399 tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate;
5401 case AFE_PORT_ID_PRIMARY_TDM_RX_1:
5402 channels->min = channels->max =
5403 tdm_rx_cfg[TDM_PRI][TDM_1].channels;
5404 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5405 tdm_rx_cfg[TDM_PRI][TDM_1].bit_format);
5406 rate->min = rate->max =
5407 tdm_rx_cfg[TDM_PRI][TDM_1].sample_rate;
5409 case AFE_PORT_ID_PRIMARY_TDM_RX_2:
5410 channels->min = channels->max =
5411 tdm_rx_cfg[TDM_PRI][TDM_2].channels;
5412 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5413 tdm_rx_cfg[TDM_PRI][TDM_2].bit_format);
5414 rate->min = rate->max =
5415 tdm_rx_cfg[TDM_PRI][TDM_2].sample_rate;
5417 case AFE_PORT_ID_PRIMARY_TDM_RX_3:
5418 channels->min = channels->max =
5419 tdm_rx_cfg[TDM_PRI][TDM_3].channels;
5420 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5421 tdm_rx_cfg[TDM_PRI][TDM_3].bit_format);
5422 rate->min = rate->max =
5423 tdm_rx_cfg[TDM_PRI][TDM_3].sample_rate;
5425 case AFE_PORT_ID_PRIMARY_TDM_RX_4:
5426 channels->min = channels->max =
5427 tdm_rx_cfg[TDM_PRI][TDM_4].channels;
5428 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5429 tdm_rx_cfg[TDM_PRI][TDM_4].bit_format);
5430 rate->min = rate->max =
5431 tdm_rx_cfg[TDM_PRI][TDM_4].sample_rate;
5433 case AFE_PORT_ID_PRIMARY_TDM_RX_5:
5434 channels->min = channels->max =
5435 tdm_rx_cfg[TDM_PRI][TDM_5].channels;
5436 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5437 tdm_rx_cfg[TDM_PRI][TDM_5].bit_format);
5438 rate->min = rate->max =
5439 tdm_rx_cfg[TDM_PRI][TDM_5].sample_rate;
5441 case AFE_PORT_ID_PRIMARY_TDM_RX_6:
5442 channels->min = channels->max =
5443 tdm_rx_cfg[TDM_PRI][TDM_6].channels;
5444 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5445 tdm_rx_cfg[TDM_PRI][TDM_6].bit_format);
5446 rate->min = rate->max =
5447 tdm_rx_cfg[TDM_PRI][TDM_6].sample_rate;
5449 case AFE_PORT_ID_PRIMARY_TDM_RX_7:
5450 channels->min = channels->max =
5451 tdm_rx_cfg[TDM_PRI][TDM_7].channels;
5452 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5453 tdm_rx_cfg[TDM_PRI][TDM_7].bit_format);
5454 rate->min = rate->max =
5455 tdm_rx_cfg[TDM_PRI][TDM_7].sample_rate;
5457 case AFE_PORT_ID_PRIMARY_TDM_TX:
5458 channels->min = channels->max =
5459 tdm_tx_cfg[TDM_PRI][TDM_0].channels;
5460 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5461 tdm_tx_cfg[TDM_PRI][TDM_0].bit_format);
5462 rate->min = rate->max =
5463 tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate;
5465 case AFE_PORT_ID_PRIMARY_TDM_TX_1:
5466 channels->min = channels->max =
5467 tdm_tx_cfg[TDM_PRI][TDM_1].channels;
5468 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5469 tdm_tx_cfg[TDM_PRI][TDM_1].bit_format);
5470 rate->min = rate->max =
5471 tdm_tx_cfg[TDM_PRI][TDM_1].sample_rate;
5473 case AFE_PORT_ID_PRIMARY_TDM_TX_2:
5474 channels->min = channels->max =
5475 tdm_tx_cfg[TDM_PRI][TDM_2].channels;
5476 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5477 tdm_tx_cfg[TDM_PRI][TDM_2].bit_format);
5478 rate->min = rate->max =
5479 tdm_tx_cfg[TDM_PRI][TDM_2].sample_rate;
5481 case AFE_PORT_ID_PRIMARY_TDM_TX_3:
5482 channels->min = channels->max =
5483 tdm_tx_cfg[TDM_PRI][TDM_3].channels;
5484 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5485 tdm_tx_cfg[TDM_PRI][TDM_3].bit_format);
5486 rate->min = rate->max =
5487 tdm_tx_cfg[TDM_PRI][TDM_3].sample_rate;
5489 case AFE_PORT_ID_PRIMARY_TDM_TX_4:
5490 channels->min = channels->max =
5491 tdm_tx_cfg[TDM_PRI][TDM_4].channels;
5492 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5493 tdm_tx_cfg[TDM_PRI][TDM_4].bit_format);
5494 rate->min = rate->max =
5495 tdm_tx_cfg[TDM_PRI][TDM_4].sample_rate;
5497 case AFE_PORT_ID_PRIMARY_TDM_TX_5:
5498 channels->min = channels->max =
5499 tdm_tx_cfg[TDM_PRI][TDM_5].channels;
5500 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5501 tdm_tx_cfg[TDM_PRI][TDM_5].bit_format);
5502 rate->min = rate->max =
5503 tdm_tx_cfg[TDM_PRI][TDM_5].sample_rate;
5505 case AFE_PORT_ID_PRIMARY_TDM_TX_6:
5506 channels->min = channels->max =
5507 tdm_tx_cfg[TDM_PRI][TDM_6].channels;
5508 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5509 tdm_tx_cfg[TDM_PRI][TDM_6].bit_format);
5510 rate->min = rate->max =
5511 tdm_tx_cfg[TDM_PRI][TDM_6].sample_rate;
5513 case AFE_PORT_ID_PRIMARY_TDM_TX_7:
5514 channels->min = channels->max =
5515 tdm_tx_cfg[TDM_PRI][TDM_7].channels;
5516 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5517 tdm_tx_cfg[TDM_PRI][TDM_7].bit_format);
5518 rate->min = rate->max =
5519 tdm_tx_cfg[TDM_PRI][TDM_7].sample_rate;
5521 case AFE_PORT_ID_SECONDARY_TDM_RX:
5522 channels->min = channels->max =
5523 tdm_rx_cfg[TDM_SEC][TDM_0].channels;
5524 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5525 tdm_rx_cfg[TDM_SEC][TDM_0].bit_format);
5526 rate->min = rate->max =
5527 tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate;
5529 case AFE_PORT_ID_SECONDARY_TDM_RX_1:
5530 channels->min = channels->max =
5531 tdm_rx_cfg[TDM_SEC][TDM_1].channels;
5532 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5533 tdm_rx_cfg[TDM_SEC][TDM_1].bit_format);
5534 rate->min = rate->max =
5535 tdm_rx_cfg[TDM_SEC][TDM_1].sample_rate;
5537 case AFE_PORT_ID_SECONDARY_TDM_RX_2:
5538 channels->min = channels->max =
5539 tdm_rx_cfg[TDM_SEC][TDM_2].channels;
5540 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5541 tdm_rx_cfg[TDM_SEC][TDM_2].bit_format);
5542 rate->min = rate->max =
5543 tdm_rx_cfg[TDM_SEC][TDM_2].sample_rate;
5545 case AFE_PORT_ID_SECONDARY_TDM_RX_3:
5546 channels->min = channels->max =
5547 tdm_rx_cfg[TDM_SEC][TDM_3].channels;
5548 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5549 tdm_rx_cfg[TDM_SEC][TDM_3].bit_format);
5550 rate->min = rate->max =
5551 tdm_rx_cfg[TDM_SEC][TDM_3].sample_rate;
5553 case AFE_PORT_ID_SECONDARY_TDM_RX_4:
5554 channels->min = channels->max =
5555 tdm_rx_cfg[TDM_SEC][TDM_4].channels;
5556 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5557 tdm_rx_cfg[TDM_SEC][TDM_4].bit_format);
5558 rate->min = rate->max =
5559 tdm_rx_cfg[TDM_SEC][TDM_4].sample_rate;
5561 case AFE_PORT_ID_SECONDARY_TDM_RX_5:
5562 channels->min = channels->max =
5563 tdm_rx_cfg[TDM_SEC][TDM_5].channels;
5564 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5565 tdm_rx_cfg[TDM_SEC][TDM_5].bit_format);
5566 rate->min = rate->max =
5567 tdm_rx_cfg[TDM_SEC][TDM_5].sample_rate;
5569 case AFE_PORT_ID_SECONDARY_TDM_RX_6:
5570 channels->min = channels->max =
5571 tdm_rx_cfg[TDM_SEC][TDM_6].channels;
5572 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5573 tdm_rx_cfg[TDM_SEC][TDM_6].bit_format);
5574 rate->min = rate->max =
5575 tdm_rx_cfg[TDM_SEC][TDM_6].sample_rate;
5577 case AFE_PORT_ID_SECONDARY_TDM_RX_7:
5578 channels->min = channels->max =
5579 tdm_rx_cfg[TDM_SEC][TDM_7].channels;
5580 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5581 tdm_rx_cfg[TDM_SEC][TDM_7].bit_format);
5582 rate->min = rate->max =
5583 tdm_rx_cfg[TDM_SEC][TDM_7].sample_rate;
5585 case AFE_PORT_ID_SECONDARY_TDM_TX:
5586 channels->min = channels->max =
5587 tdm_tx_cfg[TDM_SEC][TDM_0].channels;
5588 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5589 tdm_tx_cfg[TDM_SEC][TDM_0].bit_format);
5590 rate->min = rate->max =
5591 tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate;
5593 case AFE_PORT_ID_SECONDARY_TDM_TX_1:
5594 channels->min = channels->max =
5595 tdm_tx_cfg[TDM_SEC][TDM_1].channels;
5596 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5597 tdm_tx_cfg[TDM_SEC][TDM_1].bit_format);
5598 rate->min = rate->max =
5599 tdm_tx_cfg[TDM_SEC][TDM_1].sample_rate;
5601 case AFE_PORT_ID_SECONDARY_TDM_TX_2:
5602 channels->min = channels->max =
5603 tdm_tx_cfg[TDM_SEC][TDM_2].channels;
5604 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5605 tdm_tx_cfg[TDM_SEC][TDM_2].bit_format);
5606 rate->min = rate->max =
5607 tdm_tx_cfg[TDM_SEC][TDM_2].sample_rate;
5609 case AFE_PORT_ID_SECONDARY_TDM_TX_3:
5610 channels->min = channels->max =
5611 tdm_tx_cfg[TDM_SEC][TDM_3].channels;
5612 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5613 tdm_tx_cfg[TDM_SEC][TDM_3].bit_format);
5614 rate->min = rate->max =
5615 tdm_tx_cfg[TDM_SEC][TDM_3].sample_rate;
5617 case AFE_PORT_ID_SECONDARY_TDM_TX_4:
5618 channels->min = channels->max =
5619 tdm_tx_cfg[TDM_SEC][TDM_4].channels;
5620 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5621 tdm_tx_cfg[TDM_SEC][TDM_4].bit_format);
5622 rate->min = rate->max =
5623 tdm_tx_cfg[TDM_SEC][TDM_4].sample_rate;
5625 case AFE_PORT_ID_SECONDARY_TDM_TX_5:
5626 channels->min = channels->max =
5627 tdm_tx_cfg[TDM_SEC][TDM_5].channels;
5628 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5629 tdm_tx_cfg[TDM_SEC][TDM_5].bit_format);
5630 rate->min = rate->max =
5631 tdm_tx_cfg[TDM_SEC][TDM_5].sample_rate;
5633 case AFE_PORT_ID_SECONDARY_TDM_TX_6:
5634 channels->min = channels->max =
5635 tdm_tx_cfg[TDM_SEC][TDM_6].channels;
5636 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5637 tdm_tx_cfg[TDM_SEC][TDM_6].bit_format);
5638 rate->min = rate->max =
5639 tdm_tx_cfg[TDM_SEC][TDM_6].sample_rate;
5641 case AFE_PORT_ID_SECONDARY_TDM_TX_7:
5642 channels->min = channels->max =
5643 tdm_tx_cfg[TDM_SEC][TDM_7].channels;
5644 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5645 tdm_tx_cfg[TDM_SEC][TDM_7].bit_format);
5646 rate->min = rate->max =
5647 tdm_tx_cfg[TDM_SEC][TDM_7].sample_rate;
5649 case AFE_PORT_ID_TERTIARY_TDM_RX:
5650 channels->min = channels->max =
5651 tdm_rx_cfg[TDM_TERT][TDM_0].channels;
5652 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5653 tdm_rx_cfg[TDM_TERT][TDM_0].bit_format);
5654 rate->min = rate->max =
5655 tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate;
5657 case AFE_PORT_ID_TERTIARY_TDM_RX_1:
5658 channels->min = channels->max =
5659 tdm_rx_cfg[TDM_TERT][TDM_1].channels;
5660 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5661 tdm_rx_cfg[TDM_TERT][TDM_1].bit_format);
5662 rate->min = rate->max =
5663 tdm_rx_cfg[TDM_TERT][TDM_1].sample_rate;
5665 case AFE_PORT_ID_TERTIARY_TDM_RX_2:
5666 channels->min = channels->max =
5667 tdm_rx_cfg[TDM_TERT][TDM_2].channels;
5668 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5669 tdm_rx_cfg[TDM_TERT][TDM_2].bit_format);
5670 rate->min = rate->max =
5671 tdm_rx_cfg[TDM_TERT][TDM_2].sample_rate;
5673 case AFE_PORT_ID_TERTIARY_TDM_RX_3:
5674 channels->min = channels->max =
5675 tdm_rx_cfg[TDM_TERT][TDM_3].channels;
5676 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5677 tdm_rx_cfg[TDM_TERT][TDM_3].bit_format);
5678 rate->min = rate->max =
5679 tdm_rx_cfg[TDM_TERT][TDM_3].sample_rate;
5681 case AFE_PORT_ID_TERTIARY_TDM_RX_4:
5682 channels->min = channels->max =
5683 tdm_rx_cfg[TDM_TERT][TDM_4].channels;
5684 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5685 tdm_rx_cfg[TDM_TERT][TDM_4].bit_format);
5686 rate->min = rate->max =
5687 tdm_rx_cfg[TDM_TERT][TDM_4].sample_rate;
5689 case AFE_PORT_ID_TERTIARY_TDM_RX_5:
5690 channels->min = channels->max =
5691 tdm_rx_cfg[TDM_TERT][TDM_5].channels;
5692 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5693 tdm_rx_cfg[TDM_TERT][TDM_5].bit_format);
5694 rate->min = rate->max =
5695 tdm_rx_cfg[TDM_TERT][TDM_5].sample_rate;
5697 case AFE_PORT_ID_TERTIARY_TDM_RX_6:
5698 channels->min = channels->max =
5699 tdm_rx_cfg[TDM_TERT][TDM_6].channels;
5700 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5701 tdm_rx_cfg[TDM_TERT][TDM_6].bit_format);
5702 rate->min = rate->max =
5703 tdm_rx_cfg[TDM_TERT][TDM_6].sample_rate;
5705 case AFE_PORT_ID_TERTIARY_TDM_RX_7:
5706 channels->min = channels->max =
5707 tdm_rx_cfg[TDM_TERT][TDM_7].channels;
5708 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5709 tdm_rx_cfg[TDM_TERT][TDM_7].bit_format);
5710 rate->min = rate->max =
5711 tdm_rx_cfg[TDM_TERT][TDM_7].sample_rate;
5713 case AFE_PORT_ID_TERTIARY_TDM_TX:
5714 channels->min = channels->max =
5715 tdm_tx_cfg[TDM_TERT][TDM_0].channels;
5716 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5717 tdm_tx_cfg[TDM_TERT][TDM_0].bit_format);
5718 rate->min = rate->max =
5719 tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate;
5721 case AFE_PORT_ID_TERTIARY_TDM_TX_1:
5722 channels->min = channels->max =
5723 tdm_tx_cfg[TDM_TERT][TDM_1].channels;
5724 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5725 tdm_tx_cfg[TDM_TERT][TDM_1].bit_format);
5726 rate->min = rate->max =
5727 tdm_tx_cfg[TDM_TERT][TDM_1].sample_rate;
5729 case AFE_PORT_ID_TERTIARY_TDM_TX_2:
5730 channels->min = channels->max =
5731 tdm_tx_cfg[TDM_TERT][TDM_2].channels;
5732 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5733 tdm_tx_cfg[TDM_TERT][TDM_2].bit_format);
5734 rate->min = rate->max =
5735 tdm_tx_cfg[TDM_TERT][TDM_2].sample_rate;
5737 case AFE_PORT_ID_TERTIARY_TDM_TX_3:
5738 channels->min = channels->max =
5739 tdm_tx_cfg[TDM_TERT][TDM_3].channels;
5740 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5741 tdm_tx_cfg[TDM_TERT][TDM_3].bit_format);
5742 rate->min = rate->max =
5743 tdm_tx_cfg[TDM_TERT][TDM_3].sample_rate;
5745 case AFE_PORT_ID_TERTIARY_TDM_TX_4:
5746 channels->min = channels->max =
5747 tdm_tx_cfg[TDM_TERT][TDM_4].channels;
5748 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5749 tdm_tx_cfg[TDM_TERT][TDM_4].bit_format);
5750 rate->min = rate->max =
5751 tdm_tx_cfg[TDM_TERT][TDM_4].sample_rate;
5753 case AFE_PORT_ID_TERTIARY_TDM_TX_5:
5754 channels->min = channels->max =
5755 tdm_tx_cfg[TDM_TERT][TDM_5].channels;
5756 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5757 tdm_tx_cfg[TDM_TERT][TDM_5].bit_format);
5758 rate->min = rate->max =
5759 tdm_tx_cfg[TDM_TERT][TDM_5].sample_rate;
5761 case AFE_PORT_ID_TERTIARY_TDM_TX_6:
5762 channels->min = channels->max =
5763 tdm_tx_cfg[TDM_TERT][TDM_6].channels;
5764 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5765 tdm_tx_cfg[TDM_TERT][TDM_6].bit_format);
5766 rate->min = rate->max =
5767 tdm_tx_cfg[TDM_TERT][TDM_6].sample_rate;
5769 case AFE_PORT_ID_TERTIARY_TDM_TX_7:
5770 channels->min = channels->max =
5771 tdm_tx_cfg[TDM_TERT][TDM_7].channels;
5772 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5773 tdm_tx_cfg[TDM_TERT][TDM_7].bit_format);
5774 rate->min = rate->max =
5775 tdm_tx_cfg[TDM_TERT][TDM_7].sample_rate;
5777 case AFE_PORT_ID_QUATERNARY_TDM_RX:
5778 channels->min = channels->max =
5779 tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
5780 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5781 tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format);
5782 rate->min = rate->max =
5783 tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate;
5785 case AFE_PORT_ID_QUATERNARY_TDM_RX_1:
5786 channels->min = channels->max =
5787 tdm_rx_cfg[TDM_QUAT][TDM_1].channels;
5788 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5789 tdm_rx_cfg[TDM_QUAT][TDM_1].bit_format);
5790 rate->min = rate->max =
5791 tdm_rx_cfg[TDM_QUAT][TDM_1].sample_rate;
5793 case AFE_PORT_ID_QUATERNARY_TDM_RX_2:
5794 channels->min = channels->max =
5795 tdm_rx_cfg[TDM_QUAT][TDM_2].channels;
5796 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5797 tdm_rx_cfg[TDM_QUAT][TDM_2].bit_format);
5798 rate->min = rate->max =
5799 tdm_rx_cfg[TDM_QUAT][TDM_2].sample_rate;
5801 case AFE_PORT_ID_QUATERNARY_TDM_RX_3:
5802 channels->min = channels->max =
5803 tdm_rx_cfg[TDM_QUAT][TDM_3].channels;
5804 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5805 tdm_rx_cfg[TDM_QUAT][TDM_3].bit_format);
5806 rate->min = rate->max =
5807 tdm_rx_cfg[TDM_QUAT][TDM_3].sample_rate;
5809 case AFE_PORT_ID_QUATERNARY_TDM_RX_4:
5810 channels->min = channels->max =
5811 tdm_rx_cfg[TDM_QUAT][TDM_4].channels;
5812 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5813 tdm_rx_cfg[TDM_QUAT][TDM_4].bit_format);
5814 rate->min = rate->max =
5815 tdm_rx_cfg[TDM_QUAT][TDM_4].sample_rate;
5817 case AFE_PORT_ID_QUATERNARY_TDM_RX_5:
5818 channels->min = channels->max =
5819 tdm_rx_cfg[TDM_QUAT][TDM_5].channels;
5820 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5821 tdm_rx_cfg[TDM_QUAT][TDM_5].bit_format);
5822 rate->min = rate->max =
5823 tdm_rx_cfg[TDM_QUAT][TDM_5].sample_rate;
5825 case AFE_PORT_ID_QUATERNARY_TDM_RX_6:
5826 channels->min = channels->max =
5827 tdm_rx_cfg[TDM_QUAT][TDM_6].channels;
5828 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5829 tdm_rx_cfg[TDM_QUAT][TDM_6].bit_format);
5830 rate->min = rate->max =
5831 tdm_rx_cfg[TDM_QUAT][TDM_6].sample_rate;
5833 case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
5834 channels->min = channels->max =
5835 tdm_rx_cfg[TDM_QUAT][TDM_7].channels;
5836 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5837 tdm_rx_cfg[TDM_QUAT][TDM_7].bit_format);
5838 rate->min = rate->max =
5839 tdm_rx_cfg[TDM_QUAT][TDM_7].sample_rate;
5841 case AFE_PORT_ID_QUATERNARY_TDM_TX:
5842 channels->min = channels->max =
5843 tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
5844 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5845 tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format);
5846 rate->min = rate->max =
5847 tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate;
5849 case AFE_PORT_ID_QUATERNARY_TDM_TX_1:
5850 channels->min = channels->max =
5851 tdm_tx_cfg[TDM_QUAT][TDM_1].channels;
5852 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5853 tdm_tx_cfg[TDM_QUAT][TDM_1].bit_format);
5854 rate->min = rate->max =
5855 tdm_tx_cfg[TDM_QUAT][TDM_1].sample_rate;
5857 case AFE_PORT_ID_QUATERNARY_TDM_TX_2:
5858 channels->min = channels->max =
5859 tdm_tx_cfg[TDM_QUAT][TDM_2].channels;
5860 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5861 tdm_tx_cfg[TDM_QUAT][TDM_2].bit_format);
5862 rate->min = rate->max =
5863 tdm_tx_cfg[TDM_QUAT][TDM_2].sample_rate;
5865 case AFE_PORT_ID_QUATERNARY_TDM_TX_3:
5866 channels->min = channels->max =
5867 tdm_tx_cfg[TDM_QUAT][TDM_3].channels;
5868 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5869 tdm_tx_cfg[TDM_QUAT][TDM_3].bit_format);
5870 rate->min = rate->max =
5871 tdm_tx_cfg[TDM_QUAT][TDM_3].sample_rate;
5873 case AFE_PORT_ID_QUATERNARY_TDM_TX_4:
5874 channels->min = channels->max =
5875 tdm_tx_cfg[TDM_QUAT][TDM_4].channels;
5876 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5877 tdm_tx_cfg[TDM_QUAT][TDM_4].bit_format);
5878 rate->min = rate->max =
5879 tdm_tx_cfg[TDM_QUAT][TDM_4].sample_rate;
5881 case AFE_PORT_ID_QUATERNARY_TDM_TX_5:
5882 channels->min = channels->max =
5883 tdm_tx_cfg[TDM_QUAT][TDM_5].channels;
5884 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5885 tdm_tx_cfg[TDM_QUAT][TDM_5].bit_format);
5886 rate->min = rate->max =
5887 tdm_tx_cfg[TDM_QUAT][TDM_5].sample_rate;
5889 case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
5890 channels->min = channels->max =
5891 tdm_tx_cfg[TDM_QUAT][TDM_6].channels;
5892 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5893 tdm_tx_cfg[TDM_QUAT][TDM_6].bit_format);
5894 rate->min = rate->max =
5895 tdm_tx_cfg[TDM_QUAT][TDM_6].sample_rate;
5897 case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
5898 channels->min = channels->max =
5899 tdm_tx_cfg[TDM_QUAT][TDM_7].channels;
5900 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
5901 tdm_tx_cfg[TDM_QUAT][TDM_7].bit_format);
5902 rate->min = rate->max =
5903 tdm_tx_cfg[TDM_QUAT][TDM_7].sample_rate;
5906 pr_err("%s: dai id 0x%x not supported\n",
5907 __func__, cpu_dai->id);
5911 pr_debug("%s: dai id = 0x%x channels = %d rate = %d format = 0x%x\n",
5912 __func__, cpu_dai->id, channels->max, rate->max,
5913 params_format(params));
5918 static unsigned int tdm_param_set_slot_mask(int slots)
5920 unsigned int slot_mask = 0;
5923 if ((slots <= 0) || (slots > 32)) {
5924 pr_err("%s: invalid slot number %d\n", __func__, slots);
5928 for (i = 0; i < slots ; i++)
5929 slot_mask |= 1 << i;
5934 static int msm8998_tdm_snd_hw_params(struct snd_pcm_substream *substream,
5935 struct snd_pcm_hw_params *params)
5937 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5938 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5940 int channels, slot_width, slots, rate, format;
5941 unsigned int slot_mask;
5942 unsigned int *slot_offset;
5943 int offset_channels = 0;
5947 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
5949 channels = params_channels(params);
5950 if (channels < 1 || channels > 32) {
5951 pr_err("%s: invalid param channels %d\n",
5952 __func__, channels);
5956 format = params_format(params);
5957 if (format != SNDRV_PCM_FORMAT_S32_LE &&
5958 format != SNDRV_PCM_FORMAT_S24_LE &&
5959 format != SNDRV_PCM_FORMAT_S16_LE) {
5961 * Up to 8 channel HW configuration should
5962 * use 32 bit slot width for max support of
5963 * stream bit width. (slot_width > bit_width)
5965 pr_err("%s: invalid param format 0x%x\n",
5970 switch (cpu_dai->id) {
5971 case AFE_PORT_ID_PRIMARY_TDM_RX:
5972 slots = tdm_slot[TDM_PRI].num;
5973 slot_width = tdm_slot[TDM_PRI].width;
5974 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_0];
5976 case AFE_PORT_ID_PRIMARY_TDM_RX_1:
5977 slots = tdm_slot[TDM_PRI].num;
5978 slot_width = tdm_slot[TDM_PRI].width;
5979 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_1];
5981 case AFE_PORT_ID_PRIMARY_TDM_RX_2:
5982 slots = tdm_slot[TDM_PRI].num;
5983 slot_width = tdm_slot[TDM_PRI].width;
5984 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_2];
5986 case AFE_PORT_ID_PRIMARY_TDM_RX_3:
5987 slots = tdm_slot[TDM_PRI].num;
5988 slot_width = tdm_slot[TDM_PRI].width;
5989 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_3];
5991 case AFE_PORT_ID_PRIMARY_TDM_RX_4:
5992 slots = tdm_slot[TDM_PRI].num;
5993 slot_width = tdm_slot[TDM_PRI].width;
5994 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_4];
5996 case AFE_PORT_ID_PRIMARY_TDM_RX_5:
5997 slots = tdm_slot[TDM_PRI].num;
5998 slot_width = tdm_slot[TDM_PRI].width;
5999 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_5];
6001 case AFE_PORT_ID_PRIMARY_TDM_RX_6:
6002 slots = tdm_slot[TDM_PRI].num;
6003 slot_width = tdm_slot[TDM_PRI].width;
6004 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_6];
6006 case AFE_PORT_ID_PRIMARY_TDM_RX_7:
6007 slots = tdm_slot[TDM_PRI].num;
6008 slot_width = tdm_slot[TDM_PRI].width;
6009 slot_offset = tdm_rx_slot_offset[TDM_PRI][TDM_7];
6011 case AFE_PORT_ID_PRIMARY_TDM_TX:
6012 slots = tdm_slot[TDM_PRI].num;
6013 slot_width = tdm_slot[TDM_PRI].width;
6014 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_0];
6016 case AFE_PORT_ID_PRIMARY_TDM_TX_1:
6017 slots = tdm_slot[TDM_PRI].num;
6018 slot_width = tdm_slot[TDM_PRI].width;
6019 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_1];
6021 case AFE_PORT_ID_PRIMARY_TDM_TX_2:
6022 slots = tdm_slot[TDM_PRI].num;
6023 slot_width = tdm_slot[TDM_PRI].width;
6024 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_2];
6026 case AFE_PORT_ID_PRIMARY_TDM_TX_3:
6027 slots = tdm_slot[TDM_PRI].num;
6028 slot_width = tdm_slot[TDM_PRI].width;
6029 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_3];
6031 case AFE_PORT_ID_PRIMARY_TDM_TX_4:
6032 slots = tdm_slot[TDM_PRI].num;
6033 slot_width = tdm_slot[TDM_PRI].width;
6034 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_4];
6036 case AFE_PORT_ID_PRIMARY_TDM_TX_5:
6037 slots = tdm_slot[TDM_PRI].num;
6038 slot_width = tdm_slot[TDM_PRI].width;
6039 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_5];
6041 case AFE_PORT_ID_PRIMARY_TDM_TX_6:
6042 slots = tdm_slot[TDM_PRI].num;
6043 slot_width = tdm_slot[TDM_PRI].width;
6044 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_6];
6046 case AFE_PORT_ID_PRIMARY_TDM_TX_7:
6047 slots = tdm_slot[TDM_PRI].num;
6048 slot_width = tdm_slot[TDM_PRI].width;
6049 slot_offset = tdm_tx_slot_offset[TDM_PRI][TDM_7];
6051 case AFE_PORT_ID_SECONDARY_TDM_RX:
6052 slots = tdm_slot[TDM_SEC].num;
6053 slot_width = tdm_slot[TDM_SEC].width;
6054 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_0];
6056 case AFE_PORT_ID_SECONDARY_TDM_RX_1:
6057 slots = tdm_slot[TDM_SEC].num;
6058 slot_width = tdm_slot[TDM_SEC].width;
6059 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_1];
6061 case AFE_PORT_ID_SECONDARY_TDM_RX_2:
6062 slots = tdm_slot[TDM_SEC].num;
6063 slot_width = tdm_slot[TDM_SEC].width;
6064 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_2];
6066 case AFE_PORT_ID_SECONDARY_TDM_RX_3:
6067 slots = tdm_slot[TDM_SEC].num;
6068 slot_width = tdm_slot[TDM_SEC].width;
6069 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_3];
6071 case AFE_PORT_ID_SECONDARY_TDM_RX_4:
6072 slots = tdm_slot[TDM_SEC].num;
6073 slot_width = tdm_slot[TDM_SEC].width;
6074 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_4];
6076 case AFE_PORT_ID_SECONDARY_TDM_RX_5:
6077 slots = tdm_slot[TDM_SEC].num;
6078 slot_width = tdm_slot[TDM_SEC].width;
6079 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_5];
6081 case AFE_PORT_ID_SECONDARY_TDM_RX_6:
6082 slots = tdm_slot[TDM_SEC].num;
6083 slot_width = tdm_slot[TDM_SEC].width;
6084 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_6];
6086 case AFE_PORT_ID_SECONDARY_TDM_RX_7:
6087 slots = tdm_slot[TDM_SEC].num;
6088 slot_width = tdm_slot[TDM_SEC].width;
6089 slot_offset = tdm_rx_slot_offset[TDM_SEC][TDM_7];
6091 case AFE_PORT_ID_SECONDARY_TDM_TX:
6092 slots = tdm_slot[TDM_SEC].num;
6093 slot_width = tdm_slot[TDM_SEC].width;
6094 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_0];
6096 case AFE_PORT_ID_SECONDARY_TDM_TX_1:
6097 slots = tdm_slot[TDM_SEC].num;
6098 slot_width = tdm_slot[TDM_SEC].width;
6099 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_1];
6101 case AFE_PORT_ID_SECONDARY_TDM_TX_2:
6102 slots = tdm_slot[TDM_SEC].num;
6103 slot_width = tdm_slot[TDM_SEC].width;
6104 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_2];
6106 case AFE_PORT_ID_SECONDARY_TDM_TX_3:
6107 slots = tdm_slot[TDM_SEC].num;
6108 slot_width = tdm_slot[TDM_SEC].width;
6109 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_3];
6111 case AFE_PORT_ID_SECONDARY_TDM_TX_4:
6112 slots = tdm_slot[TDM_SEC].num;
6113 slot_width = tdm_slot[TDM_SEC].width;
6114 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_4];
6116 case AFE_PORT_ID_SECONDARY_TDM_TX_5:
6117 slots = tdm_slot[TDM_SEC].num;
6118 slot_width = tdm_slot[TDM_SEC].width;
6119 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_5];
6121 case AFE_PORT_ID_SECONDARY_TDM_TX_6:
6122 slots = tdm_slot[TDM_SEC].num;
6123 slot_width = tdm_slot[TDM_SEC].width;
6124 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_6];
6126 case AFE_PORT_ID_SECONDARY_TDM_TX_7:
6127 slots = tdm_slot[TDM_SEC].num;
6128 slot_width = tdm_slot[TDM_SEC].width;
6129 slot_offset = tdm_tx_slot_offset[TDM_SEC][TDM_7];
6131 case AFE_PORT_ID_TERTIARY_TDM_RX:
6132 slots = tdm_slot[TDM_TERT].num;
6133 slot_width = tdm_slot[TDM_TERT].width;
6134 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_0];
6136 case AFE_PORT_ID_TERTIARY_TDM_RX_1:
6137 slots = tdm_slot[TDM_TERT].num;
6138 slot_width = tdm_slot[TDM_TERT].width;
6139 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_1];
6141 case AFE_PORT_ID_TERTIARY_TDM_RX_2:
6142 slots = tdm_slot[TDM_TERT].num;
6143 slot_width = tdm_slot[TDM_TERT].width;
6144 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_2];
6146 case AFE_PORT_ID_TERTIARY_TDM_RX_3:
6147 slots = tdm_slot[TDM_TERT].num;
6148 slot_width = tdm_slot[TDM_TERT].width;
6149 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_3];
6151 case AFE_PORT_ID_TERTIARY_TDM_RX_4:
6152 slots = tdm_slot[TDM_TERT].num;
6153 slot_width = tdm_slot[TDM_TERT].width;
6154 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_4];
6156 case AFE_PORT_ID_TERTIARY_TDM_RX_5:
6157 slots = tdm_slot[TDM_TERT].num;
6158 slot_width = tdm_slot[TDM_TERT].width;
6159 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_5];
6161 case AFE_PORT_ID_TERTIARY_TDM_RX_6:
6162 slots = tdm_slot[TDM_TERT].num;
6163 slot_width = tdm_slot[TDM_TERT].width;
6164 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_6];
6166 case AFE_PORT_ID_TERTIARY_TDM_RX_7:
6167 slots = tdm_slot[TDM_TERT].num;
6168 slot_width = tdm_slot[TDM_TERT].width;
6169 slot_offset = tdm_rx_slot_offset[TDM_TERT][TDM_7];
6171 case AFE_PORT_ID_TERTIARY_TDM_TX:
6172 slots = tdm_slot[TDM_TERT].num;
6173 slot_width = tdm_slot[TDM_TERT].width;
6174 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_0];
6176 case AFE_PORT_ID_TERTIARY_TDM_TX_1:
6177 slots = tdm_slot[TDM_TERT].num;
6178 slot_width = tdm_slot[TDM_TERT].width;
6179 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_1];
6181 case AFE_PORT_ID_TERTIARY_TDM_TX_2:
6182 slots = tdm_slot[TDM_TERT].num;
6183 slot_width = tdm_slot[TDM_TERT].width;
6184 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_2];
6186 case AFE_PORT_ID_TERTIARY_TDM_TX_3:
6187 slots = tdm_slot[TDM_TERT].num;
6188 slot_width = tdm_slot[TDM_TERT].width;
6189 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_3];
6191 case AFE_PORT_ID_TERTIARY_TDM_TX_4:
6192 slots = tdm_slot[TDM_TERT].num;
6193 slot_width = tdm_slot[TDM_TERT].width;
6194 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_4];
6196 case AFE_PORT_ID_TERTIARY_TDM_TX_5:
6197 slots = tdm_slot[TDM_TERT].num;
6198 slot_width = tdm_slot[TDM_TERT].width;
6199 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_5];
6201 case AFE_PORT_ID_TERTIARY_TDM_TX_6:
6202 slots = tdm_slot[TDM_TERT].num;
6203 slot_width = tdm_slot[TDM_TERT].width;
6204 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_6];
6206 case AFE_PORT_ID_TERTIARY_TDM_TX_7:
6207 slots = tdm_slot[TDM_TERT].num;
6208 slot_width = tdm_slot[TDM_TERT].width;
6209 slot_offset = tdm_tx_slot_offset[TDM_TERT][TDM_7];
6211 case AFE_PORT_ID_QUATERNARY_TDM_RX:
6212 slots = tdm_slot[TDM_QUAT].num;
6213 slot_width = tdm_slot[TDM_QUAT].width;
6214 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_0];
6216 case AFE_PORT_ID_QUATERNARY_TDM_RX_1:
6217 slots = tdm_slot[TDM_QUAT].num;
6218 slot_width = tdm_slot[TDM_QUAT].width;
6219 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_1];
6221 case AFE_PORT_ID_QUATERNARY_TDM_RX_2:
6222 slots = tdm_slot[TDM_QUAT].num;
6223 slot_width = tdm_slot[TDM_QUAT].width;
6224 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_2];
6226 case AFE_PORT_ID_QUATERNARY_TDM_RX_3:
6227 slots = tdm_slot[TDM_QUAT].num;
6228 slot_width = tdm_slot[TDM_QUAT].width;
6229 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_3];
6231 case AFE_PORT_ID_QUATERNARY_TDM_RX_4:
6232 slots = tdm_slot[TDM_QUAT].num;
6233 slot_width = tdm_slot[TDM_QUAT].width;
6234 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_4];
6236 case AFE_PORT_ID_QUATERNARY_TDM_RX_5:
6237 slots = tdm_slot[TDM_QUAT].num;
6238 slot_width = tdm_slot[TDM_QUAT].width;
6239 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_5];
6241 case AFE_PORT_ID_QUATERNARY_TDM_RX_6:
6242 slots = tdm_slot[TDM_QUAT].num;
6243 slot_width = tdm_slot[TDM_QUAT].width;
6244 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_6];
6246 case AFE_PORT_ID_QUATERNARY_TDM_RX_7:
6247 slots = tdm_slot[TDM_QUAT].num;
6248 slot_width = tdm_slot[TDM_QUAT].width;
6249 slot_offset = tdm_rx_slot_offset[TDM_QUAT][TDM_7];
6251 case AFE_PORT_ID_QUATERNARY_TDM_TX:
6252 slots = tdm_slot[TDM_QUAT].num;
6253 slot_width = tdm_slot[TDM_QUAT].width;
6254 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_0];
6256 case AFE_PORT_ID_QUATERNARY_TDM_TX_1:
6257 slots = tdm_slot[TDM_QUAT].num;
6258 slot_width = tdm_slot[TDM_QUAT].width;
6259 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_1];
6261 case AFE_PORT_ID_QUATERNARY_TDM_TX_2:
6262 slots = tdm_slot[TDM_QUAT].num;
6263 slot_width = tdm_slot[TDM_QUAT].width;
6264 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_2];
6266 case AFE_PORT_ID_QUATERNARY_TDM_TX_3:
6267 slots = tdm_slot[TDM_QUAT].num;
6268 slot_width = tdm_slot[TDM_QUAT].width;
6269 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_3];
6271 case AFE_PORT_ID_QUATERNARY_TDM_TX_4:
6272 slots = tdm_slot[TDM_QUAT].num;
6273 slot_width = tdm_slot[TDM_QUAT].width;
6274 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_4];
6276 case AFE_PORT_ID_QUATERNARY_TDM_TX_5:
6277 slots = tdm_slot[TDM_QUAT].num;
6278 slot_width = tdm_slot[TDM_QUAT].width;
6279 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_5];
6281 case AFE_PORT_ID_QUATERNARY_TDM_TX_6:
6282 slots = tdm_slot[TDM_QUAT].num;
6283 slot_width = tdm_slot[TDM_QUAT].width;
6284 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_6];
6286 case AFE_PORT_ID_QUATERNARY_TDM_TX_7:
6287 slots = tdm_slot[TDM_QUAT].num;
6288 slot_width = tdm_slot[TDM_QUAT].width;
6289 slot_offset = tdm_tx_slot_offset[TDM_QUAT][TDM_7];
6292 pr_err("%s: dai id 0x%x not supported\n",
6293 __func__, cpu_dai->id);
6297 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
6298 if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
6304 if (offset_channels == 0) {
6305 pr_err("%s: invalid offset_channels %d\n",
6306 __func__, offset_channels);
6310 if (channels > offset_channels) {
6311 pr_err("%s: channels %d exceed offset_channels %d\n",
6312 __func__, channels, offset_channels);
6316 slot_mask = tdm_param_set_slot_mask(slots);
6318 pr_err("%s: invalid slot_mask 0x%x\n",
6319 __func__, slot_mask);
6323 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
6324 pr_debug("%s: slot_width %d\n", __func__, slot_width);
6325 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
6328 pr_err("%s: failed to set tdm slot, err:%d\n",
6333 ret = snd_soc_dai_set_channel_map(cpu_dai,
6334 0, NULL, channels, slot_offset);
6336 pr_err("%s: failed to set channel map, err:%d\n",
6340 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
6341 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
6344 pr_err("%s: failed to set tdm slot, err:%d\n",
6349 ret = snd_soc_dai_set_channel_map(cpu_dai,
6350 channels, slot_offset, 0, NULL);
6352 pr_err("%s: failed to set channel map, err:%d\n",
6358 pr_err("%s: invalid use case, err:%d\n",
6363 rate = params_rate(params);
6364 clk_freq = rate * slot_width * slots;
6365 ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT);
6367 pr_err("%s: failed to set tdm clk, err:%d\n",
6375 static int msm8998_tdm_snd_startup(struct snd_pcm_substream *substream)
6378 struct snd_soc_pcm_runtime *rtd = substream->private_data;
6379 struct snd_soc_card *card = rtd->card;
6380 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
6381 struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
6383 ret = msm_set_pinctrl(pinctrl_info, STATE_TDM_ACTIVE);
6385 pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
6391 static void msm8998_tdm_snd_shutdown(struct snd_pcm_substream *substream)
6394 struct snd_soc_pcm_runtime *rtd = substream->private_data;
6395 struct snd_soc_card *card = rtd->card;
6396 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
6397 struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
6399 ret = msm_set_pinctrl(pinctrl_info, STATE_DISABLE);
6401 pr_err("%s: TDM TLMM pinctrl set failed with %d\n",
6406 static struct snd_soc_ops msm8998_tdm_be_ops = {
6407 .hw_params = msm8998_tdm_snd_hw_params,
6408 .startup = msm8998_tdm_snd_startup,
6409 .shutdown = msm8998_tdm_snd_shutdown
6412 static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
6415 struct snd_soc_pcm_runtime *rtd = substream->private_data;
6416 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
6417 int index = cpu_dai->id;
6418 unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
6419 struct snd_soc_card *card = rtd->card;
6420 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
6421 struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
6422 int ret_pinctrl = 0;
6424 dev_dbg(rtd->card->dev,
6425 "%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
6426 __func__, substream->name, substream->stream,
6427 cpu_dai->name, cpu_dai->id);
6429 if (index < PRIM_MI2S || index > QUAT_MI2S) {
6431 dev_err(rtd->card->dev,
6432 "%s: CPU DAI id (%d) out of range\n",
6433 __func__, cpu_dai->id);
6436 if (index == QUAT_MI2S) {
6437 ret_pinctrl = msm_set_pinctrl(pinctrl_info, STATE_MI2S_ACTIVE);
6439 pr_err("%s: MI2S TLMM pinctrl set failed with %d\n",
6440 __func__, ret_pinctrl);
6445 * Muxtex protection in case the same MI2S
6446 * interface using for both TX and RX so
6447 * that the same clock won't be enable twice.
6449 mutex_lock(&mi2s_intf_conf[index].lock);
6450 if (++mi2s_intf_conf[index].ref_cnt == 1) {
6451 /* Check if msm needs to provide the clock to the interface */
6452 if (!mi2s_intf_conf[index].msm_is_mi2s_master) {
6453 fmt = SND_SOC_DAIFMT_CBM_CFM;
6454 mi2s_clk[index].clk_id = mi2s_ebit_clk[index];
6456 ret = msm_mi2s_set_sclk(substream, true);
6457 if (IS_ERR_VALUE(ret)) {
6458 dev_err(rtd->card->dev,
6459 "%s: afe lpass clock failed to enable MI2S clock, err:%d\n",
6463 if (mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr != NULL) {
6464 mutex_lock(&mi2s_auxpcm_conf[index].lock);
6466 mi2s_auxpcm_conf[index].pcm_i2s_sel_vt_addr);
6467 mutex_unlock(&mi2s_auxpcm_conf[index].lock);
6469 dev_err(rtd->card->dev,
6470 "%s lpaif_muxsel_virt_addr is NULL for dai %d\n",
6475 ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
6476 if (IS_ERR_VALUE(ret)) {
6477 pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n",
6478 __func__, index, ret);
6483 if (IS_ERR_VALUE(ret))
6484 msm_mi2s_set_sclk(substream, false);
6486 if (IS_ERR_VALUE(ret))
6487 mi2s_intf_conf[index].ref_cnt--;
6488 mutex_unlock(&mi2s_intf_conf[index].lock);
6493 static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
6496 struct snd_soc_pcm_runtime *rtd = substream->private_data;
6497 int index = rtd->cpu_dai->id;
6498 struct snd_soc_card *card = rtd->card;
6499 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
6500 struct msm_pinctrl_info *pinctrl_info = &pdata->pinctrl_info;
6501 int ret_pinctrl = 0;
6503 pr_debug("%s(): substream = %s stream = %d\n", __func__,
6504 substream->name, substream->stream);
6505 if (index < PRIM_MI2S || index > QUAT_MI2S) {
6506 pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index);
6510 mutex_lock(&mi2s_intf_conf[index].lock);
6511 if (--mi2s_intf_conf[index].ref_cnt == 0) {
6512 ret = msm_mi2s_set_sclk(substream, false);
6514 pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
6515 __func__, index, ret);
6517 mutex_unlock(&mi2s_intf_conf[index].lock);
6519 if (index == QUAT_MI2S) {
6520 ret_pinctrl = msm_set_pinctrl(pinctrl_info, STATE_DISABLE);
6522 pr_err("%s: MI2S TLMM pinctrl set failed with %d\n",
6523 __func__, ret_pinctrl);
6527 static struct snd_soc_ops msm_mi2s_be_ops = {
6528 .startup = msm_mi2s_snd_startup,
6529 .shutdown = msm_mi2s_snd_shutdown,
6532 static struct snd_soc_ops msm_aux_pcm_be_ops = {
6533 .startup = msm_aux_pcm_snd_startup,
6534 .shutdown = msm_aux_pcm_snd_shutdown,
6537 static int msm_tdm_snd_hw_params(struct snd_pcm_substream *substream,
6538 struct snd_pcm_hw_params *params)
6540 struct snd_soc_pcm_runtime *rtd = substream->private_data;
6541 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
6543 int channels, slot_width, slots;
6544 unsigned int slot_mask;
6545 unsigned int *slot_offset;
6546 int offset_channels = 0;
6549 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
6551 channels = params_channels(params);
6561 switch (params_format(params)) {
6562 case SNDRV_PCM_FORMAT_S32_LE:
6563 case SNDRV_PCM_FORMAT_S24_LE:
6564 case SNDRV_PCM_FORMAT_S16_LE:
6566 * up to 8 channels HW config should
6567 * use 32 bit slot width for max support of
6568 * stream bit width. (slot_width > bit_width)
6573 pr_err("%s: invalid param format 0x%x\n",
6574 __func__, params_format(params));
6578 slot_mask = tdm_param_set_slot_mask(slots);
6580 pr_err("%s: invalid slot_mask 0x%x\n",
6581 __func__, slot_mask);
6586 pr_err("%s: invalid param channels %d\n",
6587 __func__, channels);
6590 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
6591 switch (cpu_dai->id) {
6592 case AFE_PORT_ID_PRIMARY_TDM_RX:
6593 case AFE_PORT_ID_SECONDARY_TDM_RX:
6594 case AFE_PORT_ID_TERTIARY_TDM_RX:
6595 case AFE_PORT_ID_QUATERNARY_TDM_RX:
6596 case AFE_PORT_ID_PRIMARY_TDM_TX:
6597 case AFE_PORT_ID_SECONDARY_TDM_TX:
6598 case AFE_PORT_ID_TERTIARY_TDM_TX:
6599 case AFE_PORT_ID_QUATERNARY_TDM_TX:
6600 slot_offset = tdm_slot_offset[TDM_0];
6603 pr_err("%s: dai id 0x%x not supported\n",
6604 __func__, cpu_dai->id);
6608 for (i = 0; i < TDM_SLOT_OFFSET_MAX; i++) {
6609 if (slot_offset[i] != AFE_SLOT_MAPPING_OFFSET_INVALID)
6615 if (offset_channels == 0) {
6616 pr_err("%s: slot offset not supported, offset_channels %d\n",
6617 __func__, offset_channels);
6621 if (channels > offset_channels) {
6622 pr_err("%s: channels %d exceed offset_channels %d\n",
6623 __func__, channels, offset_channels);
6627 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
6628 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
6631 pr_err("%s: failed to set tdm slot, err:%d\n",
6636 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, NULL,
6637 channels, slot_offset);
6639 pr_err("%s: failed to set channel map, err:%d\n",
6644 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
6647 pr_err("%s: failed to set tdm slot, err:%d\n",
6652 ret = snd_soc_dai_set_channel_map(cpu_dai, channels,
6653 slot_offset, 0, NULL);
6655 pr_err("%s: failed to set channel map, err:%d\n",
6664 static struct snd_soc_ops msm_be_ops = {
6665 .hw_params = msm_snd_hw_params,
6668 static struct snd_soc_ops msm_cpe_ops = {
6669 .hw_params = msm_snd_cpe_hw_params,
6672 static struct snd_soc_ops msm_slimbus_2_be_ops = {
6673 .hw_params = msm_slimbus_2_hw_params,
6676 static struct snd_soc_ops msm_wcn_ops = {
6677 .hw_params = msm_wcn_hw_params,
6680 static struct snd_soc_ops msm_tdm_be_ops = {
6681 .hw_params = msm_tdm_snd_hw_params
6684 /* Digital audio interface glue - connects codec <---> CPU */
6685 static struct snd_soc_dai_link msm_common_dai_links[] = {
6686 /* FrontEnd DAI Links */
6688 .name = MSM_DAILINK_NAME(Media1),
6689 .stream_name = "MultiMedia1",
6690 .cpu_dai_name = "MultiMedia1",
6691 .platform_name = "msm-pcm-dsp.0",
6693 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6696 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6697 SND_SOC_DPCM_TRIGGER_POST},
6698 .codec_dai_name = "snd-soc-dummy-dai",
6699 .codec_name = "snd-soc-dummy",
6700 .ignore_suspend = 1,
6701 /* this dainlink has playback support */
6702 .ignore_pmdown_time = 1,
6703 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA1
6706 .name = MSM_DAILINK_NAME(Media2),
6707 .stream_name = "MultiMedia2",
6708 .cpu_dai_name = "MultiMedia2",
6709 .platform_name = "msm-pcm-dsp.0",
6713 .codec_dai_name = "snd-soc-dummy-dai",
6714 .codec_name = "snd-soc-dummy",
6715 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6716 SND_SOC_DPCM_TRIGGER_POST},
6717 .ignore_suspend = 1,
6718 /* this dainlink has playback support */
6719 .ignore_pmdown_time = 1,
6720 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA2,
6723 .name = "VoiceMMode1",
6724 .stream_name = "VoiceMMode1",
6725 .cpu_dai_name = "VoiceMMode1",
6726 .platform_name = "msm-pcm-voice",
6730 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6731 SND_SOC_DPCM_TRIGGER_POST},
6732 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6733 .ignore_suspend = 1,
6734 .ignore_pmdown_time = 1,
6735 .codec_dai_name = "snd-soc-dummy-dai",
6736 .codec_name = "snd-soc-dummy",
6737 .be_id = MSM_FRONTEND_DAI_VOICEMMODE1,
6741 .stream_name = "VoIP",
6742 .cpu_dai_name = "VoIP",
6743 .platform_name = "msm-voip-dsp",
6747 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6748 SND_SOC_DPCM_TRIGGER_POST},
6749 .codec_dai_name = "snd-soc-dummy-dai",
6750 .codec_name = "snd-soc-dummy",
6751 .ignore_suspend = 1,
6752 /* this dainlink has playback support */
6753 .ignore_pmdown_time = 1,
6754 .be_id = MSM_FRONTEND_DAI_VOIP,
6757 .name = MSM_DAILINK_NAME(ULL),
6758 .stream_name = "MultiMedia3",
6759 .cpu_dai_name = "MultiMedia3",
6760 .platform_name = "msm-pcm-dsp.2",
6762 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6764 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6765 SND_SOC_DPCM_TRIGGER_POST},
6766 .codec_dai_name = "snd-soc-dummy-dai",
6767 .codec_name = "snd-soc-dummy",
6768 .ignore_suspend = 1,
6769 /* this dainlink has playback support */
6770 .ignore_pmdown_time = 1,
6771 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA3,
6773 /* Hostless PCM purpose */
6775 .name = "SLIMBUS_0 Hostless",
6776 .stream_name = "SLIMBUS_0 Hostless",
6777 .cpu_dai_name = "SLIMBUS0_HOSTLESS",
6778 .platform_name = "msm-pcm-hostless",
6782 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6783 SND_SOC_DPCM_TRIGGER_POST},
6784 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6785 .ignore_suspend = 1,
6786 /* this dailink has playback support */
6787 .ignore_pmdown_time = 1,
6788 .codec_dai_name = "snd-soc-dummy-dai",
6789 .codec_name = "snd-soc-dummy",
6792 .name = "MSM AFE-PCM RX",
6793 .stream_name = "AFE-PROXY RX",
6794 .cpu_dai_name = "msm-dai-q6-dev.241",
6795 .codec_name = "msm-stub-codec.1",
6796 .codec_dai_name = "msm-stub-rx",
6797 .platform_name = "msm-pcm-afe",
6799 .ignore_suspend = 1,
6800 /* this dainlink has playback support */
6801 .ignore_pmdown_time = 1,
6804 .name = "MSM AFE-PCM TX",
6805 .stream_name = "AFE-PROXY TX",
6806 .cpu_dai_name = "msm-dai-q6-dev.240",
6807 .codec_name = "msm-stub-codec.1",
6808 .codec_dai_name = "msm-stub-tx",
6809 .platform_name = "msm-pcm-afe",
6811 .ignore_suspend = 1,
6814 .name = MSM_DAILINK_NAME(Compress1),
6815 .stream_name = "Compress1",
6816 .cpu_dai_name = "MultiMedia4",
6817 .platform_name = "msm-compress-dsp",
6819 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
6822 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6823 SND_SOC_DPCM_TRIGGER_POST},
6824 .codec_dai_name = "snd-soc-dummy-dai",
6825 .codec_name = "snd-soc-dummy",
6826 .ignore_suspend = 1,
6827 .ignore_pmdown_time = 1,
6828 /* this dainlink has playback support */
6829 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA4,
6832 .name = "AUXPCM Hostless",
6833 .stream_name = "AUXPCM Hostless",
6834 .cpu_dai_name = "AUXPCM_HOSTLESS",
6835 .platform_name = "msm-pcm-hostless",
6839 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6840 SND_SOC_DPCM_TRIGGER_POST},
6841 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6842 .ignore_suspend = 1,
6843 /* this dainlink has playback support */
6844 .ignore_pmdown_time = 1,
6845 .codec_dai_name = "snd-soc-dummy-dai",
6846 .codec_name = "snd-soc-dummy",
6849 .name = "SLIMBUS_1 Hostless",
6850 .stream_name = "SLIMBUS_1 Hostless",
6851 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
6852 .platform_name = "msm-pcm-hostless",
6856 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6857 SND_SOC_DPCM_TRIGGER_POST},
6858 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6859 .ignore_suspend = 1,
6860 /* this dailink has playback support */
6861 .ignore_pmdown_time = 1,
6862 .codec_dai_name = "snd-soc-dummy-dai",
6863 .codec_name = "snd-soc-dummy",
6866 .name = "SLIMBUS_3 Hostless",
6867 .stream_name = "SLIMBUS_3 Hostless",
6868 .cpu_dai_name = "SLIMBUS3_HOSTLESS",
6869 .platform_name = "msm-pcm-hostless",
6873 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6874 SND_SOC_DPCM_TRIGGER_POST},
6875 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6876 .ignore_suspend = 1,
6877 /* this dailink has playback support */
6878 .ignore_pmdown_time = 1,
6879 .codec_dai_name = "snd-soc-dummy-dai",
6880 .codec_name = "snd-soc-dummy",
6883 .name = "SLIMBUS_4 Hostless",
6884 .stream_name = "SLIMBUS_4 Hostless",
6885 .cpu_dai_name = "SLIMBUS4_HOSTLESS",
6886 .platform_name = "msm-pcm-hostless",
6890 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6891 SND_SOC_DPCM_TRIGGER_POST},
6892 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6893 .ignore_suspend = 1,
6894 /* this dailink has playback support */
6895 .ignore_pmdown_time = 1,
6896 .codec_dai_name = "snd-soc-dummy-dai",
6897 .codec_name = "snd-soc-dummy",
6900 .name = MSM_DAILINK_NAME(LowLatency),
6901 .stream_name = "MultiMedia5",
6902 .cpu_dai_name = "MultiMedia5",
6903 .platform_name = "msm-pcm-dsp.1",
6905 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6908 .codec_dai_name = "snd-soc-dummy-dai",
6909 .codec_name = "snd-soc-dummy",
6910 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6911 SND_SOC_DPCM_TRIGGER_POST},
6912 .ignore_suspend = 1,
6913 /* this dainlink has playback support */
6914 .ignore_pmdown_time = 1,
6915 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA5,
6918 .name = "Listen 1 Audio Service",
6919 .stream_name = "Listen 1 Audio Service",
6920 .cpu_dai_name = "LSM1",
6921 .platform_name = "msm-lsm-client",
6924 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6925 SND_SOC_DPCM_TRIGGER_POST },
6926 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6927 .ignore_suspend = 1,
6928 .ignore_pmdown_time = 1,
6929 .codec_dai_name = "snd-soc-dummy-dai",
6930 .codec_name = "snd-soc-dummy",
6931 .be_id = MSM_FRONTEND_DAI_LSM1,
6933 /* Multiple Tunnel instances */
6935 .name = MSM_DAILINK_NAME(Compress2),
6936 .stream_name = "Compress2",
6937 .cpu_dai_name = "MultiMedia7",
6938 .platform_name = "msm-compress-dsp",
6941 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6942 SND_SOC_DPCM_TRIGGER_POST},
6943 .codec_dai_name = "snd-soc-dummy-dai",
6944 .codec_name = "snd-soc-dummy",
6945 .ignore_suspend = 1,
6946 .ignore_pmdown_time = 1,
6947 /* this dainlink has playback support */
6948 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA7,
6951 .name = MSM_DAILINK_NAME(Compress3),
6952 .stream_name = "Compress3",
6953 .cpu_dai_name = "MultiMedia10",
6954 .platform_name = "msm-compress-dsp",
6957 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6958 SND_SOC_DPCM_TRIGGER_POST},
6959 .codec_dai_name = "snd-soc-dummy-dai",
6960 .codec_name = "snd-soc-dummy",
6961 .ignore_suspend = 1,
6962 .ignore_pmdown_time = 1,
6963 /* this dainlink has playback support */
6964 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA10,
6967 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
6968 .stream_name = "MM_NOIRQ",
6969 .cpu_dai_name = "MultiMedia8",
6970 .platform_name = "msm-pcm-dsp-noirq",
6974 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6975 SND_SOC_DPCM_TRIGGER_POST},
6976 .codec_dai_name = "snd-soc-dummy-dai",
6977 .codec_name = "snd-soc-dummy",
6978 .ignore_suspend = 1,
6979 .ignore_pmdown_time = 1,
6980 /* this dainlink has playback support */
6981 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA8,
6985 .name = "HDMI_RX_HOSTLESS",
6986 .stream_name = "HDMI_RX_HOSTLESS",
6987 .cpu_dai_name = "HDMI_HOSTLESS",
6988 .platform_name = "msm-pcm-hostless",
6991 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6992 SND_SOC_DPCM_TRIGGER_POST},
6993 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6994 .ignore_suspend = 1,
6995 .ignore_pmdown_time = 1,
6996 .codec_dai_name = "snd-soc-dummy-dai",
6997 .codec_name = "snd-soc-dummy",
7000 .name = "VoiceMMode2",
7001 .stream_name = "VoiceMMode2",
7002 .cpu_dai_name = "VoiceMMode2",
7003 .platform_name = "msm-pcm-voice",
7007 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7008 SND_SOC_DPCM_TRIGGER_POST},
7009 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7010 .ignore_suspend = 1,
7011 .ignore_pmdown_time = 1,
7012 .codec_dai_name = "snd-soc-dummy-dai",
7013 .codec_name = "snd-soc-dummy",
7014 .be_id = MSM_FRONTEND_DAI_VOICEMMODE2,
7018 .name = "Listen 2 Audio Service",
7019 .stream_name = "Listen 2 Audio Service",
7020 .cpu_dai_name = "LSM2",
7021 .platform_name = "msm-lsm-client",
7024 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7025 SND_SOC_DPCM_TRIGGER_POST },
7026 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7027 .ignore_suspend = 1,
7028 .ignore_pmdown_time = 1,
7029 .codec_dai_name = "snd-soc-dummy-dai",
7030 .codec_name = "snd-soc-dummy",
7031 .be_id = MSM_FRONTEND_DAI_LSM2,
7034 .name = "Listen 3 Audio Service",
7035 .stream_name = "Listen 3 Audio Service",
7036 .cpu_dai_name = "LSM3",
7037 .platform_name = "msm-lsm-client",
7040 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7041 SND_SOC_DPCM_TRIGGER_POST },
7042 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7043 .ignore_suspend = 1,
7044 .ignore_pmdown_time = 1,
7045 .codec_dai_name = "snd-soc-dummy-dai",
7046 .codec_name = "snd-soc-dummy",
7047 .be_id = MSM_FRONTEND_DAI_LSM3,
7050 .name = "Listen 4 Audio Service",
7051 .stream_name = "Listen 4 Audio Service",
7052 .cpu_dai_name = "LSM4",
7053 .platform_name = "msm-lsm-client",
7056 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7057 SND_SOC_DPCM_TRIGGER_POST },
7058 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7059 .ignore_suspend = 1,
7060 .ignore_pmdown_time = 1,
7061 .codec_dai_name = "snd-soc-dummy-dai",
7062 .codec_name = "snd-soc-dummy",
7063 .be_id = MSM_FRONTEND_DAI_LSM4,
7066 .name = "Listen 5 Audio Service",
7067 .stream_name = "Listen 5 Audio Service",
7068 .cpu_dai_name = "LSM5",
7069 .platform_name = "msm-lsm-client",
7072 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7073 SND_SOC_DPCM_TRIGGER_POST },
7074 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7075 .ignore_suspend = 1,
7076 .ignore_pmdown_time = 1,
7077 .codec_dai_name = "snd-soc-dummy-dai",
7078 .codec_name = "snd-soc-dummy",
7079 .be_id = MSM_FRONTEND_DAI_LSM5,
7082 .name = "Listen 6 Audio Service",
7083 .stream_name = "Listen 6 Audio Service",
7084 .cpu_dai_name = "LSM6",
7085 .platform_name = "msm-lsm-client",
7088 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7089 SND_SOC_DPCM_TRIGGER_POST },
7090 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7091 .ignore_suspend = 1,
7092 .ignore_pmdown_time = 1,
7093 .codec_dai_name = "snd-soc-dummy-dai",
7094 .codec_name = "snd-soc-dummy",
7095 .be_id = MSM_FRONTEND_DAI_LSM6,
7098 .name = "Listen 7 Audio Service",
7099 .stream_name = "Listen 7 Audio Service",
7100 .cpu_dai_name = "LSM7",
7101 .platform_name = "msm-lsm-client",
7104 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7105 SND_SOC_DPCM_TRIGGER_POST },
7106 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7107 .ignore_suspend = 1,
7108 .ignore_pmdown_time = 1,
7109 .codec_dai_name = "snd-soc-dummy-dai",
7110 .codec_name = "snd-soc-dummy",
7111 .be_id = MSM_FRONTEND_DAI_LSM7,
7114 .name = "Listen 8 Audio Service",
7115 .stream_name = "Listen 8 Audio Service",
7116 .cpu_dai_name = "LSM8",
7117 .platform_name = "msm-lsm-client",
7120 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
7121 SND_SOC_DPCM_TRIGGER_POST },
7122 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7123 .ignore_suspend = 1,
7124 .ignore_pmdown_time = 1,
7125 .codec_dai_name = "snd-soc-dummy-dai",
7126 .codec_name = "snd-soc-dummy",
7127 .be_id = MSM_FRONTEND_DAI_LSM8,
7130 .name = MSM_DAILINK_NAME(Media9),
7131 .stream_name = "MultiMedia9",
7132 .cpu_dai_name = "MultiMedia9",
7133 .platform_name = "msm-pcm-dsp.0",
7137 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7138 SND_SOC_DPCM_TRIGGER_POST},
7139 .codec_dai_name = "snd-soc-dummy-dai",
7140 .codec_name = "snd-soc-dummy",
7141 .ignore_suspend = 1,
7142 /* this dainlink has playback support */
7143 .ignore_pmdown_time = 1,
7144 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA9,
7147 .name = MSM_DAILINK_NAME(Compress4),
7148 .stream_name = "Compress4",
7149 .cpu_dai_name = "MultiMedia11",
7150 .platform_name = "msm-compress-dsp",
7153 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7154 SND_SOC_DPCM_TRIGGER_POST},
7155 .codec_dai_name = "snd-soc-dummy-dai",
7156 .codec_name = "snd-soc-dummy",
7157 .ignore_suspend = 1,
7158 .ignore_pmdown_time = 1,
7159 /* this dainlink has playback support */
7160 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA11,
7163 .name = MSM_DAILINK_NAME(Compress5),
7164 .stream_name = "Compress5",
7165 .cpu_dai_name = "MultiMedia12",
7166 .platform_name = "msm-compress-dsp",
7169 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7170 SND_SOC_DPCM_TRIGGER_POST},
7171 .codec_dai_name = "snd-soc-dummy-dai",
7172 .codec_name = "snd-soc-dummy",
7173 .ignore_suspend = 1,
7174 .ignore_pmdown_time = 1,
7175 /* this dainlink has playback support */
7176 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA12,
7179 .name = MSM_DAILINK_NAME(Compress6),
7180 .stream_name = "Compress6",
7181 .cpu_dai_name = "MultiMedia13",
7182 .platform_name = "msm-compress-dsp",
7185 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7186 SND_SOC_DPCM_TRIGGER_POST},
7187 .codec_dai_name = "snd-soc-dummy-dai",
7188 .codec_name = "snd-soc-dummy",
7189 .ignore_suspend = 1,
7190 .ignore_pmdown_time = 1,
7191 /* this dainlink has playback support */
7192 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA13,
7195 .name = MSM_DAILINK_NAME(Compress7),
7196 .stream_name = "Compress7",
7197 .cpu_dai_name = "MultiMedia14",
7198 .platform_name = "msm-compress-dsp",
7201 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7202 SND_SOC_DPCM_TRIGGER_POST},
7203 .codec_dai_name = "snd-soc-dummy-dai",
7204 .codec_name = "snd-soc-dummy",
7205 .ignore_suspend = 1,
7206 .ignore_pmdown_time = 1,
7207 /* this dainlink has playback support */
7208 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA14,
7211 .name = MSM_DAILINK_NAME(Compress8),
7212 .stream_name = "Compress8",
7213 .cpu_dai_name = "MultiMedia15",
7214 .platform_name = "msm-compress-dsp",
7217 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7218 SND_SOC_DPCM_TRIGGER_POST},
7219 .codec_dai_name = "snd-soc-dummy-dai",
7220 .codec_name = "snd-soc-dummy",
7221 .ignore_suspend = 1,
7222 .ignore_pmdown_time = 1,
7223 /* this dainlink has playback support */
7224 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA15,
7227 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
7228 .stream_name = "MM_NOIRQ_2",
7229 .cpu_dai_name = "MultiMedia16",
7230 .platform_name = "msm-pcm-dsp-noirq",
7234 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7235 SND_SOC_DPCM_TRIGGER_POST},
7236 .codec_dai_name = "snd-soc-dummy-dai",
7237 .codec_name = "snd-soc-dummy",
7238 .ignore_suspend = 1,
7239 .ignore_pmdown_time = 1,
7240 /* this dainlink has playback support */
7241 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA16,
7244 .name = "SLIMBUS_8 Hostless",
7245 .stream_name = "SLIMBUS8_HOSTLESS Capture",
7246 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
7247 .platform_name = "msm-pcm-hostless",
7250 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7251 SND_SOC_DPCM_TRIGGER_POST},
7252 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7253 .ignore_suspend = 1,
7254 .ignore_pmdown_time = 1,
7255 .codec_dai_name = "snd-soc-dummy-dai",
7256 .codec_name = "snd-soc-dummy",
7260 static struct snd_soc_dai_link msm_tasha_fe_dai_links[] = {
7262 .name = LPASS_BE_SLIMBUS_4_TX,
7263 .stream_name = "Slimbus4 Capture",
7264 .cpu_dai_name = "msm-dai-q6-dev.16393",
7265 .platform_name = "msm-pcm-hostless",
7266 .codec_name = "tasha_codec",
7267 .codec_dai_name = "tasha_vifeedback",
7268 .be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
7269 .be_hw_params_fixup = msm_be_hw_params_fixup,
7271 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7272 .ignore_suspend = 1,
7274 /* Ultrasound RX DAI Link */
7276 .name = "SLIMBUS_2 Hostless Playback",
7277 .stream_name = "SLIMBUS_2 Hostless Playback",
7278 .cpu_dai_name = "msm-dai-q6-dev.16388",
7279 .platform_name = "msm-pcm-hostless",
7280 .codec_name = "tasha_codec",
7281 .codec_dai_name = "tasha_rx2",
7282 .ignore_suspend = 1,
7283 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7284 .ops = &msm_slimbus_2_be_ops,
7286 /* Ultrasound TX DAI Link */
7288 .name = "SLIMBUS_2 Hostless Capture",
7289 .stream_name = "SLIMBUS_2 Hostless Capture",
7290 .cpu_dai_name = "msm-dai-q6-dev.16389",
7291 .platform_name = "msm-pcm-hostless",
7292 .codec_name = "tasha_codec",
7293 .codec_dai_name = "tasha_tx2",
7294 .ignore_suspend = 1,
7295 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7296 .ops = &msm_slimbus_2_be_ops,
7298 /* CPE LSM direct dai-link */
7300 .name = "CPE Listen service",
7301 .stream_name = "CPE Listen Audio Service",
7302 .cpu_dai_name = "msm-dai-slim",
7303 .platform_name = "msm-cpe-lsm",
7304 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7305 SND_SOC_DPCM_TRIGGER_POST},
7306 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7307 .ignore_suspend = 1,
7308 .ignore_pmdown_time = 1,
7309 .codec_dai_name = "tasha_mad1",
7310 .codec_name = "tasha_codec",
7311 .ops = &msm_cpe_ops,
7314 .name = "SLIMBUS_6 Hostless Playback",
7315 .stream_name = "SLIMBUS_6 Hostless",
7316 .cpu_dai_name = "SLIMBUS6_HOSTLESS",
7317 .platform_name = "msm-pcm-hostless",
7320 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7321 SND_SOC_DPCM_TRIGGER_POST},
7322 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7323 .ignore_suspend = 1,
7324 /* this dailink has playback support */
7325 .ignore_pmdown_time = 1,
7326 .codec_dai_name = "snd-soc-dummy-dai",
7327 .codec_name = "snd-soc-dummy",
7329 /* CPE LSM EC PP direct dai-link */
7331 .name = "CPE Listen service ECPP",
7332 .stream_name = "CPE Listen Audio Service ECPP",
7333 .cpu_dai_name = "CPE_LSM_NOHOST",
7334 .platform_name = "msm-cpe-lsm.3",
7335 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7336 SND_SOC_DPCM_TRIGGER_POST},
7337 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7338 .ignore_suspend = 1,
7339 .ignore_pmdown_time = 1,
7340 .codec_dai_name = "tasha_cpe",
7341 .codec_name = "tasha_codec",
7345 static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = {
7347 .name = LPASS_BE_SLIMBUS_4_TX,
7348 .stream_name = "Slimbus4 Capture",
7349 .cpu_dai_name = "msm-dai-q6-dev.16393",
7350 .platform_name = "msm-pcm-hostless",
7351 .codec_name = "tavil_codec",
7352 .codec_dai_name = "tavil_vifeedback",
7353 .be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
7354 .be_hw_params_fixup = msm_be_hw_params_fixup,
7356 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7357 .ignore_suspend = 1,
7359 /* Ultrasound RX DAI Link */
7361 .name = "SLIMBUS_2 Hostless Playback",
7362 .stream_name = "SLIMBUS_2 Hostless Playback",
7363 .cpu_dai_name = "msm-dai-q6-dev.16388",
7364 .platform_name = "msm-pcm-hostless",
7365 .codec_name = "tavil_codec",
7366 .codec_dai_name = "tavil_rx2",
7367 .ignore_suspend = 1,
7368 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7369 .ops = &msm_slimbus_2_be_ops,
7371 /* Ultrasound TX DAI Link */
7373 .name = "SLIMBUS_2 Hostless Capture",
7374 .stream_name = "SLIMBUS_2 Hostless Capture",
7375 .cpu_dai_name = "msm-dai-q6-dev.16389",
7376 .platform_name = "msm-pcm-hostless",
7377 .codec_name = "tavil_codec",
7378 .codec_dai_name = "tavil_tx2",
7379 .ignore_suspend = 1,
7380 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7381 .ops = &msm_slimbus_2_be_ops,
7385 static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
7387 .name = MSM_DAILINK_NAME(ASM Loopback),
7388 .stream_name = "MultiMedia6",
7389 .cpu_dai_name = "MultiMedia6",
7390 .platform_name = "msm-pcm-loopback",
7394 .codec_dai_name = "snd-soc-dummy-dai",
7395 .codec_name = "snd-soc-dummy",
7396 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7397 SND_SOC_DPCM_TRIGGER_POST},
7398 .ignore_suspend = 1,
7399 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7400 .ignore_pmdown_time = 1,
7401 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA6,
7404 .name = "USB Audio Hostless",
7405 .stream_name = "USB Audio Hostless",
7406 .cpu_dai_name = "USBAUDIO_HOSTLESS",
7407 .platform_name = "msm-pcm-hostless",
7411 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7412 SND_SOC_DPCM_TRIGGER_POST},
7413 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
7414 .ignore_suspend = 1,
7415 .ignore_pmdown_time = 1,
7416 .codec_dai_name = "snd-soc-dummy-dai",
7417 .codec_name = "snd-soc-dummy",
7420 .name = MSM_DAILINK_NAME(Transcode Loopback Playback),
7421 .stream_name = "Transcode Loopback Playback",
7422 .cpu_dai_name = "MultiMedia26",
7423 .platform_name = "msm-transcode-loopback",
7426 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7427 SND_SOC_DPCM_TRIGGER_POST},
7428 .codec_dai_name = "snd-soc-dummy-dai",
7429 .codec_name = "snd-soc-dummy",
7430 .ignore_suspend = 1,
7431 .ignore_pmdown_time = 1,
7432 /* this dainlink has playback support */
7433 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA26,
7436 .name = MSM_DAILINK_NAME(Transcode Loopback Capture),
7437 .stream_name = "Transcode Loopback Capture",
7438 .cpu_dai_name = "MultiMedia27",
7439 .platform_name = "msm-transcode-loopback",
7442 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7443 SND_SOC_DPCM_TRIGGER_POST},
7444 .codec_dai_name = "snd-soc-dummy-dai",
7445 .codec_name = "snd-soc-dummy",
7446 .ignore_suspend = 1,
7447 .ignore_pmdown_time = 1,
7448 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA27,
7451 .name = "MultiMedia21",
7452 .stream_name = "MultiMedia21",
7453 .cpu_dai_name = "MultiMedia21",
7454 .platform_name = "msm-pcm-dsp.0",
7456 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
7458 .codec_dai_name = "snd-soc-dummy-dai",
7459 .codec_name = "snd-soc-dummy",
7460 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7461 SND_SOC_DPCM_TRIGGER_POST},
7462 .ignore_suspend = 1,
7463 /* this dainlink has playback support */
7464 .ignore_pmdown_time = 1,
7465 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA21,
7468 .name = "MultiMedia22",
7469 .stream_name = "MultiMedia22",
7470 .cpu_dai_name = "MultiMedia22",
7471 .platform_name = "msm-pcm-dsp.0",
7473 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
7475 .codec_dai_name = "snd-soc-dummy-dai",
7476 .codec_name = "snd-soc-dummy",
7477 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7478 SND_SOC_DPCM_TRIGGER_POST},
7479 .ignore_suspend = 1,
7480 /* this dainlink has playback support */
7481 .ignore_pmdown_time = 1,
7482 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA22,
7485 .name = "MultiMedia23",
7486 .stream_name = "MultiMedia23",
7487 .cpu_dai_name = "MultiMedia23",
7488 .platform_name = "msm-pcm-dsp.0",
7490 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
7492 .codec_dai_name = "snd-soc-dummy-dai",
7493 .codec_name = "snd-soc-dummy",
7494 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7495 SND_SOC_DPCM_TRIGGER_POST},
7496 .ignore_suspend = 1,
7497 /* this dainlink has playback support */
7498 .ignore_pmdown_time = 1,
7499 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA23,
7502 .name = "MultiMedia24",
7503 .stream_name = "MultiMedia24",
7504 .cpu_dai_name = "MultiMedia24",
7505 .platform_name = "msm-pcm-dsp.0",
7507 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
7509 .codec_dai_name = "snd-soc-dummy-dai",
7510 .codec_name = "snd-soc-dummy",
7511 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7512 SND_SOC_DPCM_TRIGGER_POST},
7513 .ignore_suspend = 1,
7514 /* this dainlink has playback support */
7515 .ignore_pmdown_time = 1,
7516 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA24,
7519 .name = "MultiMedia25",
7520 .stream_name = "MultiMedia25",
7521 .cpu_dai_name = "MultiMedia25",
7522 .platform_name = "msm-pcm-dsp.0",
7524 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
7526 .codec_dai_name = "snd-soc-dummy-dai",
7527 .codec_name = "snd-soc-dummy",
7528 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7529 SND_SOC_DPCM_TRIGGER_POST},
7530 .ignore_suspend = 1,
7531 /* this dainlink has playback support */
7532 .ignore_pmdown_time = 1,
7533 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA25,
7537 static struct snd_soc_dai_link msm_common_be_dai_links[] = {
7538 /* Backend AFE DAI Links */
7540 .name = LPASS_BE_AFE_PCM_RX,
7541 .stream_name = "AFE Playback",
7542 .cpu_dai_name = "msm-dai-q6-dev.224",
7543 .platform_name = "msm-pcm-routing",
7544 .codec_name = "msm-stub-codec.1",
7545 .codec_dai_name = "msm-stub-rx",
7548 .be_id = MSM_BACKEND_DAI_AFE_PCM_RX,
7549 .be_hw_params_fixup = msm_be_hw_params_fixup,
7550 /* this dainlink has playback support */
7551 .ignore_pmdown_time = 1,
7552 .ignore_suspend = 1,
7555 .name = LPASS_BE_AFE_PCM_TX,
7556 .stream_name = "AFE Capture",
7557 .cpu_dai_name = "msm-dai-q6-dev.225",
7558 .platform_name = "msm-pcm-routing",
7559 .codec_name = "msm-stub-codec.1",
7560 .codec_dai_name = "msm-stub-tx",
7563 .be_id = MSM_BACKEND_DAI_AFE_PCM_TX,
7564 .be_hw_params_fixup = msm_be_hw_params_fixup,
7565 .ignore_suspend = 1,
7567 /* Incall Record Uplink BACK END DAI Link */
7569 .name = LPASS_BE_INCALL_RECORD_TX,
7570 .stream_name = "Voice Uplink Capture",
7571 .cpu_dai_name = "msm-dai-q6-dev.32772",
7572 .platform_name = "msm-pcm-routing",
7573 .codec_name = "msm-stub-codec.1",
7574 .codec_dai_name = "msm-stub-tx",
7577 .be_id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
7578 .be_hw_params_fixup = msm_be_hw_params_fixup,
7579 .ignore_suspend = 1,
7581 /* Incall Record Downlink BACK END DAI Link */
7583 .name = LPASS_BE_INCALL_RECORD_RX,
7584 .stream_name = "Voice Downlink Capture",
7585 .cpu_dai_name = "msm-dai-q6-dev.32771",
7586 .platform_name = "msm-pcm-routing",
7587 .codec_name = "msm-stub-codec.1",
7588 .codec_dai_name = "msm-stub-tx",
7591 .be_id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
7592 .be_hw_params_fixup = msm_be_hw_params_fixup,
7593 .ignore_suspend = 1,
7595 /* Incall Music BACK END DAI Link */
7597 .name = LPASS_BE_VOICE_PLAYBACK_TX,
7598 .stream_name = "Voice Farend Playback",
7599 .cpu_dai_name = "msm-dai-q6-dev.32773",
7600 .platform_name = "msm-pcm-routing",
7601 .codec_name = "msm-stub-codec.1",
7602 .codec_dai_name = "msm-stub-rx",
7605 .be_id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
7606 .be_hw_params_fixup = msm_be_hw_params_fixup,
7607 .ignore_suspend = 1,
7609 /* Incall Music 2 BACK END DAI Link */
7611 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
7612 .stream_name = "Voice2 Farend Playback",
7613 .cpu_dai_name = "msm-dai-q6-dev.32770",
7614 .platform_name = "msm-pcm-routing",
7615 .codec_name = "msm-stub-codec.1",
7616 .codec_dai_name = "msm-stub-rx",
7619 .be_id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
7620 .be_hw_params_fixup = msm_be_hw_params_fixup,
7621 .ignore_suspend = 1,
7624 .name = LPASS_BE_USB_AUDIO_RX,
7625 .stream_name = "USB Audio Playback",
7626 .cpu_dai_name = "msm-dai-q6-dev.28672",
7627 .platform_name = "msm-pcm-routing",
7628 .codec_name = "msm-stub-codec.1",
7629 .codec_dai_name = "msm-stub-rx",
7632 .be_id = MSM_BACKEND_DAI_USB_RX,
7633 .be_hw_params_fixup = msm_be_hw_params_fixup,
7634 .ignore_pmdown_time = 1,
7635 .ignore_suspend = 1,
7638 .name = LPASS_BE_USB_AUDIO_TX,
7639 .stream_name = "USB Audio Capture",
7640 .cpu_dai_name = "msm-dai-q6-dev.28673",
7641 .platform_name = "msm-pcm-routing",
7642 .codec_name = "msm-stub-codec.1",
7643 .codec_dai_name = "msm-stub-tx",
7646 .be_id = MSM_BACKEND_DAI_USB_TX,
7647 .be_hw_params_fixup = msm_be_hw_params_fixup,
7648 .ignore_suspend = 1,
7651 .name = LPASS_BE_PRI_TDM_RX_0,
7652 .stream_name = "Primary TDM0 Playback",
7653 .cpu_dai_name = "msm-dai-q6-tdm.36864",
7654 .platform_name = "msm-pcm-routing",
7655 .codec_name = "msm-stub-codec.1",
7656 .codec_dai_name = "msm-stub-rx",
7659 .be_id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
7660 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
7661 .ops = &msm8998_tdm_be_ops,
7662 .ignore_suspend = 1,
7665 .name = LPASS_BE_PRI_TDM_TX_0,
7666 .stream_name = "Primary TDM0 Capture",
7667 .cpu_dai_name = "msm-dai-q6-tdm.36865",
7668 .platform_name = "msm-pcm-routing",
7669 .codec_name = "msm-stub-codec.1",
7670 .codec_dai_name = "msm-stub-tx",
7673 .be_id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
7674 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
7675 .ops = &msm8998_tdm_be_ops,
7676 .ignore_suspend = 1,
7679 .name = LPASS_BE_SEC_TDM_RX_0,
7680 .stream_name = "Secondary TDM0 Playback",
7681 .cpu_dai_name = "msm-dai-q6-tdm.36880",
7682 .platform_name = "msm-pcm-routing",
7683 .codec_name = "msm-stub-codec.1",
7684 .codec_dai_name = "msm-stub-rx",
7687 .be_id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
7688 .be_hw_params_fixup = msm_be_hw_params_fixup,
7689 .ops = &msm_tdm_be_ops,
7690 .ignore_suspend = 1,
7693 .name = LPASS_BE_SEC_TDM_TX_0,
7694 .stream_name = "Secondary TDM0 Capture",
7695 .cpu_dai_name = "msm-dai-q6-tdm.36881",
7696 .platform_name = "msm-pcm-routing",
7697 .codec_name = "msm-stub-codec.1",
7698 .codec_dai_name = "msm-stub-tx",
7701 .be_id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
7702 .be_hw_params_fixup = msm_be_hw_params_fixup,
7703 .ops = &msm_tdm_be_ops,
7704 .ignore_suspend = 1,
7707 .name = LPASS_BE_TERT_TDM_RX_0,
7708 .stream_name = "Tertiary TDM0 Playback",
7709 .cpu_dai_name = "msm-dai-q6-tdm.36896",
7710 .platform_name = "msm-pcm-routing",
7711 .codec_name = "msm-stub-codec.1",
7712 .codec_dai_name = "msm-stub-rx",
7715 .be_id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
7716 .be_hw_params_fixup = msm_be_hw_params_fixup,
7717 .ops = &msm_tdm_be_ops,
7718 .ignore_suspend = 1,
7721 .name = LPASS_BE_TERT_TDM_TX_0,
7722 .stream_name = "Tertiary TDM0 Capture",
7723 .cpu_dai_name = "msm-dai-q6-tdm.36897",
7724 .platform_name = "msm-pcm-routing",
7725 .codec_name = "msm-stub-codec.1",
7726 .codec_dai_name = "msm-stub-tx",
7729 .be_id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
7730 .be_hw_params_fixup = msm_be_hw_params_fixup,
7731 .ops = &msm_tdm_be_ops,
7732 .ignore_suspend = 1,
7735 .name = LPASS_BE_QUAT_TDM_RX_0,
7736 .stream_name = "Quaternary TDM0 Playback",
7737 .cpu_dai_name = "msm-dai-q6-tdm.36912",
7738 .platform_name = "msm-pcm-routing",
7739 .codec_name = "msm-stub-codec.1",
7740 .codec_dai_name = "msm-stub-rx",
7743 .be_id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
7744 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
7745 .ops = &msm8998_tdm_be_ops,
7746 .ignore_suspend = 1,
7749 .name = LPASS_BE_QUAT_TDM_TX_0,
7750 .stream_name = "Quaternary TDM0 Capture",
7751 .cpu_dai_name = "msm-dai-q6-tdm.36913",
7752 .platform_name = "msm-pcm-routing",
7753 .codec_name = "msm-stub-codec.1",
7754 .codec_dai_name = "msm-stub-tx",
7757 .be_id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
7758 .be_hw_params_fixup = msm_tdm_be_hw_params_fixup,
7759 .ops = &msm8998_tdm_be_ops,
7760 .ignore_suspend = 1,
7764 static struct snd_soc_dai_link msm_tasha_be_dai_links[] = {
7766 .name = LPASS_BE_SLIMBUS_0_RX,
7767 .stream_name = "Slimbus Playback",
7768 .cpu_dai_name = "msm-dai-q6-dev.16384",
7769 .platform_name = "msm-pcm-routing",
7770 .codec_name = "tasha_codec",
7771 .codec_dai_name = "tasha_mix_rx1",
7774 .be_id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
7775 .init = &msm_audrx_init,
7776 .be_hw_params_fixup = msm_be_hw_params_fixup,
7777 /* this dainlink has playback support */
7778 .ignore_pmdown_time = 1,
7779 .ignore_suspend = 1,
7783 .name = LPASS_BE_SLIMBUS_0_TX,
7784 .stream_name = "Slimbus Capture",
7785 .cpu_dai_name = "msm-dai-q6-dev.16385",
7786 .platform_name = "msm-pcm-routing",
7787 .codec_name = "tasha_codec",
7788 .codec_dai_name = "tasha_tx1",
7791 .be_id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
7792 .be_hw_params_fixup = msm_be_hw_params_fixup,
7793 .ignore_suspend = 1,
7797 .name = LPASS_BE_SLIMBUS_1_RX,
7798 .stream_name = "Slimbus1 Playback",
7799 .cpu_dai_name = "msm-dai-q6-dev.16386",
7800 .platform_name = "msm-pcm-routing",
7801 .codec_name = "tasha_codec",
7802 #ifdef CONFIG_MACH_XIAOMI_MSM8998
7803 .codec_dai_name = "tasha_rx2",
7805 .codec_dai_name = "tasha_mix_rx1",
7809 .be_id = MSM_BACKEND_DAI_SLIMBUS_1_RX,
7810 .be_hw_params_fixup = msm_be_hw_params_fixup,
7812 /* dai link has playback support */
7813 .ignore_pmdown_time = 1,
7814 .ignore_suspend = 1,
7817 .name = LPASS_BE_SLIMBUS_1_TX,
7818 .stream_name = "Slimbus1 Capture",
7819 .cpu_dai_name = "msm-dai-q6-dev.16387",
7820 .platform_name = "msm-pcm-routing",
7821 .codec_name = "tasha_codec",
7822 #ifdef CONFIG_MACH_XIAOMI_MSM8998
7823 .codec_dai_name = "tasha_tx2",
7825 .codec_dai_name = "tasha_tx3",
7829 .be_id = MSM_BACKEND_DAI_SLIMBUS_1_TX,
7830 .be_hw_params_fixup = msm_be_hw_params_fixup,
7832 .ignore_suspend = 1,
7835 .name = LPASS_BE_SLIMBUS_3_RX,
7836 .stream_name = "Slimbus3 Playback",
7837 .cpu_dai_name = "msm-dai-q6-dev.16390",
7838 .platform_name = "msm-pcm-routing",
7839 .codec_name = "tasha_codec",
7840 .codec_dai_name = "tasha_mix_rx1",
7843 .be_id = MSM_BACKEND_DAI_SLIMBUS_3_RX,
7844 .be_hw_params_fixup = msm_be_hw_params_fixup,
7846 /* dai link has playback support */
7847 .ignore_pmdown_time = 1,
7848 .ignore_suspend = 1,
7851 .name = LPASS_BE_SLIMBUS_3_TX,
7852 .stream_name = "Slimbus3 Capture",
7853 .cpu_dai_name = "msm-dai-q6-dev.16391",
7854 .platform_name = "msm-pcm-routing",
7855 .codec_name = "tasha_codec",
7856 .codec_dai_name = "tasha_tx1",
7859 .be_id = MSM_BACKEND_DAI_SLIMBUS_3_TX,
7860 .be_hw_params_fixup = msm_be_hw_params_fixup,
7862 .ignore_suspend = 1,
7865 .name = LPASS_BE_SLIMBUS_4_RX,
7866 .stream_name = "Slimbus4 Playback",
7867 .cpu_dai_name = "msm-dai-q6-dev.16392",
7868 .platform_name = "msm-pcm-routing",
7869 .codec_name = "tasha_codec",
7870 .codec_dai_name = "tasha_mix_rx1",
7873 .be_id = MSM_BACKEND_DAI_SLIMBUS_4_RX,
7874 .be_hw_params_fixup = msm_be_hw_params_fixup,
7876 /* dai link has playback support */
7877 .ignore_pmdown_time = 1,
7878 .ignore_suspend = 1,
7881 .name = LPASS_BE_SLIMBUS_5_RX,
7882 .stream_name = "Slimbus5 Playback",
7883 .cpu_dai_name = "msm-dai-q6-dev.16394",
7884 .platform_name = "msm-pcm-routing",
7885 .codec_name = "tasha_codec",
7886 .codec_dai_name = "tasha_rx3",
7889 .be_id = MSM_BACKEND_DAI_SLIMBUS_5_RX,
7890 .be_hw_params_fixup = msm_be_hw_params_fixup,
7892 /* dai link has playback support */
7893 .ignore_pmdown_time = 1,
7894 .ignore_suspend = 1,
7898 .name = LPASS_BE_SLIMBUS_5_TX,
7899 .stream_name = "Slimbus5 Capture",
7900 .cpu_dai_name = "msm-dai-q6-dev.16395",
7901 .platform_name = "msm-pcm-routing",
7902 .codec_name = "tasha_codec",
7903 .codec_dai_name = "tasha_mad1",
7906 .be_id = MSM_BACKEND_DAI_SLIMBUS_5_TX,
7907 .be_hw_params_fixup = msm_be_hw_params_fixup,
7909 .ignore_suspend = 1,
7912 .name = LPASS_BE_SLIMBUS_6_RX,
7913 .stream_name = "Slimbus6 Playback",
7914 .cpu_dai_name = "msm-dai-q6-dev.16396",
7915 .platform_name = "msm-pcm-routing",
7916 .codec_name = "tasha_codec",
7917 .codec_dai_name = "tasha_rx4",
7920 .be_id = MSM_BACKEND_DAI_SLIMBUS_6_RX,
7921 .be_hw_params_fixup = msm_be_hw_params_fixup,
7923 /* dai link has playback support */
7924 .ignore_pmdown_time = 1,
7925 .ignore_suspend = 1,
7927 /* Slimbus VI Recording */
7929 .name = LPASS_BE_SLIMBUS_TX_VI,
7930 .stream_name = "Slimbus4 Capture",
7931 .cpu_dai_name = "msm-dai-q6-dev.16393",
7932 .platform_name = "msm-pcm-routing",
7933 .codec_name = "tasha_codec",
7934 .codec_dai_name = "tasha_vifeedback",
7935 .be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
7936 .be_hw_params_fixup = msm_be_hw_params_fixup,
7938 .ignore_suspend = 1,
7941 .ignore_pmdown_time = 1,
7945 static struct snd_soc_dai_link msm_tavil_be_dai_links[] = {
7947 .name = LPASS_BE_SLIMBUS_0_RX,
7948 .stream_name = "Slimbus Playback",
7949 .cpu_dai_name = "msm-dai-q6-dev.16384",
7950 .platform_name = "msm-pcm-routing",
7951 .codec_name = "tavil_codec",
7952 .codec_dai_name = "tavil_rx1",
7955 .be_id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
7956 .init = &msm_audrx_init,
7957 .be_hw_params_fixup = msm_be_hw_params_fixup,
7958 /* this dainlink has playback support */
7959 .ignore_pmdown_time = 1,
7960 .ignore_suspend = 1,
7964 .name = LPASS_BE_SLIMBUS_0_TX,
7965 .stream_name = "Slimbus Capture",
7966 .cpu_dai_name = "msm-dai-q6-dev.16385",
7967 .platform_name = "msm-pcm-routing",
7968 .codec_name = "tavil_codec",
7969 .codec_dai_name = "tavil_tx1",
7972 .be_id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
7973 .be_hw_params_fixup = msm_be_hw_params_fixup,
7974 .ignore_suspend = 1,
7978 .name = LPASS_BE_SLIMBUS_1_RX,
7979 .stream_name = "Slimbus1 Playback",
7980 .cpu_dai_name = "msm-dai-q6-dev.16386",
7981 .platform_name = "msm-pcm-routing",
7982 .codec_name = "tavil_codec",
7983 .codec_dai_name = "tavil_rx1",
7986 .be_id = MSM_BACKEND_DAI_SLIMBUS_1_RX,
7987 .be_hw_params_fixup = msm_be_hw_params_fixup,
7989 /* dai link has playback support */
7990 .ignore_pmdown_time = 1,
7991 .ignore_suspend = 1,
7994 .name = LPASS_BE_SLIMBUS_1_TX,
7995 .stream_name = "Slimbus1 Capture",
7996 .cpu_dai_name = "msm-dai-q6-dev.16387",
7997 .platform_name = "msm-pcm-routing",
7998 .codec_name = "tavil_codec",
7999 .codec_dai_name = "tavil_tx3",
8002 .be_id = MSM_BACKEND_DAI_SLIMBUS_1_TX,
8003 .be_hw_params_fixup = msm_be_hw_params_fixup,
8005 .ignore_suspend = 1,
8008 .name = LPASS_BE_SLIMBUS_2_RX,
8009 .stream_name = "Slimbus2 Playback",
8010 .cpu_dai_name = "msm-dai-q6-dev.16388",
8011 .platform_name = "msm-pcm-routing",
8012 .codec_name = "tavil_codec",
8013 .codec_dai_name = "tavil_rx2",
8016 .be_id = MSM_BACKEND_DAI_SLIMBUS_2_RX,
8017 .be_hw_params_fixup = msm_be_hw_params_fixup,
8019 .ignore_pmdown_time = 1,
8020 .ignore_suspend = 1,
8023 .name = LPASS_BE_SLIMBUS_3_RX,
8024 .stream_name = "Slimbus3 Playback",
8025 .cpu_dai_name = "msm-dai-q6-dev.16390",
8026 .platform_name = "msm-pcm-routing",
8027 .codec_name = "tavil_codec",
8028 .codec_dai_name = "tavil_rx1",
8031 .be_id = MSM_BACKEND_DAI_SLIMBUS_3_RX,
8032 .be_hw_params_fixup = msm_be_hw_params_fixup,
8034 /* dai link has playback support */
8035 .ignore_pmdown_time = 1,
8036 .ignore_suspend = 1,
8039 .name = LPASS_BE_SLIMBUS_3_TX,
8040 .stream_name = "Slimbus3 Capture",
8041 .cpu_dai_name = "msm-dai-q6-dev.16391",
8042 .platform_name = "msm-pcm-routing",
8043 .codec_name = "tavil_codec",
8044 .codec_dai_name = "tavil_tx1",
8047 .be_id = MSM_BACKEND_DAI_SLIMBUS_3_TX,
8048 .be_hw_params_fixup = msm_be_hw_params_fixup,
8050 .ignore_suspend = 1,
8053 .name = LPASS_BE_SLIMBUS_4_RX,
8054 .stream_name = "Slimbus4 Playback",
8055 .cpu_dai_name = "msm-dai-q6-dev.16392",
8056 .platform_name = "msm-pcm-routing",
8057 .codec_name = "tavil_codec",
8058 .codec_dai_name = "tavil_rx1",
8061 .be_id = MSM_BACKEND_DAI_SLIMBUS_4_RX,
8062 .be_hw_params_fixup = msm_be_hw_params_fixup,
8064 /* dai link has playback support */
8065 .ignore_pmdown_time = 1,
8066 .ignore_suspend = 1,
8069 .name = LPASS_BE_SLIMBUS_5_RX,
8070 .stream_name = "Slimbus5 Playback",
8071 .cpu_dai_name = "msm-dai-q6-dev.16394",
8072 .platform_name = "msm-pcm-routing",
8073 .codec_name = "tavil_codec",
8074 .codec_dai_name = "tavil_rx3",
8077 .be_id = MSM_BACKEND_DAI_SLIMBUS_5_RX,
8078 .be_hw_params_fixup = msm_be_hw_params_fixup,
8080 /* dai link has playback support */
8081 .ignore_pmdown_time = 1,
8082 .ignore_suspend = 1,
8086 .name = LPASS_BE_SLIMBUS_5_TX,
8087 .stream_name = "Slimbus5 Capture",
8088 .cpu_dai_name = "msm-dai-q6-dev.16395",
8089 .platform_name = "msm-pcm-routing",
8090 .codec_name = "tavil_codec",
8091 .codec_dai_name = "tavil_mad1",
8094 .be_id = MSM_BACKEND_DAI_SLIMBUS_5_TX,
8095 .be_hw_params_fixup = msm_be_hw_params_fixup,
8097 .ignore_suspend = 1,
8100 .name = LPASS_BE_SLIMBUS_6_RX,
8101 .stream_name = "Slimbus6 Playback",
8102 .cpu_dai_name = "msm-dai-q6-dev.16396",
8103 .platform_name = "msm-pcm-routing",
8104 .codec_name = "tavil_codec",
8105 .codec_dai_name = "tavil_rx4",
8108 .be_id = MSM_BACKEND_DAI_SLIMBUS_6_RX,
8109 .be_hw_params_fixup = msm_be_hw_params_fixup,
8111 /* dai link has playback support */
8112 .ignore_pmdown_time = 1,
8113 .ignore_suspend = 1,
8115 /* Slimbus VI Recording */
8117 .name = LPASS_BE_SLIMBUS_TX_VI,
8118 .stream_name = "Slimbus4 Capture",
8119 .cpu_dai_name = "msm-dai-q6-dev.16393",
8120 .platform_name = "msm-pcm-routing",
8121 .codec_name = "tavil_codec",
8122 .codec_dai_name = "tavil_vifeedback",
8123 .be_id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
8124 .be_hw_params_fixup = msm_be_hw_params_fixup,
8126 .ignore_suspend = 1,
8129 .ignore_pmdown_time = 1,
8133 static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
8135 .name = LPASS_BE_SLIMBUS_7_RX,
8136 .stream_name = "Slimbus7 Playback",
8137 .cpu_dai_name = "msm-dai-q6-dev.16398",
8138 .platform_name = "msm-pcm-routing",
8139 .codec_name = "btfmslim_slave",
8140 /* BT codec driver determines capabilities based on
8141 * dai name, bt codecdai name should always contains
8142 * supported usecase information
8144 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
8147 .be_id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
8148 .be_hw_params_fixup = msm_be_hw_params_fixup,
8149 .ops = &msm_wcn_ops,
8150 /* dai link has playback support */
8151 .ignore_pmdown_time = 1,
8152 .ignore_suspend = 1,
8155 .name = LPASS_BE_SLIMBUS_7_TX,
8156 .stream_name = "Slimbus7 Capture",
8157 .cpu_dai_name = "msm-dai-q6-dev.16399",
8158 .platform_name = "msm-pcm-routing",
8159 .codec_name = "btfmslim_slave",
8160 .codec_dai_name = "btfm_bt_sco_slim_tx",
8163 .be_id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
8164 .be_hw_params_fixup = msm_be_hw_params_fixup,
8165 .ops = &msm_wcn_ops,
8166 .ignore_suspend = 1,
8169 .name = LPASS_BE_SLIMBUS_8_TX,
8170 .stream_name = "Slimbus8 Capture",
8171 .cpu_dai_name = "msm-dai-q6-dev.16401",
8172 .platform_name = "msm-pcm-routing",
8173 .codec_name = "btfmslim_slave",
8174 .codec_dai_name = "btfm_fm_slim_tx",
8177 .be_id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
8178 .be_hw_params_fixup = msm_be_hw_params_fixup,
8179 .init = &msm_wcn_init,
8180 .ops = &msm_wcn_ops,
8181 .ignore_suspend = 1,
8185 static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
8186 /* HDMI BACK END DAI Link */
8188 .name = LPASS_BE_HDMI,
8189 .stream_name = "HDMI Playback",
8190 .cpu_dai_name = "msm-dai-q6-hdmi.8",
8191 .platform_name = "msm-pcm-routing",
8192 .codec_name = "msm-ext-disp-audio-codec-rx",
8193 .codec_dai_name = "msm_hdmi_audio_codec_rx_dai",
8196 .be_id = MSM_BACKEND_DAI_HDMI_RX,
8197 .be_hw_params_fixup = msm_be_hw_params_fixup,
8198 .ignore_pmdown_time = 1,
8199 .ignore_suspend = 1,
8201 /* DISP PORT BACK END DAI Link */
8203 .name = LPASS_BE_DISPLAY_PORT,
8204 .stream_name = "Display Port Playback",
8205 .cpu_dai_name = "msm-dai-q6-dp.24608",
8206 .platform_name = "msm-pcm-routing",
8207 .codec_name = "msm-ext-disp-audio-codec-rx",
8208 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
8211 .be_id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
8212 .be_hw_params_fixup = msm_be_hw_params_fixup,
8213 .ignore_pmdown_time = 1,
8214 .ignore_suspend = 1,
8218 static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
8220 .name = LPASS_BE_PRI_MI2S_RX,
8221 .stream_name = "Primary MI2S Playback",
8222 .cpu_dai_name = "msm-dai-q6-mi2s.0",
8223 .platform_name = "msm-pcm-routing",
8224 .codec_name = "msm-stub-codec.1",
8225 .codec_dai_name = "msm-stub-rx",
8228 .be_id = MSM_BACKEND_DAI_PRI_MI2S_RX,
8229 .be_hw_params_fixup = msm_be_hw_params_fixup,
8230 .ops = &msm_mi2s_be_ops,
8231 .ignore_suspend = 1,
8232 .ignore_pmdown_time = 1,
8235 .name = LPASS_BE_PRI_MI2S_TX,
8236 .stream_name = "Primary MI2S Capture",
8237 .cpu_dai_name = "msm-dai-q6-mi2s.0",
8238 .platform_name = "msm-pcm-routing",
8239 .codec_name = "msm-stub-codec.1",
8240 .codec_dai_name = "msm-stub-tx",
8243 .be_id = MSM_BACKEND_DAI_PRI_MI2S_TX,
8244 .be_hw_params_fixup = msm_be_hw_params_fixup,
8245 .ops = &msm_mi2s_be_ops,
8246 .ignore_suspend = 1,
8249 .name = LPASS_BE_SEC_MI2S_RX,
8250 .stream_name = "Secondary MI2S Playback",
8251 .cpu_dai_name = "msm-dai-q6-mi2s.1",
8252 .platform_name = "msm-pcm-routing",
8253 .codec_name = "msm-stub-codec.1",
8254 .codec_dai_name = "msm-stub-rx",
8257 .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
8258 .be_hw_params_fixup = msm_be_hw_params_fixup,
8259 .ops = &msm_mi2s_be_ops,
8260 .ignore_suspend = 1,
8261 .ignore_pmdown_time = 1,
8264 .name = LPASS_BE_SEC_MI2S_TX,
8265 .stream_name = "Secondary MI2S Capture",
8266 .cpu_dai_name = "msm-dai-q6-mi2s.1",
8267 .platform_name = "msm-pcm-routing",
8268 .codec_name = "msm-stub-codec.1",
8269 .codec_dai_name = "msm-stub-tx",
8272 .be_id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
8273 .be_hw_params_fixup = msm_be_hw_params_fixup,
8274 .ops = &msm_mi2s_be_ops,
8275 .ignore_suspend = 1,
8278 .name = LPASS_BE_TERT_MI2S_RX,
8279 .stream_name = "Tertiary MI2S Playback",
8280 .cpu_dai_name = "msm-dai-q6-mi2s.2",
8281 .platform_name = "msm-pcm-routing",
8282 .codec_name = "msm-stub-codec.1",
8283 .codec_dai_name = "msm-stub-rx",
8286 .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
8287 .be_hw_params_fixup = msm_be_hw_params_fixup,
8288 .ops = &msm_mi2s_be_ops,
8289 .ignore_suspend = 1,
8290 .ignore_pmdown_time = 1,
8293 .name = LPASS_BE_TERT_MI2S_TX,
8294 .stream_name = "Tertiary MI2S Capture",
8295 .cpu_dai_name = "msm-dai-q6-mi2s.2",
8296 .platform_name = "msm-pcm-routing",
8297 .codec_name = "msm-stub-codec.1",
8298 .codec_dai_name = "msm-stub-tx",
8301 .be_id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
8302 .be_hw_params_fixup = msm_be_hw_params_fixup,
8303 .ops = &msm_mi2s_be_ops,
8304 .ignore_suspend = 1,
8306 #ifdef CONFIG_MACH_XIAOMI_MSM8998
8309 static struct snd_soc_dai_link msm_quat_mi2s_stub_dai_links[] = {
8312 .name = LPASS_BE_QUAT_MI2S_RX,
8313 .stream_name = "Quaternary MI2S Playback",
8314 .cpu_dai_name = "msm-dai-q6-mi2s.3",
8315 .platform_name = "msm-pcm-routing",
8316 .codec_name = "msm-stub-codec.1",
8317 .codec_dai_name = "msm-stub-rx",
8320 .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
8321 .be_hw_params_fixup = msm_be_hw_params_fixup,
8322 .ops = &msm_mi2s_be_ops,
8323 .ignore_suspend = 1,
8324 .ignore_pmdown_time = 1,
8327 .name = LPASS_BE_QUAT_MI2S_TX,
8328 .stream_name = "Quaternary MI2S Capture",
8329 .cpu_dai_name = "msm-dai-q6-mi2s.3",
8330 .platform_name = "msm-pcm-routing",
8331 .codec_name = "msm-stub-codec.1",
8332 .codec_dai_name = "msm-stub-tx",
8335 .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
8336 .be_hw_params_fixup = msm_be_hw_params_fixup,
8337 .ops = &msm_mi2s_be_ops,
8338 .ignore_suspend = 1,
8342 #ifdef CONFIG_MACH_XIAOMI_MSM8998
8343 static struct snd_soc_dai_link msm_quat_mi2s_tfa98xx_dai_links[] = {
8345 .name = LPASS_BE_QUAT_MI2S_RX,
8346 .stream_name = "Quaternary MI2S Playback",
8347 .cpu_dai_name = "msm-dai-q6-mi2s.3",
8348 .platform_name = "msm-pcm-routing",
8349 .codec_name = "tfa98xx.10-0034",
8350 .codec_dai_name = "tfa98xx-aif-a-34",
8352 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS,
8354 .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
8355 .be_hw_params_fixup = msm_be_hw_params_fixup,
8356 .ops = &msm_mi2s_be_ops,
8357 .ignore_suspend = 1,
8358 .ignore_pmdown_time = 1,
8361 .name = LPASS_BE_QUAT_MI2S_TX,
8362 .stream_name = "Quaternary MI2S Capture",
8363 .cpu_dai_name = "msm-dai-q6-mi2s.3",
8364 .platform_name = "msm-pcm-routing",
8365 .codec_name = "msm-stub-codec.1",
8366 .codec_dai_name = "msm-stub-tx",
8369 .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
8370 .be_hw_params_fixup = msm_be_hw_params_fixup,
8371 .ops = &msm_mi2s_be_ops,
8372 .ignore_suspend = 1,
8376 static struct snd_soc_dai_link msm_quat_mi2s_tas2559_dai_links[] = {
8378 .name = LPASS_BE_QUAT_MI2S_RX,
8379 .stream_name = "Quaternary MI2S Playback",
8380 .cpu_dai_name = "msm-dai-q6-mi2s.3",
8381 .platform_name = "msm-pcm-routing",
8382 .codec_name = "tas2559.10-004c",
8383 .codec_dai_name = "tas2559 ASI1",
8385 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_CBS_CFS,
8387 .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
8388 .be_hw_params_fixup = msm_be_hw_params_fixup,
8389 .ops = &msm_mi2s_be_ops,
8390 .ignore_suspend = 1,
8391 .ignore_pmdown_time = 1,
8394 .name = LPASS_BE_QUAT_MI2S_TX,
8395 .stream_name = "Quaternary MI2S Capture",
8396 .cpu_dai_name = "msm-dai-q6-mi2s.3",
8397 .platform_name = "msm-pcm-routing",
8398 .codec_name = "msm-stub-codec.1",
8399 .codec_dai_name = "msm-stub-tx",
8402 .be_id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
8403 .be_hw_params_fixup = msm_be_hw_params_fixup,
8404 .ops = &msm_mi2s_be_ops,
8405 .ignore_suspend = 1,
8410 static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
8411 /* Primary AUX PCM Backend DAI Links */
8413 .name = LPASS_BE_AUXPCM_RX,
8414 .stream_name = "AUX PCM Playback",
8415 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
8416 .platform_name = "msm-pcm-routing",
8417 .codec_name = "msm-stub-codec.1",
8418 .codec_dai_name = "msm-stub-rx",
8421 .be_id = MSM_BACKEND_DAI_AUXPCM_RX,
8422 .be_hw_params_fixup = msm_be_hw_params_fixup,
8423 .ignore_pmdown_time = 1,
8424 .ignore_suspend = 1,
8425 .ops = &msm_aux_pcm_be_ops,
8428 .name = LPASS_BE_AUXPCM_TX,
8429 .stream_name = "AUX PCM Capture",
8430 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
8431 .platform_name = "msm-pcm-routing",
8432 .codec_name = "msm-stub-codec.1",
8433 .codec_dai_name = "msm-stub-tx",
8436 .be_id = MSM_BACKEND_DAI_AUXPCM_TX,
8437 .be_hw_params_fixup = msm_be_hw_params_fixup,
8438 .ignore_pmdown_time = 1,
8439 .ignore_suspend = 1,
8440 .ops = &msm_aux_pcm_be_ops,
8442 /* Secondary AUX PCM Backend DAI Links */
8444 .name = LPASS_BE_SEC_AUXPCM_RX,
8445 .stream_name = "Sec AUX PCM Playback",
8446 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
8447 .platform_name = "msm-pcm-routing",
8448 .codec_name = "msm-stub-codec.1",
8449 .codec_dai_name = "msm-stub-rx",
8452 .be_id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
8453 .be_hw_params_fixup = msm_be_hw_params_fixup,
8454 .ignore_pmdown_time = 1,
8455 .ignore_suspend = 1,
8456 .ops = &msm_aux_pcm_be_ops,
8459 .name = LPASS_BE_SEC_AUXPCM_TX,
8460 .stream_name = "Sec AUX PCM Capture",
8461 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
8462 .platform_name = "msm-pcm-routing",
8463 .codec_name = "msm-stub-codec.1",
8464 .codec_dai_name = "msm-stub-tx",
8467 .be_id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
8468 .be_hw_params_fixup = msm_be_hw_params_fixup,
8469 .ignore_suspend = 1,
8470 .ignore_pmdown_time = 1,
8471 .ops = &msm_aux_pcm_be_ops,
8473 /* Tertiary AUX PCM Backend DAI Links */
8475 .name = LPASS_BE_TERT_AUXPCM_RX,
8476 .stream_name = "Tert AUX PCM Playback",
8477 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
8478 .platform_name = "msm-pcm-routing",
8479 .codec_name = "msm-stub-codec.1",
8480 .codec_dai_name = "msm-stub-rx",
8483 .be_id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
8484 .be_hw_params_fixup = msm_be_hw_params_fixup,
8485 .ignore_pmdown_time = 1,
8486 .ignore_suspend = 1,
8487 .ops = &msm_aux_pcm_be_ops,
8490 .name = LPASS_BE_TERT_AUXPCM_TX,
8491 .stream_name = "Tert AUX PCM Capture",
8492 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
8493 .platform_name = "msm-pcm-routing",
8494 .codec_name = "msm-stub-codec.1",
8495 .codec_dai_name = "msm-stub-tx",
8498 .be_id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
8499 .be_hw_params_fixup = msm_be_hw_params_fixup,
8500 .ignore_suspend = 1,
8501 .ignore_pmdown_time = 1,
8502 .ops = &msm_aux_pcm_be_ops,
8504 /* Quaternary AUX PCM Backend DAI Links */
8506 .name = LPASS_BE_QUAT_AUXPCM_RX,
8507 .stream_name = "Quat AUX PCM Playback",
8508 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
8509 .platform_name = "msm-pcm-routing",
8510 .codec_name = "msm-stub-codec.1",
8511 .codec_dai_name = "msm-stub-rx",
8514 .be_id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
8515 .be_hw_params_fixup = msm_be_hw_params_fixup,
8516 .ignore_pmdown_time = 1,
8517 .ignore_suspend = 1,
8518 .ops = &msm_aux_pcm_be_ops,
8521 .name = LPASS_BE_QUAT_AUXPCM_TX,
8522 .stream_name = "Quat AUX PCM Capture",
8523 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
8524 .platform_name = "msm-pcm-routing",
8525 .codec_name = "msm-stub-codec.1",
8526 .codec_dai_name = "msm-stub-tx",
8529 .be_id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
8530 .be_hw_params_fixup = msm_be_hw_params_fixup,
8531 .ignore_suspend = 1,
8532 .ignore_pmdown_time = 1,
8533 .ops = &msm_aux_pcm_be_ops,
8537 static struct snd_soc_dai_link msm_tasha_dai_links[
8538 ARRAY_SIZE(msm_common_dai_links) +
8539 ARRAY_SIZE(msm_tasha_fe_dai_links) +
8540 ARRAY_SIZE(msm_common_misc_fe_dai_links) +
8541 ARRAY_SIZE(msm_common_be_dai_links) +
8542 ARRAY_SIZE(msm_tasha_be_dai_links) +
8543 ARRAY_SIZE(msm_wcn_be_dai_links) +
8544 ARRAY_SIZE(ext_disp_be_dai_link) +
8545 ARRAY_SIZE(msm_mi2s_be_dai_links) +
8546 #ifdef CONFIG_MACH_XIAOMI_MSM8998
8547 ARRAY_SIZE(msm_mi2s_be_dai_links) +
8548 ARRAY_SIZE(msm_quat_mi2s_stub_dai_links) +
8550 ARRAY_SIZE(msm_auxpcm_be_dai_links)];
8552 static struct snd_soc_dai_link msm_tavil_dai_links[
8553 ARRAY_SIZE(msm_common_dai_links) +
8554 ARRAY_SIZE(msm_tavil_fe_dai_links) +
8555 ARRAY_SIZE(msm_common_misc_fe_dai_links) +
8556 ARRAY_SIZE(msm_common_be_dai_links) +
8557 ARRAY_SIZE(msm_tavil_be_dai_links) +
8558 ARRAY_SIZE(msm_wcn_be_dai_links) +
8559 ARRAY_SIZE(ext_disp_be_dai_link) +
8560 ARRAY_SIZE(msm_mi2s_be_dai_links) +
8561 #ifdef CONFIG_MACH_XIAOMI_MSM8998
8562 ARRAY_SIZE(msm_mi2s_be_dai_links) +
8563 ARRAY_SIZE(msm_quat_mi2s_stub_dai_links) +
8565 ARRAY_SIZE(msm_auxpcm_be_dai_links)];
8567 static int msm_snd_card_late_probe(struct snd_soc_card *card)
8569 const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
8570 struct snd_soc_pcm_runtime *rtd;
8572 void *mbhc_calibration;
8574 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
8577 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
8578 __func__, be_dl_name);
8580 goto err_pcm_runtime;
8583 mbhc_calibration = def_tasha_mbhc_cal();
8584 if (!mbhc_calibration) {
8588 wcd_mbhc_cfg.calibration = mbhc_calibration;
8589 ret = tasha_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg);
8591 dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n",
8598 kfree(mbhc_calibration);
8604 static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card)
8606 const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
8607 struct snd_soc_pcm_runtime *rtd;
8609 void *mbhc_calibration;
8611 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
8614 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
8615 __func__, be_dl_name);
8617 goto err_pcm_runtime;
8620 mbhc_calibration = def_tavil_mbhc_cal();
8621 if (!mbhc_calibration) {
8625 wcd_mbhc_cfg.calibration = mbhc_calibration;
8626 ret = tavil_mbhc_hs_detect(rtd->codec, &wcd_mbhc_cfg);
8628 dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n",
8635 kfree(mbhc_calibration);
8641 struct snd_soc_card snd_soc_card_tasha_msm = {
8642 .name = "msm8998-tasha-snd-card",
8643 .late_probe = msm_snd_card_late_probe,
8646 struct snd_soc_card snd_soc_card_tavil_msm = {
8647 .name = "msm8998-tavil-snd-card",
8648 .late_probe = msm_snd_card_tavil_late_probe,
8651 static int msm_populate_dai_link_component_of_node(
8652 struct snd_soc_card *card)
8654 int i, index, ret = 0;
8655 struct device *cdev = card->dev;
8656 struct snd_soc_dai_link *dai_link = card->dai_link;
8657 struct device_node *np;
8660 pr_err("%s: Sound card device memory NULL\n", __func__);
8664 for (i = 0; i < card->num_links; i++) {
8665 if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node)
8668 /* populate platform_of_node for snd card dai links */
8669 if (dai_link[i].platform_name &&
8670 !dai_link[i].platform_of_node) {
8671 index = of_property_match_string(cdev->of_node,
8672 "asoc-platform-names",
8673 dai_link[i].platform_name);
8675 pr_err("%s: No match found for platform name: %s\n",
8676 __func__, dai_link[i].platform_name);
8680 np = of_parse_phandle(cdev->of_node, "asoc-platform",
8683 pr_err("%s: retrieving phandle for platform %s, index %d failed\n",
8684 __func__, dai_link[i].platform_name,
8689 dai_link[i].platform_of_node = np;
8690 dai_link[i].platform_name = NULL;
8693 /* populate cpu_of_node for snd card dai links */
8694 if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) {
8695 index = of_property_match_string(cdev->of_node,
8697 dai_link[i].cpu_dai_name);
8699 np = of_parse_phandle(cdev->of_node, "asoc-cpu",
8702 pr_err("%s: retrieving phandle for cpu dai %s failed\n",
8704 dai_link[i].cpu_dai_name);
8708 dai_link[i].cpu_of_node = np;
8709 dai_link[i].cpu_dai_name = NULL;
8713 /* populate codec_of_node for snd card dai links */
8714 if (dai_link[i].codec_name && !dai_link[i].codec_of_node) {
8715 index = of_property_match_string(cdev->of_node,
8717 dai_link[i].codec_name);
8720 np = of_parse_phandle(cdev->of_node, "asoc-codec",
8723 pr_err("%s: retrieving phandle for codec %s failed\n",
8724 __func__, dai_link[i].codec_name);
8728 dai_link[i].codec_of_node = np;
8729 dai_link[i].codec_name = NULL;
8737 static int msm_prepare_us_euro(struct snd_soc_card *card)
8739 struct msm_asoc_mach_data *pdata =
8740 snd_soc_card_get_drvdata(card);
8743 if (pdata->us_euro_gpio >= 0) {
8744 dev_dbg(card->dev, "%s: us_euro gpio request %d", __func__,
8745 pdata->us_euro_gpio);
8746 ret = gpio_request(pdata->us_euro_gpio, "TASHA_CODEC_US_EURO");
8749 "%s: Failed to request codec US/EURO gpio %d error %d\n",
8750 __func__, pdata->us_euro_gpio, ret);
8757 #ifdef CONFIG_MACH_XIAOMI_MSM8998
8758 static int msm_prepare_ras_switch(struct snd_soc_card *card)
8762 if (gpio_is_valid(ras_switch_en_gpio)) {
8763 dev_dbg(card->dev, "%s: ras_switch_en_gpio request %d\n", __func__,
8764 ras_switch_en_gpio);
8765 ret = gpio_request(ras_switch_en_gpio, "ras_switch_en");
8768 "%s: ras_switch_en_gpio request failed, ret:%d\n",
8772 gpio_direction_output(ras_switch_en_gpio, 0);
8774 if (gpio_is_valid(ras_switch_sel_gpio)) {
8775 dev_dbg(card->dev, "%s: ras_switch_sel_gpio request %d\n", __func__,
8776 ras_switch_sel_gpio);
8777 ret = gpio_request(ras_switch_sel_gpio, "ras_switch_sel");
8780 "%s: ras_switch_sel_gpio request failed, ret:%d\n",
8784 gpio_direction_output(ras_switch_sel_gpio, 0);
8792 static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd)
8795 struct snd_soc_codec *codec = rtd->codec;
8796 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
8798 ret = snd_soc_add_codec_controls(codec, msm_snd_controls,
8799 ARRAY_SIZE(msm_snd_controls));
8801 dev_err(codec->dev, "%s: add_codec_controls failed, err%d\n",
8806 snd_soc_dapm_new_controls(dapm, msm_dapm_widgets,
8807 ARRAY_SIZE(msm_dapm_widgets));
8812 static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream,
8813 struct snd_pcm_hw_params *params)
8815 struct snd_soc_pcm_runtime *rtd = substream->private_data;
8816 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
8819 unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150,
8820 151, 152, 153, 154, 155, 156};
8821 unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133,
8822 134, 135, 136, 137, 138, 139,
8823 140, 141, 142, 143};
8825 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
8826 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
8827 slim_rx_cfg[0].channels,
8830 pr_err("%s: RX failed to set cpu chan map error %d\n",
8833 ret = snd_soc_dai_set_channel_map(cpu_dai,
8834 slim_tx_cfg[0].channels,
8837 pr_err("%s: TX failed to set cpu chan map error %d\n",
8844 static struct snd_soc_ops msm_stub_be_ops = {
8845 .hw_params = msm_snd_stub_hw_params,
8848 static struct snd_soc_dai_link msm_stub_fe_dai_links[] = {
8850 /* FrontEnd DAI Links */
8852 .name = "MSMSTUB Media1",
8853 .stream_name = "MultiMedia1",
8854 .cpu_dai_name = "MultiMedia1",
8855 .platform_name = "msm-pcm-dsp.0",
8857 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
8860 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
8861 SND_SOC_DPCM_TRIGGER_POST},
8862 .codec_dai_name = "snd-soc-dummy-dai",
8863 .codec_name = "snd-soc-dummy",
8864 .ignore_suspend = 1,
8865 /* this dainlink has playback support */
8866 .ignore_pmdown_time = 1,
8867 .be_id = MSM_FRONTEND_DAI_MULTIMEDIA1
8871 static struct snd_soc_dai_link msm_stub_be_dai_links[] = {
8873 /* Backend DAI Links */
8875 .name = LPASS_BE_SLIMBUS_0_RX,
8876 .stream_name = "Slimbus Playback",
8877 .cpu_dai_name = "msm-dai-q6-dev.16384",
8878 .platform_name = "msm-pcm-routing",
8879 .codec_name = "msm-stub-codec.1",
8880 .codec_dai_name = "msm-stub-rx",
8883 .be_id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
8884 .init = &msm_audrx_stub_init,
8885 .be_hw_params_fixup = msm_be_hw_params_fixup,
8886 .ignore_pmdown_time = 1, /* dai link has playback support */
8887 .ignore_suspend = 1,
8888 .ops = &msm_stub_be_ops,
8891 .name = LPASS_BE_SLIMBUS_0_TX,
8892 .stream_name = "Slimbus Capture",
8893 .cpu_dai_name = "msm-dai-q6-dev.16385",
8894 .platform_name = "msm-pcm-routing",
8895 .codec_name = "msm-stub-codec.1",
8896 .codec_dai_name = "msm-stub-tx",
8899 .be_id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
8900 .be_hw_params_fixup = msm_be_hw_params_fixup,
8901 .ignore_suspend = 1,
8902 .ops = &msm_stub_be_ops,
8906 static struct snd_soc_dai_link msm_stub_dai_links[
8907 ARRAY_SIZE(msm_stub_fe_dai_links) +
8908 ARRAY_SIZE(msm_stub_be_dai_links)];
8910 struct snd_soc_card snd_soc_card_stub_msm = {
8911 .name = "msm8998-stub-snd-card",
8914 static const struct of_device_id msm8998_asoc_machine_of_match[] = {
8915 { .compatible = "qcom,msm8998-asoc-snd-tasha",
8916 .data = "tasha_codec"},
8917 { .compatible = "qcom,msm8998-asoc-snd-tavil",
8918 .data = "tavil_codec"},
8919 { .compatible = "qcom,msm8998-asoc-snd-stub",
8920 .data = "stub_codec"},
8924 static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
8926 struct snd_soc_card *card = NULL;
8927 struct snd_soc_dai_link *dailink;
8928 int len_1, len_2, len_3, len_4;
8930 const struct of_device_id *match;
8932 match = of_match_node(msm8998_asoc_machine_of_match, dev->of_node);
8934 dev_err(dev, "%s: No DT match found for sound card\n",
8939 if (!strcmp(match->data, "tasha_codec")) {
8940 card = &snd_soc_card_tasha_msm;
8941 len_1 = ARRAY_SIZE(msm_common_dai_links);
8942 len_2 = len_1 + ARRAY_SIZE(msm_tasha_fe_dai_links);
8943 len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links);
8944 len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links);
8945 total_links = len_4 + ARRAY_SIZE(msm_tasha_be_dai_links);
8946 memcpy(msm_tasha_dai_links,
8947 msm_common_dai_links,
8948 sizeof(msm_common_dai_links));
8949 memcpy(msm_tasha_dai_links + len_1,
8950 msm_tasha_fe_dai_links,
8951 sizeof(msm_tasha_fe_dai_links));
8952 memcpy(msm_tasha_dai_links + len_2,
8953 msm_common_misc_fe_dai_links,
8954 sizeof(msm_common_misc_fe_dai_links));
8955 memcpy(msm_tasha_dai_links + len_3,
8956 msm_common_be_dai_links,
8957 sizeof(msm_common_be_dai_links));
8958 memcpy(msm_tasha_dai_links + len_4,
8959 msm_tasha_be_dai_links,
8960 sizeof(msm_tasha_be_dai_links));
8962 if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
8963 dev_dbg(dev, "%s(): WCN BTFM support present\n",
8965 memcpy(msm_tasha_dai_links + total_links,
8966 msm_wcn_be_dai_links,
8967 sizeof(msm_wcn_be_dai_links));
8968 total_links += ARRAY_SIZE(msm_wcn_be_dai_links);
8971 if (of_property_read_bool(dev->of_node,
8972 "qcom,ext-disp-audio-rx")) {
8973 dev_dbg(dev, "%s(): External display audio support present\n",
8975 memcpy(msm_tasha_dai_links + total_links,
8976 ext_disp_be_dai_link,
8977 sizeof(ext_disp_be_dai_link));
8978 total_links += ARRAY_SIZE(ext_disp_be_dai_link);
8980 if (of_property_read_bool(dev->of_node,
8981 "qcom,mi2s-audio-intf")) {
8982 memcpy(msm_tasha_dai_links + total_links,
8983 msm_mi2s_be_dai_links,
8984 sizeof(msm_mi2s_be_dai_links));
8985 total_links += ARRAY_SIZE(msm_mi2s_be_dai_links);
8987 #ifdef CONFIG_MACH_XIAOMI_MSM8998
8988 if (get_hw_version_platform() == HARDWARE_PLATFORM_SAGIT) {
8989 memcpy(msm_tasha_dai_links + total_links,
8990 msm_quat_mi2s_tfa98xx_dai_links,
8991 sizeof(msm_quat_mi2s_tfa98xx_dai_links));
8992 } else if ((get_hw_version_platform() == HARDWARE_PLATFORM_CHIRON) ||
8993 (get_hw_version_platform() == HARDWARE_PLATFORM_CHIRON_S)) {
8994 memcpy(msm_tasha_dai_links + total_links,
8995 msm_quat_mi2s_tas2559_dai_links,
8996 sizeof(msm_quat_mi2s_tas2559_dai_links));
8998 memcpy(msm_tasha_dai_links + total_links,
8999 msm_quat_mi2s_stub_dai_links,
9000 sizeof(msm_quat_mi2s_stub_dai_links));
9002 total_links += ARRAY_SIZE(msm_quat_mi2s_stub_dai_links);
9005 if (of_property_read_bool(dev->of_node,
9006 "qcom,auxpcm-audio-intf")) {
9007 memcpy(msm_tasha_dai_links + total_links,
9008 msm_auxpcm_be_dai_links,
9009 sizeof(msm_auxpcm_be_dai_links));
9010 total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links);
9012 dailink = msm_tasha_dai_links;
9013 } else if (!strcmp(match->data, "tavil_codec")) {
9014 card = &snd_soc_card_tavil_msm;
9015 len_1 = ARRAY_SIZE(msm_common_dai_links);
9016 len_2 = len_1 + ARRAY_SIZE(msm_tavil_fe_dai_links);
9017 len_3 = len_2 + ARRAY_SIZE(msm_common_misc_fe_dai_links);
9018 len_4 = len_3 + ARRAY_SIZE(msm_common_be_dai_links);
9019 total_links = len_4 + ARRAY_SIZE(msm_tavil_be_dai_links);
9020 memcpy(msm_tavil_dai_links,
9021 msm_common_dai_links,
9022 sizeof(msm_common_dai_links));
9023 memcpy(msm_tavil_dai_links + len_1,
9024 msm_tavil_fe_dai_links,
9025 sizeof(msm_tavil_fe_dai_links));
9026 memcpy(msm_tavil_dai_links + len_2,
9027 msm_common_misc_fe_dai_links,
9028 sizeof(msm_common_misc_fe_dai_links));
9029 memcpy(msm_tavil_dai_links + len_3,
9030 msm_common_be_dai_links,
9031 sizeof(msm_common_be_dai_links));
9032 memcpy(msm_tavil_dai_links + len_4,
9033 msm_tavil_be_dai_links,
9034 sizeof(msm_tavil_be_dai_links));
9036 if (of_property_read_bool(dev->of_node, "qcom,wcn-btfm")) {
9037 dev_dbg(dev, "%s(): WCN BTFM support present\n",
9039 memcpy(msm_tavil_dai_links + total_links,
9040 msm_wcn_be_dai_links,
9041 sizeof(msm_wcn_be_dai_links));
9042 total_links += ARRAY_SIZE(msm_wcn_be_dai_links);
9045 if (of_property_read_bool(dev->of_node,
9046 "qcom,ext-disp-audio-rx")) {
9047 dev_dbg(dev, "%s(): ext disp audio support present\n",
9049 memcpy(msm_tavil_dai_links + total_links,
9050 ext_disp_be_dai_link,
9051 sizeof(ext_disp_be_dai_link));
9052 total_links += ARRAY_SIZE(ext_disp_be_dai_link);
9054 if (of_property_read_bool(dev->of_node,
9055 "qcom,mi2s-audio-intf")) {
9056 memcpy(msm_tavil_dai_links + total_links,
9057 msm_mi2s_be_dai_links,
9058 sizeof(msm_mi2s_be_dai_links));
9059 total_links += ARRAY_SIZE(msm_mi2s_be_dai_links);
9061 #ifdef CONFIG_MACH_XIAOMI_MSM8998
9062 memcpy(msm_tavil_dai_links + total_links,
9063 msm_quat_mi2s_stub_dai_links,
9064 sizeof(msm_quat_mi2s_stub_dai_links));
9065 total_links += ARRAY_SIZE(msm_quat_mi2s_stub_dai_links);
9068 if (of_property_read_bool(dev->of_node,
9069 "qcom,auxpcm-audio-intf")) {
9070 memcpy(msm_tavil_dai_links + total_links,
9071 msm_auxpcm_be_dai_links,
9072 sizeof(msm_auxpcm_be_dai_links));
9073 total_links += ARRAY_SIZE(msm_auxpcm_be_dai_links);
9075 dailink = msm_tavil_dai_links;
9076 } else if (!strcmp(match->data, "stub_codec")) {
9077 card = &snd_soc_card_stub_msm;
9078 len_1 = ARRAY_SIZE(msm_stub_fe_dai_links);
9079 len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links);
9081 memcpy(msm_stub_dai_links,
9082 msm_stub_fe_dai_links,
9083 sizeof(msm_stub_fe_dai_links));
9084 memcpy(msm_stub_dai_links + len_1,
9085 msm_stub_be_dai_links,
9086 sizeof(msm_stub_be_dai_links));
9088 dailink = msm_stub_dai_links;
9089 total_links = len_2;
9093 card->dai_link = dailink;
9094 card->num_links = total_links;
9100 static int msm_wsa881x_init(struct snd_soc_component *component)
9102 u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {100, 101, 102, 106};
9103 u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {103, 104, 105, 107};
9104 unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
9105 unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
9106 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
9107 struct msm_asoc_mach_data *pdata;
9108 struct snd_soc_dapm_context *dapm;
9112 pr_err("%s codec is NULL\n", __func__);
9116 dapm = snd_soc_codec_get_dapm(codec);
9118 if (!strcmp(component->name_prefix, "SpkrLeft")) {
9119 dev_dbg(codec->dev, "%s: setting left ch map to codec %s\n",
9120 __func__, codec->component.name);
9121 wsa881x_set_channel_map(codec, &spkleft_ports[0],
9122 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
9124 if (dapm->component) {
9125 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
9126 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR");
9128 } else if (!strcmp(component->name_prefix, "SpkrRight")) {
9129 dev_dbg(codec->dev, "%s: setting right ch map to codec %s\n",
9130 __func__, codec->component.name);
9131 wsa881x_set_channel_map(codec, &spkright_ports[0],
9132 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
9134 if (dapm->component) {
9135 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
9136 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR");
9139 dev_err(codec->dev, "%s: wrong codec name %s\n", __func__,
9140 codec->component.name);
9144 pdata = snd_soc_card_get_drvdata(component->card);
9145 if (pdata && pdata->codec_root)
9146 wsa881x_codec_info_create_codec_entry(pdata->codec_root,
9153 static int msm_init_wsa_dev(struct platform_device *pdev,
9154 struct snd_soc_card *card)
9156 struct device_node *wsa_of_node;
9160 struct msm_wsa881x_dev_info *wsa881x_dev_info;
9161 const char *wsa_auxdev_name_prefix[1];
9162 char *dev_name_str = NULL;
9166 /* Get maximum WSA device count for this platform */
9167 ret = of_property_read_u32(pdev->dev.of_node,
9168 "qcom,wsa-max-devs", &wsa_max_devs);
9171 "%s: wsa-max-devs property missing in DT %s, ret = %d\n",
9172 __func__, pdev->dev.of_node->full_name, ret);
9173 #ifdef CONFIG_MACH_XIAOMI_MSM8998
9178 if (wsa_max_devs == 0) {
9179 dev_warn(&pdev->dev,
9180 "%s: Max WSA devices is 0 for this target?\n",
9185 /* Get count of WSA device phandles for this platform */
9186 wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node,
9187 "qcom,wsa-devs", NULL);
9188 if (wsa_dev_cnt == -ENOENT) {
9189 dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n",
9192 } else if (wsa_dev_cnt <= 0) {
9194 "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n",
9195 __func__, wsa_dev_cnt);
9201 * Expect total phandles count to be NOT less than maximum possible
9202 * WSA count. However, if it is less, then assign same value to
9203 * max count as well.
9205 if (wsa_dev_cnt < wsa_max_devs) {
9207 "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n",
9208 __func__, wsa_max_devs, wsa_dev_cnt);
9209 wsa_max_devs = wsa_dev_cnt;
9212 /* Make sure prefix string passed for each WSA device */
9213 ret = of_property_count_strings(pdev->dev.of_node,
9214 "qcom,wsa-aux-dev-prefix");
9215 if (ret != wsa_dev_cnt) {
9217 "%s: expecting %d wsa prefix. Defined only %d in DT\n",
9218 __func__, wsa_dev_cnt, ret);
9224 * Alloc mem to store phandle and index info of WSA device, if already
9225 * registered with ALSA core
9227 wsa881x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
9228 sizeof(struct msm_wsa881x_dev_info),
9230 if (!wsa881x_dev_info) {
9236 * search and check whether all WSA devices are already
9237 * registered with ALSA core or not. If found a node, store
9238 * the node and the index in a local array of struct for later
9241 for (i = 0; i < wsa_dev_cnt; i++) {
9242 wsa_of_node = of_parse_phandle(pdev->dev.of_node,
9243 "qcom,wsa-devs", i);
9244 if (unlikely(!wsa_of_node)) {
9245 /* we should not be here */
9247 "%s: wsa dev node is not present\n",
9252 if (soc_find_component(wsa_of_node, NULL)) {
9253 /* WSA device registered with ALSA core */
9254 wsa881x_dev_info[found].of_node = wsa_of_node;
9255 wsa881x_dev_info[found].index = i;
9257 if (found == wsa_max_devs)
9262 if (found < wsa_max_devs) {
9264 "%s: failed to find %d components. Found only %d\n",
9265 __func__, wsa_max_devs, found);
9266 return -EPROBE_DEFER;
9268 dev_info(&pdev->dev,
9269 "%s: found %d wsa881x devices registered with ALSA core\n",
9272 card->num_aux_devs = wsa_max_devs;
9273 card->num_configs = wsa_max_devs;
9275 /* Alloc array of AUX devs struct */
9276 msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs,
9277 sizeof(struct snd_soc_aux_dev),
9281 goto err_auxdev_mem;
9284 /* Alloc array of codec conf struct */
9285 msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_aux_devs,
9286 sizeof(struct snd_soc_codec_conf),
9288 if (!msm_codec_conf) {
9290 goto err_codec_conf;
9293 for (i = 0; i < card->num_aux_devs; i++) {
9294 dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN,
9296 if (!dev_name_str) {
9301 ret = of_property_read_string_index(pdev->dev.of_node,
9302 "qcom,wsa-aux-dev-prefix",
9303 wsa881x_dev_info[i].index,
9304 wsa_auxdev_name_prefix);
9307 "%s: failed to read wsa aux dev prefix, ret = %d\n",
9313 snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i);
9314 msm_aux_dev[i].name = dev_name_str;
9315 msm_aux_dev[i].codec_name = NULL;
9316 msm_aux_dev[i].codec_of_node =
9317 wsa881x_dev_info[i].of_node;
9318 msm_aux_dev[i].init = msm_wsa881x_init;
9319 msm_codec_conf[i].dev_name = NULL;
9320 msm_codec_conf[i].name_prefix = wsa_auxdev_name_prefix[0];
9321 msm_codec_conf[i].of_node =
9322 wsa881x_dev_info[i].of_node;
9324 card->codec_conf = msm_codec_conf;
9325 card->aux_dev = msm_aux_dev;
9330 devm_kfree(&pdev->dev, dev_name_str);
9332 devm_kfree(&pdev->dev, msm_codec_conf);
9334 devm_kfree(&pdev->dev, msm_aux_dev);
9337 devm_kfree(&pdev->dev, wsa881x_dev_info);
9343 static void i2s_auxpcm_init(struct platform_device *pdev)
9345 struct resource *muxsel;
9347 u32 mi2s_master_slave[MI2S_MAX];
9349 char *str[PCM_I2S_SEL_MAX] = {
9350 "lpaif_pri_mode_muxsel",
9351 "lpaif_sec_mode_muxsel",
9352 "lpaif_tert_mode_muxsel",
9353 "lpaif_quat_mode_muxsel"
9356 for (count = 0; count < MI2S_MAX; count++) {
9357 mutex_init(&mi2s_intf_conf[count].lock);
9358 mi2s_intf_conf[count].ref_cnt = 0;
9361 for (count = 0; count < AUX_PCM_MAX; count++) {
9362 mutex_init(&auxpcm_intf_conf[count].lock);
9363 auxpcm_intf_conf[count].ref_cnt = 0;
9366 for (count = 0; count < PCM_I2S_SEL_MAX; count++) {
9367 mutex_init(&mi2s_auxpcm_conf[count].lock);
9368 mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr = NULL;
9371 for (count = 0; count < PCM_I2S_SEL_MAX; count++) {
9372 muxsel = platform_get_resource_byname(pdev, IORESOURCE_MEM,
9375 mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr
9376 = ioremap(muxsel->start, resource_size(muxsel));
9380 ret = of_property_read_u32_array(pdev->dev.of_node,
9381 "qcom,msm-mi2s-master",
9382 mi2s_master_slave, MI2S_MAX);
9384 dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n",
9387 for (count = 0; count < MI2S_MAX; count++) {
9388 mi2s_intf_conf[count].msm_is_mi2s_master =
9389 mi2s_master_slave[count];
9394 static void i2s_auxpcm_deinit(void)
9398 for (count = 0; count < PCM_I2S_SEL_MAX; count++)
9399 if (mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr !=
9402 mi2s_auxpcm_conf[count].pcm_i2s_sel_vt_addr);
9405 static int msm_asoc_machine_probe(struct platform_device *pdev)
9407 struct snd_soc_card *card;
9408 struct msm_asoc_mach_data *pdata;
9409 const char *mbhc_audio_jack_type = NULL;
9410 char *mclk_freq_prop_name;
9411 const struct of_device_id *match;
9414 if (!pdev->dev.of_node) {
9415 dev_err(&pdev->dev, "No platform supplied from device tree\n");
9419 pdata = devm_kzalloc(&pdev->dev,
9420 sizeof(struct msm_asoc_mach_data), GFP_KERNEL);
9424 card = populate_snd_card_dailinks(&pdev->dev);
9426 dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
9430 card->dev = &pdev->dev;
9431 platform_set_drvdata(pdev, card);
9432 snd_soc_card_set_drvdata(card, pdata);
9434 ret = snd_soc_of_parse_card_name(card, "qcom,model");
9436 dev_err(&pdev->dev, "parse card name failed, err:%d\n",
9441 ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
9443 dev_err(&pdev->dev, "parse audio routing failed, err:%d\n",
9448 match = of_match_node(msm8998_asoc_machine_of_match,
9451 dev_err(&pdev->dev, "%s: no matched codec is found.\n",
9456 if (!strcmp(match->data, "tasha_codec"))
9457 mclk_freq_prop_name = "qcom,tasha-mclk-clk-freq";
9459 mclk_freq_prop_name = "qcom,tavil-mclk-clk-freq";
9461 ret = of_property_read_u32(pdev->dev.of_node,
9462 mclk_freq_prop_name, &pdata->mclk_freq);
9465 "Looking up %s property in node %s failed, err%d\n",
9466 mclk_freq_prop_name,
9467 pdev->dev.of_node->full_name, ret);
9471 if (pdata->mclk_freq != CODEC_EXT_CLK_RATE) {
9472 dev_err(&pdev->dev, "unsupported mclk freq %u\n",
9478 ret = msm_populate_dai_link_component_of_node(card);
9480 ret = -EPROBE_DEFER;
9483 ret = msm_init_wsa_dev(pdev, card);
9487 ret = devm_snd_soc_register_card(&pdev->dev, card);
9488 if (ret == -EPROBE_DEFER) {
9493 dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
9497 dev_info(&pdev->dev, "Sound card %s registered\n", card->name);
9500 ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev);
9502 dev_dbg(&pdev->dev, "%s: failed to add child nodes, ret=%d\n",
9505 pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node,
9506 "qcom,hph-en1-gpio", 0);
9507 if (!pdata->hph_en1_gpio_p) {
9508 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9509 "qcom,hph-en1-gpio",
9510 pdev->dev.of_node->full_name);
9513 pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node,
9514 "qcom,hph-en0-gpio", 0);
9515 if (!pdata->hph_en0_gpio_p) {
9516 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9517 "qcom,hph-en0-gpio",
9518 pdev->dev.of_node->full_name);
9522 ret = of_property_read_string(pdev->dev.of_node,
9523 "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type);
9525 dev_dbg(&pdev->dev, "Looking up %s property in node %s failed",
9526 "qcom,mbhc-audio-jack-type",
9527 pdev->dev.of_node->full_name);
9528 dev_dbg(&pdev->dev, "Jack type properties set to default");
9530 if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) {
9531 wcd_mbhc_cfg.enable_anc_mic_detect = false;
9532 dev_dbg(&pdev->dev, "This hardware has 4 pole jack");
9533 } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) {
9534 wcd_mbhc_cfg.enable_anc_mic_detect = true;
9535 dev_dbg(&pdev->dev, "This hardware has 5 pole jack");
9536 } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) {
9537 wcd_mbhc_cfg.enable_anc_mic_detect = true;
9538 dev_dbg(&pdev->dev, "This hardware has 6 pole jack");
9540 wcd_mbhc_cfg.enable_anc_mic_detect = false;
9541 dev_dbg(&pdev->dev, "Unknown value, set to default");
9545 * Parse US-Euro gpio info from DT. Report no error if us-euro
9546 * entry is not found in DT file as some targets do not support
9549 pdata->us_euro_gpio = of_get_named_gpio(pdev->dev.of_node,
9550 "qcom,us-euro-gpios", 0);
9551 if (!gpio_is_valid(pdata->us_euro_gpio))
9552 pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node,
9553 "qcom,us-euro-gpios", 0);
9554 if (!gpio_is_valid(pdata->us_euro_gpio) && (!pdata->us_euro_gpio_p)) {
9555 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9556 "qcom,us-euro-gpios", pdev->dev.of_node->full_name);
9558 dev_dbg(&pdev->dev, "%s detected",
9559 "qcom,us-euro-gpios");
9560 wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic;
9563 ret = msm_prepare_us_euro(card);
9565 dev_dbg(&pdev->dev, "msm_prepare_us_euro failed (%d)\n",
9568 #ifdef CONFIG_MACH_XIAOMI_MSM8998
9569 pdata->spk_id_gpio_p = of_parse_phandle(pdev->dev.of_node,
9570 "qcom,spk-id-pin", 0);
9571 if (!pdata->spk_id_gpio_p)
9572 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9573 "qcom,spk-id-pin", pdev->dev.of_node->full_name);
9574 pdata->rcv_id_gpio_p = of_parse_phandle(pdev->dev.of_node,
9575 "qcom,rcv-id-pin", 0);
9576 if (!pdata->rcv_id_gpio_p)
9577 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9578 "qcom,rcv-id-pin", pdev->dev.of_node->full_name);
9580 ras_switch_en_gpio = of_get_named_gpio(pdev->dev.of_node,
9581 "qcom,ras-switch-en", 0);
9582 if (ras_switch_en_gpio < 0) {
9583 dev_dbg(&pdev->dev, "%s: %s property not found %d\n",
9584 __func__, "qcom,ras-switch-en", ras_switch_en_gpio);
9586 ras_switch_sel_gpio = of_get_named_gpio(pdev->dev.of_node,
9587 "qcom,ras-switch-sel", 0);
9588 if (ras_switch_sel_gpio < 0) {
9589 dev_dbg(&pdev->dev, "%s: %s property not found %d\n",
9590 __func__, "qcom,ras-switch-sel", ras_switch_sel_gpio);
9593 ret = msm_prepare_ras_switch(card);
9595 dev_info(&pdev->dev, "msm_prepare_ras_switch failed (%d)\n", ret);
9598 /* Parse pinctrl info from devicetree */
9599 ret = msm_get_pinctrl(pdev);
9601 pr_debug("%s: pinctrl parsing successful\n", __func__);
9604 "%s: Parsing pinctrl failed with %d. Cannot use Ports\n",
9609 i2s_auxpcm_init(pdev);
9611 is_initial_boot = true;
9612 ret = audio_notifier_register("msm8998", AUDIO_NOTIFIER_ADSP_DOMAIN,
9615 pr_err("%s: Audio notifier register failed ret = %d\n",
9618 #ifdef CONFIG_MACH_XIAOMI_MSM8998
9619 pdata->us_p_power = regulator_get(&pdev->dev, "vreg_pa_p_5p0");
9620 if (IS_ERR(pdata->us_p_power)) {
9621 dev_info(&pdev->dev, "ultrasound p power can't be found\n");
9622 pdata->us_p_power = NULL;
9625 pdata->us_n_power = regulator_get(&pdev->dev, "vreg_pa_n_5p0");
9626 if (IS_ERR(pdata->us_n_power)) {
9627 dev_info(&pdev->dev, "ultrasound n power can't be found\n");
9628 pdata->us_n_power = NULL;
9636 if (pdata->us_euro_gpio > 0) {
9637 dev_dbg(&pdev->dev, "%s free us_euro gpio %d\n",
9638 __func__, pdata->us_euro_gpio);
9639 gpio_free(pdata->us_euro_gpio);
9640 pdata->us_euro_gpio = 0;
9643 #ifdef CONFIG_MACH_XIAOMI_MSM8998
9644 if (ras_switch_en_gpio > 0) {
9645 dev_dbg(&pdev->dev, "%s free ear_switch_en0_gpio %d\n",
9646 __func__, ras_switch_en_gpio);
9647 gpio_free(ras_switch_en_gpio);
9648 ras_switch_en_gpio = 0;
9650 if (ras_switch_sel_gpio > 0) {
9651 dev_dbg(&pdev->dev, "%s free ear_switch_en1_gpio %d\n",
9652 __func__, ras_switch_sel_gpio);
9653 gpio_free(ras_switch_sel_gpio);
9654 ras_switch_sel_gpio = 0;
9657 msm_release_pinctrl(pdev);
9658 devm_kfree(&pdev->dev, pdata);
9662 static int msm_asoc_machine_remove(struct platform_device *pdev)
9664 struct snd_soc_card *card = platform_get_drvdata(pdev);
9665 struct msm_asoc_mach_data *pdata =
9666 snd_soc_card_get_drvdata(card);
9668 #ifdef CONFIG_MACH_XIAOMI_MSM8998
9671 if (pdata->us_p_power)
9672 regulator_put(pdata->us_p_power);
9673 if (pdata->us_p_power)
9674 regulator_put(pdata->us_n_power);
9677 gpio_free(pdata->us_euro_gpio);
9678 i2s_auxpcm_deinit();
9680 snd_soc_unregister_card(card);
9684 static struct platform_driver msm8998_asoc_machine_driver = {
9687 .owner = THIS_MODULE,
9688 .pm = &snd_soc_pm_ops,
9689 .of_match_table = msm8998_asoc_machine_of_match,
9691 .probe = msm_asoc_machine_probe,
9692 .remove = msm_asoc_machine_remove,
9694 module_platform_driver(msm8998_asoc_machine_driver);
9696 MODULE_DESCRIPTION("ALSA SoC msm");
9697 MODULE_LICENSE("GPL v2");
9698 MODULE_ALIAS("platform:" DRV_NAME);
9699 MODULE_DEVICE_TABLE(of, msm8998_asoc_machine_of_match);