blob: 02b9e0162ee88d80e6f99bd9bd1af033c166763e [file] [log] [blame]
Meng Wang688a8672019-01-29 13:43:33 +08001// SPDX-License-Identifier: GPL-2.0-only
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002/*
Xiao Lid8bb93c2020-01-07 12:59:05 +08003 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07004 */
5
6#include <linux/clk.h>
7#include <linux/delay.h>
8#include <linux/gpio.h>
9#include <linux/of_gpio.h>
10#include <linux/platform_device.h>
11#include <linux/slab.h>
12#include <linux/io.h>
13#include <linux/module.h>
14#include <linux/input.h>
15#include <linux/of_device.h>
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080016#include <linux/soc/qcom/fsa4480-i2c.h>
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070017#include <sound/core.h>
18#include <sound/soc.h>
19#include <sound/soc-dapm.h>
20#include <sound/pcm.h>
21#include <sound/pcm_params.h>
22#include <sound/info.h>
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070023#include <soc/snd_event.h>
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070024#include <dsp/audio_notifier.h>
Karthikeyan Mani7eef68e2018-12-13 17:45:02 -080025#include <soc/swr-common.h>
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070026#include <dsp/q6afe-v2.h>
27#include <dsp/q6core.h>
28#include "device_event.h"
29#include "msm-pcm-routing-v2.h"
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070030#include "asoc/msm-cdc-pinctrl.h"
31#include "asoc/wcd-mbhc-v2.h"
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080032#include "codecs/wcd938x/wcd938x-mbhc.h"
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070033#include "codecs/wsa881x.h"
Laxminath Kasam99690f12020-03-15 15:38:21 +053034#include "codecs/wsa883x/wsa883x.h"
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080035#include "codecs/wcd938x/wcd938x.h"
Kunlei Zhangf61a2312020-02-11 15:37:03 +080036#include "codecs/wcd937x/wcd937x-mbhc.h"
37#include "codecs/wcd937x/wcd937x.h"
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070038#include "codecs/bolero/bolero-cdc.h"
39#include <dt-bindings/sound/audio-codec-port-types.h>
40#include "codecs/bolero/wsa-macro.h"
Vatsal Bucha82b30ba2019-04-17 12:43:54 +053041#include "kona-port-config.h"
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070042
43#define DRV_NAME "kona-asoc-snd"
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070044#define __CHIPSET__ "KONA "
45#define MSM_DAILINK_NAME(name) (__CHIPSET__#name)
46
47#define SAMPLING_RATE_8KHZ 8000
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070048#define SAMPLING_RATE_11P025KHZ 11025
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070049#define SAMPLING_RATE_16KHZ 16000
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070050#define SAMPLING_RATE_22P05KHZ 22050
51#define SAMPLING_RATE_32KHZ 32000
52#define SAMPLING_RATE_44P1KHZ 44100
53#define SAMPLING_RATE_48KHZ 48000
54#define SAMPLING_RATE_88P2KHZ 88200
55#define SAMPLING_RATE_96KHZ 96000
56#define SAMPLING_RATE_176P4KHZ 176400
57#define SAMPLING_RATE_192KHZ 192000
58#define SAMPLING_RATE_352P8KHZ 352800
59#define SAMPLING_RATE_384KHZ 384000
60
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -070061#define IS_FRACTIONAL(x) \
62((x == SAMPLING_RATE_11P025KHZ) || (x == SAMPLING_RATE_22P05KHZ) || \
63(x == SAMPLING_RATE_44P1KHZ) || (x == SAMPLING_RATE_88P2KHZ) || \
64(x == SAMPLING_RATE_176P4KHZ) || (x == SAMPLING_RATE_352P8KHZ))
65
66#define IS_MSM_INTERFACE_MI2S(x) \
67((x == PRIM_MI2S) || (x == SEC_MI2S) || (x == TERT_MI2S))
68
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080069#define WCD9XXX_MBHC_DEF_RLOADS 5
70#define WCD9XXX_MBHC_DEF_BUTTONS 8
71#define CODEC_EXT_CLK_RATE 9600000
72#define ADSP_STATE_READY_TIMEOUT_MS 3000
73#define DEV_NAME_STR_LEN 32
74#define WCD_MBHC_HS_V_MAX 1600
75
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070076#define TDM_CHANNEL_MAX 8
77#define DEV_NAME_STR_LEN 32
78
79#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */
80
81#define ADSP_STATE_READY_TIMEOUT_MS 3000
82
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070083#define WSA8810_NAME_1 "wsa881x.20170211"
84#define WSA8810_NAME_2 "wsa881x.20170212"
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -080085#define WCN_CDC_SLIM_RX_CH_MAX 2
86#define WCN_CDC_SLIM_TX_CH_MAX 2
Vatsal Bucha82b30ba2019-04-17 12:43:54 +053087#define WCN_CDC_SLIM_TX_CH_MAX_LITO 3
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070088
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070089enum {
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -070090 RX_PATH = 0,
91 TX_PATH,
92 MAX_PATH,
93};
94
95enum {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070096 TDM_0 = 0,
97 TDM_1,
98 TDM_2,
99 TDM_3,
100 TDM_4,
101 TDM_5,
102 TDM_6,
103 TDM_7,
104 TDM_PORT_MAX,
105};
106
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -0700107#define TDM_MAX_SLOTS 8
108#define TDM_SLOT_WIDTH_BITS 32
109
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700110enum {
111 TDM_PRI = 0,
112 TDM_SEC,
113 TDM_TERT,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800114 TDM_QUAT,
115 TDM_QUIN,
116 TDM_SEN,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700117 TDM_INTERFACE_MAX,
118};
119
120enum {
121 PRIM_AUX_PCM = 0,
122 SEC_AUX_PCM,
123 TERT_AUX_PCM,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800124 QUAT_AUX_PCM,
125 QUIN_AUX_PCM,
126 SEN_AUX_PCM,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700127 AUX_PCM_MAX,
128};
129
130enum {
131 PRIM_MI2S = 0,
132 SEC_MI2S,
133 TERT_MI2S,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800134 QUAT_MI2S,
135 QUIN_MI2S,
136 SEN_MI2S,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700137 MI2S_MAX,
138};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700139
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700140enum {
141 WSA_CDC_DMA_RX_0 = 0,
142 WSA_CDC_DMA_RX_1,
143 RX_CDC_DMA_RX_0,
144 RX_CDC_DMA_RX_1,
145 RX_CDC_DMA_RX_2,
146 RX_CDC_DMA_RX_3,
147 RX_CDC_DMA_RX_5,
148 CDC_DMA_RX_MAX,
149};
150
151enum {
152 WSA_CDC_DMA_TX_0 = 0,
153 WSA_CDC_DMA_TX_1,
154 WSA_CDC_DMA_TX_2,
155 TX_CDC_DMA_TX_0,
156 TX_CDC_DMA_TX_3,
157 TX_CDC_DMA_TX_4,
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800158 VA_CDC_DMA_TX_0,
159 VA_CDC_DMA_TX_1,
160 VA_CDC_DMA_TX_2,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700161 CDC_DMA_TX_MAX,
162};
163
Banajit Goswami83a370d2019-03-05 16:15:21 -0800164enum {
165 SLIM_RX_7 = 0,
166 SLIM_RX_MAX,
167};
168enum {
169 SLIM_TX_7 = 0,
Vatsal Bucha82b30ba2019-04-17 12:43:54 +0530170 SLIM_TX_8,
Banajit Goswami83a370d2019-03-05 16:15:21 -0800171 SLIM_TX_MAX,
172};
173
Meng Wange8e53822019-03-18 10:49:50 +0800174enum {
175 AFE_LOOPBACK_TX_IDX = 0,
176 AFE_LOOPBACK_TX_IDX_MAX,
177};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700178struct msm_asoc_mach_data {
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700179 struct snd_info_entry *codec_root;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700180 int usbc_en2_gpio; /* used by gpio driver API */
Vatsal Bucha71e0b482019-09-11 14:51:20 +0530181 int lito_v2_enabled;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700182 struct device_node *dmic01_gpio_p; /* used by pinctrl API */
183 struct device_node *dmic23_gpio_p; /* used by pinctrl API */
184 struct device_node *dmic45_gpio_p; /* used by pinctrl API */
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800185 struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
186 atomic_t mi2s_gpio_ref_count[MI2S_MAX]; /* used by pinctrl API */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700187 struct device_node *us_euro_gpio_p; /* used by pinctrl API */
188 struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */
189 struct device_node *hph_en1_gpio_p; /* used by pinctrl API */
190 struct device_node *hph_en0_gpio_p; /* used by pinctrl API */
191 bool is_afe_config_done;
Karthikeyan Mani5eb13422018-11-05 13:49:17 -0800192 struct device_node *fsa_handle;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -0700193 struct clk *lpass_audio_hw_vote;
194 int core_audio_vote_count;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700195};
196
197struct tdm_port {
198 u32 mode;
199 u32 channel;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700200};
201
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -0700202struct tdm_dev_config {
203 unsigned int tdm_slot_offset[TDM_MAX_SLOTS];
204};
205
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800206enum {
207 EXT_DISP_RX_IDX_DP = 0,
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -0700208 EXT_DISP_RX_IDX_DP1,
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800209 EXT_DISP_RX_IDX_MAX,
210};
211
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700212struct msm_wsa881x_dev_info {
213 struct device_node *of_node;
214 u32 index;
215};
216
217struct aux_codec_dev_info {
218 struct device_node *of_node;
219 u32 index;
220};
221
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700222struct dev_config {
223 u32 sample_rate;
224 u32 bit_format;
225 u32 channels;
226};
227
Banajit Goswami83a370d2019-03-05 16:15:21 -0800228/* Default configuration of slimbus channels */
229static struct dev_config slim_rx_cfg[] = {
230 [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
231};
232
233static struct dev_config slim_tx_cfg[] = {
234 [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vatsal Bucha82b30ba2019-04-17 12:43:54 +0530235 [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Banajit Goswami83a370d2019-03-05 16:15:21 -0800236};
237
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800238/* Default configuration of external display BE */
239static struct dev_config ext_disp_rx_cfg[] = {
240 [EXT_DISP_RX_IDX_DP] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -0700241 [EXT_DISP_RX_IDX_DP1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800242};
243
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700244static struct dev_config usb_rx_cfg = {
245 .sample_rate = SAMPLING_RATE_48KHZ,
246 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
247 .channels = 2,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700248};
249
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700250static struct dev_config usb_tx_cfg = {
251 .sample_rate = SAMPLING_RATE_48KHZ,
252 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
253 .channels = 1,
254};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700255
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700256static struct dev_config proxy_rx_cfg = {
257 .sample_rate = SAMPLING_RATE_48KHZ,
258 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
259 .channels = 2,
260};
261
262static struct afe_clk_set mi2s_clk[MI2S_MAX] = {
263 {
264 AFE_API_VERSION_I2S_CONFIG,
265 Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT,
266 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
267 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
268 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
269 0,
270 },
271 {
272 AFE_API_VERSION_I2S_CONFIG,
273 Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
274 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
275 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
276 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
277 0,
278 },
279 {
280 AFE_API_VERSION_I2S_CONFIG,
281 Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT,
282 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
283 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
284 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
285 0,
286 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800287 {
288 AFE_API_VERSION_I2S_CONFIG,
289 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
290 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
291 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
292 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
293 0,
294 },
295 {
296 AFE_API_VERSION_I2S_CONFIG,
297 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT,
298 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
299 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
300 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
301 0,
302 },
303 {
304 AFE_API_VERSION_I2S_CONFIG,
305 Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT,
306 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
307 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
308 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
309 0,
310 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700311};
312
313struct mi2s_conf {
314 struct mutex lock;
315 u32 ref_cnt;
316 u32 msm_is_mi2s_master;
317};
318
319static u32 mi2s_ebit_clk[MI2S_MAX] = {
320 Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
321 Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
322 Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
323};
324
325static struct mi2s_conf mi2s_intf_conf[MI2S_MAX];
326
327/* Default configuration of TDM channels */
328static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
329 { /* PRI TDM */
330 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
331 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
332 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
333 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
334 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
335 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
336 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
337 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
338 },
339 { /* SEC TDM */
340 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
341 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
342 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
343 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
344 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
345 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
346 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
347 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
348 },
349 { /* TERT TDM */
350 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
351 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
352 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
353 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
354 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
355 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
356 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
357 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
358 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800359 { /* QUAT TDM */
360 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
361 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
362 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
363 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
364 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
365 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
366 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
367 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
368 },
369 { /* QUIN TDM */
370 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
371 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
372 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
373 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
374 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
375 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
376 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
377 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
378 },
379 { /* SEN TDM */
380 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
381 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
382 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
383 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
384 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
385 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
386 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
387 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
388 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700389};
390
391static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
392 { /* PRI TDM */
393 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
394 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
395 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
396 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
397 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
398 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
399 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
400 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
401 },
402 { /* SEC TDM */
403 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
404 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
405 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
406 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
407 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
408 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
409 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
410 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
411 },
412 { /* TERT TDM */
413 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
414 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
415 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
416 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
417 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
418 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
419 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
420 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
421 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800422 { /* QUAT TDM */
423 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
424 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
425 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
426 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
427 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
428 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
429 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
430 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
431 },
432 { /* QUIN TDM */
433 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
434 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
435 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
436 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
437 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
438 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
439 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
440 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
441 },
442 { /* SEN TDM */
443 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
444 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
445 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
446 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
447 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
448 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
449 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
450 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
451 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700452};
453
454/* Default configuration of AUX PCM channels */
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700455static struct dev_config aux_pcm_rx_cfg[] = {
456 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700457 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
458 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800459 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
460 [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
461 [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700462};
463
464static struct dev_config aux_pcm_tx_cfg[] = {
465 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700466 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
467 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800468 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
469 [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
470 [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700471};
472
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700473/* Default configuration of MI2S channels */
474static struct dev_config mi2s_rx_cfg[] = {
475 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
476 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
477 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800478 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
479 [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
480 [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700481};
482
483static struct dev_config mi2s_tx_cfg[] = {
484 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
485 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
486 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800487 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
488 [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
489 [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700490};
491
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -0700492static struct tdm_dev_config pri_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
493 { /* PRI TDM */
494 { {0, 4, 0xFFFF} }, /* RX_0 */
495 { {8, 12, 0xFFFF} }, /* RX_1 */
496 { {16, 20, 0xFFFF} }, /* RX_2 */
497 { {24, 28, 0xFFFF} }, /* RX_3 */
498 { {0xFFFF} }, /* RX_4 */
499 { {0xFFFF} }, /* RX_5 */
500 { {0xFFFF} }, /* RX_6 */
501 { {0xFFFF} }, /* RX_7 */
502 },
503 {
504 { {0, 4, 8, 12, 0xFFFF} }, /* TX_0 */
505 { {8, 12, 0xFFFF} }, /* TX_1 */
506 { {16, 20, 0xFFFF} }, /* TX_2 */
507 { {24, 28, 0xFFFF} }, /* TX_3 */
508 { {0xFFFF} }, /* TX_4 */
509 { {0xFFFF} }, /* TX_5 */
510 { {0xFFFF} }, /* TX_6 */
511 { {0xFFFF} }, /* TX_7 */
512 },
513};
514
515static struct tdm_dev_config sec_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
516 { /* SEC TDM */
517 { {0, 4, 0xFFFF} }, /* RX_0 */
518 { {8, 12, 0xFFFF} }, /* RX_1 */
519 { {16, 20, 0xFFFF} }, /* RX_2 */
520 { {24, 28, 0xFFFF} }, /* RX_3 */
521 { {0xFFFF} }, /* RX_4 */
522 { {0xFFFF} }, /* RX_5 */
523 { {0xFFFF} }, /* RX_6 */
524 { {0xFFFF} }, /* RX_7 */
525 },
526 {
527 { {0, 4, 0xFFFF} }, /* TX_0 */
528 { {8, 12, 0xFFFF} }, /* TX_1 */
529 { {16, 20, 0xFFFF} }, /* TX_2 */
530 { {24, 28, 0xFFFF} }, /* TX_3 */
531 { {0xFFFF} }, /* TX_4 */
532 { {0xFFFF} }, /* TX_5 */
533 { {0xFFFF} }, /* TX_6 */
534 { {0xFFFF} }, /* TX_7 */
535 },
536};
537
538static struct tdm_dev_config tert_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
539 { /* TERT TDM */
540 { {0, 4, 0xFFFF} }, /* RX_0 */
541 { {8, 12, 0xFFFF} }, /* RX_1 */
542 { {16, 20, 0xFFFF} }, /* RX_2 */
543 { {24, 28, 0xFFFF} }, /* RX_3 */
544 { {0xFFFF} }, /* RX_4 */
545 { {0xFFFF} }, /* RX_5 */
546 { {0xFFFF} }, /* RX_6 */
547 { {0xFFFF} }, /* RX_7 */
548 },
549 {
550 { {0, 4, 0xFFFF} }, /* TX_0 */
551 { {8, 12, 0xFFFF} }, /* TX_1 */
552 { {16, 20, 0xFFFF} }, /* TX_2 */
553 { {24, 28, 0xFFFF} }, /* TX_3 */
554 { {0xFFFF} }, /* TX_4 */
555 { {0xFFFF} }, /* TX_5 */
556 { {0xFFFF} }, /* TX_6 */
557 { {0xFFFF} }, /* TX_7 */
558 },
559};
560
561static struct tdm_dev_config quat_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
562 { /* QUAT TDM */
563 { {0, 4, 0xFFFF} }, /* RX_0 */
564 { {8, 12, 0xFFFF} }, /* RX_1 */
565 { {16, 20, 0xFFFF} }, /* RX_2 */
566 { {24, 28, 0xFFFF} }, /* RX_3 */
567 { {0xFFFF} }, /* RX_4 */
568 { {0xFFFF} }, /* RX_5 */
569 { {0xFFFF} }, /* RX_6 */
570 { {0xFFFF} }, /* RX_7 */
571 },
572 {
573 { {0, 4, 0xFFFF} }, /* TX_0 */
574 { {8, 12, 0xFFFF} }, /* TX_1 */
575 { {16, 20, 0xFFFF} }, /* TX_2 */
576 { {24, 28, 0xFFFF} }, /* TX_3 */
577 { {0xFFFF} }, /* TX_4 */
578 { {0xFFFF} }, /* TX_5 */
579 { {0xFFFF} }, /* TX_6 */
580 { {0xFFFF} }, /* TX_7 */
581 },
582};
583
584static struct tdm_dev_config quin_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
585 { /* QUIN TDM */
586 { {0, 4, 0xFFFF} }, /* RX_0 */
587 { {8, 12, 0xFFFF} }, /* RX_1 */
588 { {16, 20, 0xFFFF} }, /* RX_2 */
589 { {24, 28, 0xFFFF} }, /* RX_3 */
590 { {0xFFFF} }, /* RX_4 */
591 { {0xFFFF} }, /* RX_5 */
592 { {0xFFFF} }, /* RX_6 */
593 { {0xFFFF} }, /* RX_7 */
594 },
595 {
596 { {0, 4, 0xFFFF} }, /* TX_0 */
597 { {8, 12, 0xFFFF} }, /* TX_1 */
598 { {16, 20, 0xFFFF} }, /* TX_2 */
599 { {24, 28, 0xFFFF} }, /* TX_3 */
600 { {0xFFFF} }, /* TX_4 */
601 { {0xFFFF} }, /* TX_5 */
602 { {0xFFFF} }, /* TX_6 */
603 { {0xFFFF} }, /* TX_7 */
604 },
605};
606
607static struct tdm_dev_config sen_tdm_dev_config[MAX_PATH][TDM_PORT_MAX] = {
608 { /* SEN TDM */
609 { {0, 4, 0xFFFF} }, /* RX_0 */
610 { {8, 12, 0xFFFF} }, /* RX_1 */
611 { {16, 20, 0xFFFF} }, /* RX_2 */
612 { {24, 28, 0xFFFF} }, /* RX_3 */
613 { {0xFFFF} }, /* RX_4 */
614 { {0xFFFF} }, /* RX_5 */
615 { {0xFFFF} }, /* RX_6 */
616 { {0xFFFF} }, /* RX_7 */
617 },
618 {
619 { {0, 4, 0xFFFF} }, /* TX_0 */
620 { {8, 12, 0xFFFF} }, /* TX_1 */
621 { {16, 20, 0xFFFF} }, /* TX_2 */
622 { {24, 28, 0xFFFF} }, /* TX_3 */
623 { {0xFFFF} }, /* TX_4 */
624 { {0xFFFF} }, /* TX_5 */
625 { {0xFFFF} }, /* TX_6 */
626 { {0xFFFF} }, /* TX_7 */
627 },
628};
629
630static void *tdm_cfg[TDM_INTERFACE_MAX] = {
631 pri_tdm_dev_config,
632 sec_tdm_dev_config,
633 tert_tdm_dev_config,
634 quat_tdm_dev_config,
635 quin_tdm_dev_config,
636 sen_tdm_dev_config,
637};
638
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700639/* Default configuration of Codec DMA Interface RX */
640static struct dev_config cdc_dma_rx_cfg[] = {
641 [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
642 [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
643 [RX_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
644 [RX_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
645 [RX_CDC_DMA_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
646 [RX_CDC_DMA_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
647 [RX_CDC_DMA_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
648};
649
650/* Default configuration of Codec DMA Interface TX */
651static struct dev_config cdc_dma_tx_cfg[] = {
Vangala, Amarnath1b9c7892020-05-08 17:59:02 +0530652 [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700653 [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
654 [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
655 [TX_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
656 [TX_CDC_DMA_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
657 [TX_CDC_DMA_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800658 [VA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8},
659 [VA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8},
660 [VA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8},
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700661};
662
Meng Wange8e53822019-03-18 10:49:50 +0800663static struct dev_config afe_loopback_tx_cfg[] = {
664 [AFE_LOOPBACK_TX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
665};
666
Meng Wangd1db67c2019-04-17 12:41:34 +0800667static int msm_vi_feed_tx_ch = 2;
668static const char *const vi_feed_ch_text[] = {"One", "Two"};
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700669static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE",
670 "S32_LE"};
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -0700671static char const *cdc80_bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE"};
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700672static char const *ch_text[] = {"Two", "Three", "Four", "Five",
673 "Six", "Seven", "Eight"};
674static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
675 "KHZ_16", "KHZ_22P05",
676 "KHZ_32", "KHZ_44P1", "KHZ_48",
677 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
678 "KHZ_192", "KHZ_352P8", "KHZ_384"};
679static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four",
680 "Five", "Six", "Seven",
681 "Eight"};
682static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32",
683 "KHZ_48", "KHZ_176P4",
684 "KHZ_352P8"};
685static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"};
686static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
687 "Five", "Six", "Seven", "Eight"};
688static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"};
689static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16",
690 "KHZ_22P05", "KHZ_32", "KHZ_44P1",
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -0700691 "KHZ_48", "KHZ_88P2", "KHZ_96",
692 "KHZ_176P4", "KHZ_192","KHZ_352P8",
693 "KHZ_384"};
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700694static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four",
695 "Five", "Six", "Seven",
696 "Eight"};
697
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700698static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"};
699static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four",
700 "Five", "Six", "Seven",
701 "Eight"};
702static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
703 "KHZ_16", "KHZ_22P05",
704 "KHZ_32", "KHZ_44P1", "KHZ_48",
705 "KHZ_88P2", "KHZ_96",
706 "KHZ_176P4", "KHZ_192",
707 "KHZ_352P8", "KHZ_384"};
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -0700708static char const *cdc80_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
709 "KHZ_16", "KHZ_22P05",
710 "KHZ_32", "KHZ_44P1", "KHZ_48",
711 "KHZ_88P2", "KHZ_96",
712 "KHZ_176P4", "KHZ_192"};
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800713static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE",
714 "S24_3LE"};
715static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96",
716 "KHZ_192", "KHZ_32", "KHZ_44P1",
717 "KHZ_88P2", "KHZ_176P4"};
Banajit Goswami83a370d2019-03-05 16:15:21 -0800718static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16",
719 "KHZ_44P1", "KHZ_48",
720 "KHZ_88P2", "KHZ_96"};
721static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16",
722 "KHZ_44P1", "KHZ_48",
723 "KHZ_88P2", "KHZ_96"};
724static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16",
725 "KHZ_44P1", "KHZ_48",
726 "KHZ_88P2", "KHZ_96"};
Meng Wange8e53822019-03-18 10:49:50 +0800727static const char *const afe_loopback_tx_ch_text[] = {"One", "Two"};
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700728
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700729static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text);
730static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text);
731static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text);
732static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text);
733static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text);
734static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text);
Meng Wangd1db67c2019-04-17 12:41:34 +0800735static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700736static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text);
737static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text);
738static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text);
739static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text);
740static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text);
741static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text);
742static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700743static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700744static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text);
745static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800746static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text);
747static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text);
748static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_rx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700749static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700750static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text);
751static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800752static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text);
753static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text);
754static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_tx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700755static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text);
756static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700757static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text);
758static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text);
759static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800760static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text);
761static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text);
762static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_sample_rate, mi2s_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700763static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text);
764static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text);
765static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800766static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text);
767static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text);
768static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_sample_rate, mi2s_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700769static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text);
770static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text);
771static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text);
772static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text);
773static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800774static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text);
775static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text);
776static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_chs, mi2s_ch_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700777static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text);
778static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text);
779static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800780static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text);
781static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text);
782static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_chs, mi2s_ch_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700783static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
784static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
785static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
786static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
787static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_chs, cdc_dma_rx_ch_text);
788static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_chs, cdc_dma_rx_ch_text);
789static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_chs, cdc_dma_rx_ch_text);
790static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
791static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text);
792static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text);
793static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
794static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_chs, cdc_dma_tx_ch_text);
795static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_chs, cdc_dma_tx_ch_text);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800796static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
797static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text);
798static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700799static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text);
800static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700801static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text);
802static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text);
803static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_format, bit_format_text);
804static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_format, bit_format_text);
805static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_format, bit_format_text);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800806static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_format, bit_format_text);
807static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_format, bit_format_text);
808static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_format, bit_format_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700809static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate,
810 cdc_dma_sample_rate_text);
811static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate,
812 cdc_dma_sample_rate_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700813static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate,
814 cdc_dma_sample_rate_text);
815static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate,
816 cdc_dma_sample_rate_text);
817static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate,
818 cdc_dma_sample_rate_text);
819static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_sample_rate,
820 cdc_dma_sample_rate_text);
821static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_sample_rate,
822 cdc_dma_sample_rate_text);
823static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_sample_rate,
824 cdc_dma_sample_rate_text);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800825static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_sample_rate,
826 cdc_dma_sample_rate_text);
827static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_sample_rate,
828 cdc_dma_sample_rate_text);
829static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_sample_rate,
830 cdc_dma_sample_rate_text);
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -0700831
832/* WCD9380 */
833static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_0_format, cdc80_bit_format_text);
834static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_1_format, cdc80_bit_format_text);
835static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_2_format, cdc80_bit_format_text);
836static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_3_format, cdc80_bit_format_text);
837static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_5_format, cdc80_bit_format_text);
838static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_0_sample_rate,
839 cdc80_dma_sample_rate_text);
840static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_1_sample_rate,
841 cdc80_dma_sample_rate_text);
842static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_2_sample_rate,
843 cdc80_dma_sample_rate_text);
844static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_3_sample_rate,
845 cdc80_dma_sample_rate_text);
846static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc80_dma_rx_5_sample_rate,
847 cdc80_dma_sample_rate_text);
848/* WCD9385 */
849static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_0_format, bit_format_text);
850static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_1_format, bit_format_text);
851static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_2_format, bit_format_text);
852static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_3_format, bit_format_text);
853static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_5_format, bit_format_text);
854static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_0_sample_rate,
855 cdc_dma_sample_rate_text);
856static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_1_sample_rate,
857 cdc_dma_sample_rate_text);
858static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_2_sample_rate,
859 cdc_dma_sample_rate_text);
860static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_3_sample_rate,
861 cdc_dma_sample_rate_text);
862static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc85_dma_rx_5_sample_rate,
863 cdc_dma_sample_rate_text);
864
Kunlei Zhangf61a2312020-02-11 15:37:03 +0800865/* WCD937x */
866static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_format, bit_format_text);
867static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_format, bit_format_text);
868static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_format, bit_format_text);
869static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_format, bit_format_text);
870static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_format, bit_format_text);
871static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_sample_rate,
872 cdc_dma_sample_rate_text);
873static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_sample_rate,
874 cdc_dma_sample_rate_text);
875static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_sample_rate,
876 cdc_dma_sample_rate_text);
877static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_sample_rate,
878 cdc_dma_sample_rate_text);
879static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_sample_rate,
880 cdc_dma_sample_rate_text);
881
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800882static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text);
883static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text);
884static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate,
885 ext_disp_sample_rate_text);
Banajit Goswami83a370d2019-03-05 16:15:21 -0800886static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
887static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text);
888static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text);
Meng Wange8e53822019-03-18 10:49:50 +0800889static SOC_ENUM_SINGLE_EXT_DECL(afe_loopback_tx_chs, afe_loopback_tx_ch_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700890
891static bool is_initial_boot;
892static bool codec_reg_done;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700893static struct snd_soc_aux_dev *msm_aux_dev;
894static struct snd_soc_codec_conf *msm_codec_conf;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700895static struct snd_soc_card snd_soc_card_kona_msm;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700896static int dmic_0_1_gpio_cnt;
897static int dmic_2_3_gpio_cnt;
898static int dmic_4_5_gpio_cnt;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700899
Karthikeyan Mani5eb13422018-11-05 13:49:17 -0800900static void *def_wcd_mbhc_cal(void);
901
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700902/*
903 * Need to report LINEIN
904 * if R/L channel impedance is larger than 5K ohm
905 */
906static struct wcd_mbhc_config wcd_mbhc_cfg = {
907 .read_fw_bin = false,
908 .calibration = NULL,
909 .detect_extn_cable = true,
910 .mono_stero_detection = false,
911 .swap_gnd_mic = NULL,
912 .hs_ext_micbias = true,
913 .key_code[0] = KEY_MEDIA,
914 .key_code[1] = KEY_VOICECOMMAND,
915 .key_code[2] = KEY_VOLUMEUP,
916 .key_code[3] = KEY_VOLUMEDOWN,
917 .key_code[4] = 0,
918 .key_code[5] = 0,
919 .key_code[6] = 0,
920 .key_code[7] = 0,
921 .linein_th = 5000,
Sudheer Papothib2bfcfc2019-07-10 21:59:02 +0530922 .moisture_en = false,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700923 .mbhc_micbias = MIC_BIAS_2,
924 .anc_micbias = MIC_BIAS_2,
925 .enable_anc_mic_detect = false,
Sudheer Papothib2bfcfc2019-07-10 21:59:02 +0530926 .moisture_duty_cycle_en = true,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700927};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700928
929static inline int param_is_mask(int p)
930{
931 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
932 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
933}
934
935static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p,
936 int n)
937{
938 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
939}
940
941static void param_set_mask(struct snd_pcm_hw_params *p, int n,
942 unsigned int bit)
943{
944 if (bit >= SNDRV_MASK_MAX)
945 return;
946 if (param_is_mask(n)) {
947 struct snd_mask *m = param_to_mask(p, n);
948
949 m->bits[0] = 0;
950 m->bits[1] = 0;
951 m->bits[bit >> 5] |= (1 << (bit & 31));
952 }
953}
954
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700955static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
956 struct snd_ctl_elem_value *ucontrol)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700957{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700958 int sample_rate_val = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700959
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700960 switch (usb_rx_cfg.sample_rate) {
961 case SAMPLING_RATE_384KHZ:
962 sample_rate_val = 12;
963 break;
964 case SAMPLING_RATE_352P8KHZ:
965 sample_rate_val = 11;
966 break;
967 case SAMPLING_RATE_192KHZ:
968 sample_rate_val = 10;
969 break;
970 case SAMPLING_RATE_176P4KHZ:
971 sample_rate_val = 9;
972 break;
973 case SAMPLING_RATE_96KHZ:
974 sample_rate_val = 8;
975 break;
976 case SAMPLING_RATE_88P2KHZ:
977 sample_rate_val = 7;
978 break;
979 case SAMPLING_RATE_48KHZ:
980 sample_rate_val = 6;
981 break;
982 case SAMPLING_RATE_44P1KHZ:
983 sample_rate_val = 5;
984 break;
985 case SAMPLING_RATE_32KHZ:
986 sample_rate_val = 4;
987 break;
988 case SAMPLING_RATE_22P05KHZ:
989 sample_rate_val = 3;
990 break;
991 case SAMPLING_RATE_16KHZ:
992 sample_rate_val = 2;
993 break;
994 case SAMPLING_RATE_11P025KHZ:
995 sample_rate_val = 1;
996 break;
997 case SAMPLING_RATE_8KHZ:
998 default:
999 sample_rate_val = 0;
1000 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001001 }
1002
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001003 ucontrol->value.integer.value[0] = sample_rate_val;
1004 pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__,
1005 usb_rx_cfg.sample_rate);
1006 return 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001007}
1008
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001009static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1010 struct snd_ctl_elem_value *ucontrol)
1011{
1012 switch (ucontrol->value.integer.value[0]) {
1013 case 12:
1014 usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
1015 break;
1016 case 11:
1017 usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
1018 break;
1019 case 10:
1020 usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
1021 break;
1022 case 9:
1023 usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
1024 break;
1025 case 8:
1026 usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
1027 break;
1028 case 7:
1029 usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
1030 break;
1031 case 6:
1032 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1033 break;
1034 case 5:
1035 usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
1036 break;
1037 case 4:
1038 usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
1039 break;
1040 case 3:
1041 usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
1042 break;
1043 case 2:
1044 usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
1045 break;
1046 case 1:
1047 usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
1048 break;
1049 case 0:
1050 usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
1051 break;
1052 default:
1053 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1054 break;
1055 }
1056
1057 pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n",
1058 __func__, ucontrol->value.integer.value[0],
1059 usb_rx_cfg.sample_rate);
1060 return 0;
1061}
1062
1063static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1064 struct snd_ctl_elem_value *ucontrol)
1065{
1066 int sample_rate_val = 0;
1067
1068 switch (usb_tx_cfg.sample_rate) {
1069 case SAMPLING_RATE_384KHZ:
1070 sample_rate_val = 12;
1071 break;
1072 case SAMPLING_RATE_352P8KHZ:
1073 sample_rate_val = 11;
1074 break;
1075 case SAMPLING_RATE_192KHZ:
1076 sample_rate_val = 10;
1077 break;
1078 case SAMPLING_RATE_176P4KHZ:
1079 sample_rate_val = 9;
1080 break;
1081 case SAMPLING_RATE_96KHZ:
1082 sample_rate_val = 8;
1083 break;
1084 case SAMPLING_RATE_88P2KHZ:
1085 sample_rate_val = 7;
1086 break;
1087 case SAMPLING_RATE_48KHZ:
1088 sample_rate_val = 6;
1089 break;
1090 case SAMPLING_RATE_44P1KHZ:
1091 sample_rate_val = 5;
1092 break;
1093 case SAMPLING_RATE_32KHZ:
1094 sample_rate_val = 4;
1095 break;
1096 case SAMPLING_RATE_22P05KHZ:
1097 sample_rate_val = 3;
1098 break;
1099 case SAMPLING_RATE_16KHZ:
1100 sample_rate_val = 2;
1101 break;
1102 case SAMPLING_RATE_11P025KHZ:
1103 sample_rate_val = 1;
1104 break;
1105 case SAMPLING_RATE_8KHZ:
1106 sample_rate_val = 0;
1107 break;
1108 default:
1109 sample_rate_val = 6;
1110 break;
1111 }
1112
1113 ucontrol->value.integer.value[0] = sample_rate_val;
1114 pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__,
1115 usb_tx_cfg.sample_rate);
1116 return 0;
1117}
1118
1119static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1120 struct snd_ctl_elem_value *ucontrol)
1121{
1122 switch (ucontrol->value.integer.value[0]) {
1123 case 12:
1124 usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
1125 break;
1126 case 11:
1127 usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
1128 break;
1129 case 10:
1130 usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
1131 break;
1132 case 9:
1133 usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
1134 break;
1135 case 8:
1136 usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
1137 break;
1138 case 7:
1139 usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
1140 break;
1141 case 6:
1142 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1143 break;
1144 case 5:
1145 usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
1146 break;
1147 case 4:
1148 usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
1149 break;
1150 case 3:
1151 usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
1152 break;
1153 case 2:
1154 usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
1155 break;
1156 case 1:
1157 usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
1158 break;
1159 case 0:
1160 usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
1161 break;
1162 default:
1163 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1164 break;
1165 }
1166
1167 pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n",
1168 __func__, ucontrol->value.integer.value[0],
1169 usb_tx_cfg.sample_rate);
1170 return 0;
1171}
Meng Wange8e53822019-03-18 10:49:50 +08001172static int afe_loopback_tx_ch_get(struct snd_kcontrol *kcontrol,
1173 struct snd_ctl_elem_value *ucontrol)
1174{
1175 pr_debug("%s: afe_loopback_tx_ch = %d\n", __func__,
1176 afe_loopback_tx_cfg[0].channels);
1177 ucontrol->value.enumerated.item[0] =
1178 afe_loopback_tx_cfg[0].channels - 1;
1179
1180 return 0;
1181}
1182
1183static int afe_loopback_tx_ch_put(struct snd_kcontrol *kcontrol,
1184 struct snd_ctl_elem_value *ucontrol)
1185{
1186 afe_loopback_tx_cfg[0].channels =
1187 ucontrol->value.enumerated.item[0] + 1;
1188 pr_debug("%s: afe_loopback_tx_ch = %d\n", __func__,
1189 afe_loopback_tx_cfg[0].channels);
1190
1191 return 1;
1192}
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001193
1194static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol,
1195 struct snd_ctl_elem_value *ucontrol)
1196{
1197 switch (usb_rx_cfg.bit_format) {
1198 case SNDRV_PCM_FORMAT_S32_LE:
1199 ucontrol->value.integer.value[0] = 3;
1200 break;
1201 case SNDRV_PCM_FORMAT_S24_3LE:
1202 ucontrol->value.integer.value[0] = 2;
1203 break;
1204 case SNDRV_PCM_FORMAT_S24_LE:
1205 ucontrol->value.integer.value[0] = 1;
1206 break;
1207 case SNDRV_PCM_FORMAT_S16_LE:
1208 default:
1209 ucontrol->value.integer.value[0] = 0;
1210 break;
1211 }
1212
1213 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
1214 __func__, usb_rx_cfg.bit_format,
1215 ucontrol->value.integer.value[0]);
1216 return 0;
1217}
1218
1219static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol,
1220 struct snd_ctl_elem_value *ucontrol)
1221{
1222 int rc = 0;
1223
1224 switch (ucontrol->value.integer.value[0]) {
1225 case 3:
1226 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
1227 break;
1228 case 2:
1229 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1230 break;
1231 case 1:
1232 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
1233 break;
1234 case 0:
1235 default:
1236 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
1237 break;
1238 }
1239 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
1240 __func__, usb_rx_cfg.bit_format,
1241 ucontrol->value.integer.value[0]);
1242
1243 return rc;
1244}
1245
1246static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol,
1247 struct snd_ctl_elem_value *ucontrol)
1248{
1249 switch (usb_tx_cfg.bit_format) {
1250 case SNDRV_PCM_FORMAT_S32_LE:
1251 ucontrol->value.integer.value[0] = 3;
1252 break;
1253 case SNDRV_PCM_FORMAT_S24_3LE:
1254 ucontrol->value.integer.value[0] = 2;
1255 break;
1256 case SNDRV_PCM_FORMAT_S24_LE:
1257 ucontrol->value.integer.value[0] = 1;
1258 break;
1259 case SNDRV_PCM_FORMAT_S16_LE:
1260 default:
1261 ucontrol->value.integer.value[0] = 0;
1262 break;
1263 }
1264
1265 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
1266 __func__, usb_tx_cfg.bit_format,
1267 ucontrol->value.integer.value[0]);
1268 return 0;
1269}
1270
1271static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol,
1272 struct snd_ctl_elem_value *ucontrol)
1273{
1274 int rc = 0;
1275
1276 switch (ucontrol->value.integer.value[0]) {
1277 case 3:
1278 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
1279 break;
1280 case 2:
1281 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1282 break;
1283 case 1:
1284 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
1285 break;
1286 case 0:
1287 default:
1288 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
1289 break;
1290 }
1291 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
1292 __func__, usb_tx_cfg.bit_format,
1293 ucontrol->value.integer.value[0]);
1294
1295 return rc;
1296}
1297
1298static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol,
1299 struct snd_ctl_elem_value *ucontrol)
1300{
1301 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__,
1302 usb_rx_cfg.channels);
1303 ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1;
1304 return 0;
1305}
1306
1307static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol,
1308 struct snd_ctl_elem_value *ucontrol)
1309{
1310 usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1311
1312 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels);
1313 return 1;
1314}
1315
1316static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol,
1317 struct snd_ctl_elem_value *ucontrol)
1318{
1319 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__,
1320 usb_tx_cfg.channels);
1321 ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1;
1322 return 0;
1323}
1324
1325static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol,
1326 struct snd_ctl_elem_value *ucontrol)
1327{
1328 usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1329
1330 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels);
1331 return 1;
1332}
1333
Meng Wangd1db67c2019-04-17 12:41:34 +08001334static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
1335 struct snd_ctl_elem_value *ucontrol)
1336{
1337 ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1;
1338 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
1339 ucontrol->value.integer.value[0]);
1340 return 0;
1341}
1342
1343static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
1344 struct snd_ctl_elem_value *ucontrol)
1345{
1346 msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1;
1347 pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch);
1348 return 1;
1349}
1350
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08001351static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol)
1352{
1353 int idx = 0;
1354
1355 if (strnstr(kcontrol->id.name, "Display Port RX",
1356 sizeof("Display Port RX"))) {
1357 idx = EXT_DISP_RX_IDX_DP;
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -07001358 } else if (strnstr(kcontrol->id.name, "Display Port1 RX",
1359 sizeof("Display Port1 RX"))) {
1360 idx = EXT_DISP_RX_IDX_DP1;
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08001361 } else {
1362 pr_err("%s: unsupported BE: %s\n",
1363 __func__, kcontrol->id.name);
1364 idx = -EINVAL;
1365 }
1366
1367 return idx;
1368}
1369
1370static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol,
1371 struct snd_ctl_elem_value *ucontrol)
1372{
1373 int idx = ext_disp_get_port_idx(kcontrol);
1374
1375 if (idx < 0)
1376 return idx;
1377
1378 switch (ext_disp_rx_cfg[idx].bit_format) {
1379 case SNDRV_PCM_FORMAT_S24_3LE:
1380 ucontrol->value.integer.value[0] = 2;
1381 break;
1382 case SNDRV_PCM_FORMAT_S24_LE:
1383 ucontrol->value.integer.value[0] = 1;
1384 break;
1385 case SNDRV_PCM_FORMAT_S16_LE:
1386 default:
1387 ucontrol->value.integer.value[0] = 0;
1388 break;
1389 }
1390
1391 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
1392 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
1393 ucontrol->value.integer.value[0]);
1394 return 0;
1395}
1396
1397static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol,
1398 struct snd_ctl_elem_value *ucontrol)
1399{
1400 int idx = ext_disp_get_port_idx(kcontrol);
1401
1402 if (idx < 0)
1403 return idx;
1404
1405 switch (ucontrol->value.integer.value[0]) {
1406 case 2:
1407 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1408 break;
1409 case 1:
1410 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE;
1411 break;
1412 case 0:
1413 default:
1414 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE;
1415 break;
1416 }
1417 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
1418 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
1419 ucontrol->value.integer.value[0]);
1420
1421 return 0;
1422}
1423
1424static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol,
1425 struct snd_ctl_elem_value *ucontrol)
1426{
1427 int idx = ext_disp_get_port_idx(kcontrol);
1428
1429 if (idx < 0)
1430 return idx;
1431
1432 ucontrol->value.integer.value[0] =
1433 ext_disp_rx_cfg[idx].channels - 2;
1434
1435 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
1436 idx, ext_disp_rx_cfg[idx].channels);
1437
1438 return 0;
1439}
1440
1441static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol,
1442 struct snd_ctl_elem_value *ucontrol)
1443{
1444 int idx = ext_disp_get_port_idx(kcontrol);
1445
1446 if (idx < 0)
1447 return idx;
1448
1449 ext_disp_rx_cfg[idx].channels =
1450 ucontrol->value.integer.value[0] + 2;
1451
1452 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
1453 idx, ext_disp_rx_cfg[idx].channels);
1454 return 1;
1455}
1456
1457static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1458 struct snd_ctl_elem_value *ucontrol)
1459{
1460 int sample_rate_val;
1461 int idx = ext_disp_get_port_idx(kcontrol);
1462
1463 if (idx < 0)
1464 return idx;
1465
1466 switch (ext_disp_rx_cfg[idx].sample_rate) {
1467 case SAMPLING_RATE_176P4KHZ:
1468 sample_rate_val = 6;
1469 break;
1470
1471 case SAMPLING_RATE_88P2KHZ:
1472 sample_rate_val = 5;
1473 break;
1474
1475 case SAMPLING_RATE_44P1KHZ:
1476 sample_rate_val = 4;
1477 break;
1478
1479 case SAMPLING_RATE_32KHZ:
1480 sample_rate_val = 3;
1481 break;
1482
1483 case SAMPLING_RATE_192KHZ:
1484 sample_rate_val = 2;
1485 break;
1486
1487 case SAMPLING_RATE_96KHZ:
1488 sample_rate_val = 1;
1489 break;
1490
1491 case SAMPLING_RATE_48KHZ:
1492 default:
1493 sample_rate_val = 0;
1494 break;
1495 }
1496
1497 ucontrol->value.integer.value[0] = sample_rate_val;
1498 pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__,
1499 idx, ext_disp_rx_cfg[idx].sample_rate);
1500
1501 return 0;
1502}
1503
1504static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1505 struct snd_ctl_elem_value *ucontrol)
1506{
1507 int idx = ext_disp_get_port_idx(kcontrol);
1508
1509 if (idx < 0)
1510 return idx;
1511
1512 switch (ucontrol->value.integer.value[0]) {
1513 case 6:
1514 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ;
1515 break;
1516 case 5:
1517 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ;
1518 break;
1519 case 4:
1520 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ;
1521 break;
1522 case 3:
1523 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ;
1524 break;
1525 case 2:
1526 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ;
1527 break;
1528 case 1:
1529 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ;
1530 break;
1531 case 0:
1532 default:
1533 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ;
1534 break;
1535 }
1536
1537 pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n",
1538 __func__, ucontrol->value.integer.value[0], idx,
1539 ext_disp_rx_cfg[idx].sample_rate);
1540 return 0;
1541}
1542
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001543static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol,
1544 struct snd_ctl_elem_value *ucontrol)
1545{
1546 pr_debug("%s: proxy_rx channels = %d\n",
1547 __func__, proxy_rx_cfg.channels);
1548 ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2;
1549
1550 return 0;
1551}
1552
1553static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol,
1554 struct snd_ctl_elem_value *ucontrol)
1555{
1556 proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2;
1557 pr_debug("%s: proxy_rx channels = %d\n",
1558 __func__, proxy_rx_cfg.channels);
1559
1560 return 1;
1561}
1562
1563static int tdm_get_port_idx(struct snd_kcontrol *kcontrol,
1564 struct tdm_port *port)
1565{
1566 if (port) {
1567 if (strnstr(kcontrol->id.name, "PRI",
1568 sizeof(kcontrol->id.name))) {
1569 port->mode = TDM_PRI;
1570 } else if (strnstr(kcontrol->id.name, "SEC",
1571 sizeof(kcontrol->id.name))) {
1572 port->mode = TDM_SEC;
1573 } else if (strnstr(kcontrol->id.name, "TERT",
1574 sizeof(kcontrol->id.name))) {
1575 port->mode = TDM_TERT;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08001576 } else if (strnstr(kcontrol->id.name, "QUAT",
1577 sizeof(kcontrol->id.name))) {
1578 port->mode = TDM_QUAT;
1579 } else if (strnstr(kcontrol->id.name, "QUIN",
1580 sizeof(kcontrol->id.name))) {
1581 port->mode = TDM_QUIN;
1582 } else if (strnstr(kcontrol->id.name, "SEN",
1583 sizeof(kcontrol->id.name))) {
1584 port->mode = TDM_SEN;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001585 } else {
1586 pr_err("%s: unsupported mode in: %s\n",
1587 __func__, kcontrol->id.name);
1588 return -EINVAL;
1589 }
1590
1591 if (strnstr(kcontrol->id.name, "RX_0",
1592 sizeof(kcontrol->id.name)) ||
1593 strnstr(kcontrol->id.name, "TX_0",
1594 sizeof(kcontrol->id.name))) {
1595 port->channel = TDM_0;
1596 } else if (strnstr(kcontrol->id.name, "RX_1",
1597 sizeof(kcontrol->id.name)) ||
1598 strnstr(kcontrol->id.name, "TX_1",
1599 sizeof(kcontrol->id.name))) {
1600 port->channel = TDM_1;
1601 } else if (strnstr(kcontrol->id.name, "RX_2",
1602 sizeof(kcontrol->id.name)) ||
1603 strnstr(kcontrol->id.name, "TX_2",
1604 sizeof(kcontrol->id.name))) {
1605 port->channel = TDM_2;
1606 } else if (strnstr(kcontrol->id.name, "RX_3",
1607 sizeof(kcontrol->id.name)) ||
1608 strnstr(kcontrol->id.name, "TX_3",
1609 sizeof(kcontrol->id.name))) {
1610 port->channel = TDM_3;
1611 } else if (strnstr(kcontrol->id.name, "RX_4",
1612 sizeof(kcontrol->id.name)) ||
1613 strnstr(kcontrol->id.name, "TX_4",
1614 sizeof(kcontrol->id.name))) {
1615 port->channel = TDM_4;
1616 } else if (strnstr(kcontrol->id.name, "RX_5",
1617 sizeof(kcontrol->id.name)) ||
1618 strnstr(kcontrol->id.name, "TX_5",
1619 sizeof(kcontrol->id.name))) {
1620 port->channel = TDM_5;
1621 } else if (strnstr(kcontrol->id.name, "RX_6",
1622 sizeof(kcontrol->id.name)) ||
1623 strnstr(kcontrol->id.name, "TX_6",
1624 sizeof(kcontrol->id.name))) {
1625 port->channel = TDM_6;
1626 } else if (strnstr(kcontrol->id.name, "RX_7",
1627 sizeof(kcontrol->id.name)) ||
1628 strnstr(kcontrol->id.name, "TX_7",
1629 sizeof(kcontrol->id.name))) {
1630 port->channel = TDM_7;
1631 } else {
1632 pr_err("%s: unsupported channel in: %s\n",
1633 __func__, kcontrol->id.name);
1634 return -EINVAL;
1635 }
1636 } else {
1637 return -EINVAL;
1638 }
1639 return 0;
1640}
1641
1642static int tdm_get_sample_rate(int value)
1643{
1644 int sample_rate = 0;
1645
1646 switch (value) {
1647 case 0:
1648 sample_rate = SAMPLING_RATE_8KHZ;
1649 break;
1650 case 1:
1651 sample_rate = SAMPLING_RATE_16KHZ;
1652 break;
1653 case 2:
1654 sample_rate = SAMPLING_RATE_32KHZ;
1655 break;
1656 case 3:
1657 sample_rate = SAMPLING_RATE_48KHZ;
1658 break;
1659 case 4:
1660 sample_rate = SAMPLING_RATE_176P4KHZ;
1661 break;
1662 case 5:
1663 sample_rate = SAMPLING_RATE_352P8KHZ;
1664 break;
1665 default:
1666 sample_rate = SAMPLING_RATE_48KHZ;
1667 break;
1668 }
1669 return sample_rate;
1670}
1671
1672static int tdm_get_sample_rate_val(int sample_rate)
1673{
1674 int sample_rate_val = 0;
1675
1676 switch (sample_rate) {
1677 case SAMPLING_RATE_8KHZ:
1678 sample_rate_val = 0;
1679 break;
1680 case SAMPLING_RATE_16KHZ:
1681 sample_rate_val = 1;
1682 break;
1683 case SAMPLING_RATE_32KHZ:
1684 sample_rate_val = 2;
1685 break;
1686 case SAMPLING_RATE_48KHZ:
1687 sample_rate_val = 3;
1688 break;
1689 case SAMPLING_RATE_176P4KHZ:
1690 sample_rate_val = 4;
1691 break;
1692 case SAMPLING_RATE_352P8KHZ:
1693 sample_rate_val = 5;
1694 break;
1695 default:
1696 sample_rate_val = 3;
1697 break;
1698 }
1699 return sample_rate_val;
1700}
1701
1702static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1703 struct snd_ctl_elem_value *ucontrol)
1704{
1705 struct tdm_port port;
1706 int ret = tdm_get_port_idx(kcontrol, &port);
1707
1708 if (ret) {
1709 pr_err("%s: unsupported control: %s\n",
1710 __func__, kcontrol->id.name);
1711 } else {
1712 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
1713 tdm_rx_cfg[port.mode][port.channel].sample_rate);
1714
1715 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
1716 tdm_rx_cfg[port.mode][port.channel].sample_rate,
1717 ucontrol->value.enumerated.item[0]);
1718 }
1719 return ret;
1720}
1721
1722static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1723 struct snd_ctl_elem_value *ucontrol)
1724{
1725 struct tdm_port port;
1726 int ret = tdm_get_port_idx(kcontrol, &port);
1727
1728 if (ret) {
1729 pr_err("%s: unsupported control: %s\n",
1730 __func__, kcontrol->id.name);
1731 } else {
1732 tdm_rx_cfg[port.mode][port.channel].sample_rate =
1733 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
1734
1735 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
1736 tdm_rx_cfg[port.mode][port.channel].sample_rate,
1737 ucontrol->value.enumerated.item[0]);
1738 }
1739 return ret;
1740}
1741
1742static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1743 struct snd_ctl_elem_value *ucontrol)
1744{
1745 struct tdm_port port;
1746 int ret = tdm_get_port_idx(kcontrol, &port);
1747
1748 if (ret) {
1749 pr_err("%s: unsupported control: %s\n",
1750 __func__, kcontrol->id.name);
1751 } else {
1752 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
1753 tdm_tx_cfg[port.mode][port.channel].sample_rate);
1754
1755 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
1756 tdm_tx_cfg[port.mode][port.channel].sample_rate,
1757 ucontrol->value.enumerated.item[0]);
1758 }
1759 return ret;
1760}
1761
1762static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1763 struct snd_ctl_elem_value *ucontrol)
1764{
1765 struct tdm_port port;
1766 int ret = tdm_get_port_idx(kcontrol, &port);
1767
1768 if (ret) {
1769 pr_err("%s: unsupported control: %s\n",
1770 __func__, kcontrol->id.name);
1771 } else {
1772 tdm_tx_cfg[port.mode][port.channel].sample_rate =
1773 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
1774
1775 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
1776 tdm_tx_cfg[port.mode][port.channel].sample_rate,
1777 ucontrol->value.enumerated.item[0]);
1778 }
1779 return ret;
1780}
1781
1782static int tdm_get_format(int value)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001783{
1784 int format = 0;
1785
1786 switch (value) {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001787 case 0:
1788 format = SNDRV_PCM_FORMAT_S16_LE;
1789 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001790 case 1:
1791 format = SNDRV_PCM_FORMAT_S24_LE;
1792 break;
1793 case 2:
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001794 format = SNDRV_PCM_FORMAT_S32_LE;
1795 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001796 default:
1797 format = SNDRV_PCM_FORMAT_S16_LE;
1798 break;
1799 }
1800 return format;
1801}
1802
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001803static int tdm_get_format_val(int format)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001804{
1805 int value = 0;
1806
1807 switch (format) {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001808 case SNDRV_PCM_FORMAT_S16_LE:
1809 value = 0;
1810 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001811 case SNDRV_PCM_FORMAT_S24_LE:
1812 value = 1;
1813 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001814 case SNDRV_PCM_FORMAT_S32_LE:
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001815 value = 2;
1816 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001817 default:
1818 value = 0;
1819 break;
1820 }
1821 return value;
1822}
1823
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001824static int tdm_rx_format_get(struct snd_kcontrol *kcontrol,
1825 struct snd_ctl_elem_value *ucontrol)
1826{
1827 struct tdm_port port;
1828 int ret = tdm_get_port_idx(kcontrol, &port);
1829
1830 if (ret) {
1831 pr_err("%s: unsupported control: %s\n",
1832 __func__, kcontrol->id.name);
1833 } else {
1834 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
1835 tdm_rx_cfg[port.mode][port.channel].bit_format);
1836
1837 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
1838 tdm_rx_cfg[port.mode][port.channel].bit_format,
1839 ucontrol->value.enumerated.item[0]);
1840 }
1841 return ret;
1842}
1843
1844static int tdm_rx_format_put(struct snd_kcontrol *kcontrol,
1845 struct snd_ctl_elem_value *ucontrol)
1846{
1847 struct tdm_port port;
1848 int ret = tdm_get_port_idx(kcontrol, &port);
1849
1850 if (ret) {
1851 pr_err("%s: unsupported control: %s\n",
1852 __func__, kcontrol->id.name);
1853 } else {
1854 tdm_rx_cfg[port.mode][port.channel].bit_format =
1855 tdm_get_format(ucontrol->value.enumerated.item[0]);
1856
1857 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
1858 tdm_rx_cfg[port.mode][port.channel].bit_format,
1859 ucontrol->value.enumerated.item[0]);
1860 }
1861 return ret;
1862}
1863
1864static int tdm_tx_format_get(struct snd_kcontrol *kcontrol,
1865 struct snd_ctl_elem_value *ucontrol)
1866{
1867 struct tdm_port port;
1868 int ret = tdm_get_port_idx(kcontrol, &port);
1869
1870 if (ret) {
1871 pr_err("%s: unsupported control: %s\n",
1872 __func__, kcontrol->id.name);
1873 } else {
1874 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
1875 tdm_tx_cfg[port.mode][port.channel].bit_format);
1876
1877 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
1878 tdm_tx_cfg[port.mode][port.channel].bit_format,
1879 ucontrol->value.enumerated.item[0]);
1880 }
1881 return ret;
1882}
1883
1884static int tdm_tx_format_put(struct snd_kcontrol *kcontrol,
1885 struct snd_ctl_elem_value *ucontrol)
1886{
1887 struct tdm_port port;
1888 int ret = tdm_get_port_idx(kcontrol, &port);
1889
1890 if (ret) {
1891 pr_err("%s: unsupported control: %s\n",
1892 __func__, kcontrol->id.name);
1893 } else {
1894 tdm_tx_cfg[port.mode][port.channel].bit_format =
1895 tdm_get_format(ucontrol->value.enumerated.item[0]);
1896
1897 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
1898 tdm_tx_cfg[port.mode][port.channel].bit_format,
1899 ucontrol->value.enumerated.item[0]);
1900 }
1901 return ret;
1902}
1903
1904static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol,
1905 struct snd_ctl_elem_value *ucontrol)
1906{
1907 struct tdm_port port;
1908 int ret = tdm_get_port_idx(kcontrol, &port);
1909
1910 if (ret) {
1911 pr_err("%s: unsupported control: %s\n",
1912 __func__, kcontrol->id.name);
1913 } else {
1914
1915 ucontrol->value.enumerated.item[0] =
1916 tdm_rx_cfg[port.mode][port.channel].channels - 1;
1917
1918 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
1919 tdm_rx_cfg[port.mode][port.channel].channels - 1,
1920 ucontrol->value.enumerated.item[0]);
1921 }
1922 return ret;
1923}
1924
1925static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol,
1926 struct snd_ctl_elem_value *ucontrol)
1927{
1928 struct tdm_port port;
1929 int ret = tdm_get_port_idx(kcontrol, &port);
1930
1931 if (ret) {
1932 pr_err("%s: unsupported control: %s\n",
1933 __func__, kcontrol->id.name);
1934 } else {
1935 tdm_rx_cfg[port.mode][port.channel].channels =
1936 ucontrol->value.enumerated.item[0] + 1;
1937
1938 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
1939 tdm_rx_cfg[port.mode][port.channel].channels,
1940 ucontrol->value.enumerated.item[0] + 1);
1941 }
1942 return ret;
1943}
1944
1945static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol,
1946 struct snd_ctl_elem_value *ucontrol)
1947{
1948 struct tdm_port port;
1949 int ret = tdm_get_port_idx(kcontrol, &port);
1950
1951 if (ret) {
1952 pr_err("%s: unsupported control: %s\n",
1953 __func__, kcontrol->id.name);
1954 } else {
1955 ucontrol->value.enumerated.item[0] =
1956 tdm_tx_cfg[port.mode][port.channel].channels - 1;
1957
1958 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
1959 tdm_tx_cfg[port.mode][port.channel].channels - 1,
1960 ucontrol->value.enumerated.item[0]);
1961 }
1962 return ret;
1963}
1964
1965static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol,
1966 struct snd_ctl_elem_value *ucontrol)
1967{
1968 struct tdm_port port;
1969 int ret = tdm_get_port_idx(kcontrol, &port);
1970
1971 if (ret) {
1972 pr_err("%s: unsupported control: %s\n",
1973 __func__, kcontrol->id.name);
1974 } else {
1975 tdm_tx_cfg[port.mode][port.channel].channels =
1976 ucontrol->value.enumerated.item[0] + 1;
1977
1978 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
1979 tdm_tx_cfg[port.mode][port.channel].channels,
1980 ucontrol->value.enumerated.item[0] + 1);
1981 }
1982 return ret;
1983}
1984
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07001985static int tdm_slot_map_put(struct snd_kcontrol *kcontrol,
1986 struct snd_ctl_elem_value *ucontrol)
1987{
1988 int slot_index = 0;
1989 int interface = ucontrol->value.integer.value[0];
1990 int channel = ucontrol->value.integer.value[1];
1991 unsigned int offset_val = 0;
1992 unsigned int *slot_offset = NULL;
1993 struct tdm_dev_config *config = NULL;
1994
1995 if (interface < 0 || interface >= (TDM_INTERFACE_MAX * MAX_PATH)) {
1996 pr_err("%s: incorrect interface = %d\n", __func__, interface);
1997 return -EINVAL;
1998 }
1999 if (channel < 0 || channel >= TDM_PORT_MAX) {
2000 pr_err("%s: incorrect channel = %d\n", __func__, channel);
2001 return -EINVAL;
2002 }
2003
2004 pr_debug("%s: interface = %d, channel = %d\n", __func__,
2005 interface, channel);
2006
2007 config = ((struct tdm_dev_config *) tdm_cfg[interface / MAX_PATH]) +
2008 ((interface % MAX_PATH) * TDM_PORT_MAX) + channel;
2009 slot_offset = config->tdm_slot_offset;
2010
2011 for (slot_index = 0; slot_index < TDM_MAX_SLOTS; slot_index++) {
2012 offset_val = ucontrol->value.integer.value[MAX_PATH +
2013 slot_index];
2014 /* Offset value can only be 0, 4, 8, ..28 */
2015 if (offset_val % 4 == 0 && offset_val <= 28)
2016 slot_offset[slot_index] = offset_val;
2017 pr_debug("%s: slot offset[%d] = %d\n", __func__,
2018 slot_index, slot_offset[slot_index]);
2019 }
2020
2021 return 0;
2022}
2023
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002024static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol)
2025{
2026 int idx = 0;
2027
2028 if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM",
2029 sizeof("PRIM_AUX_PCM"))) {
2030 idx = PRIM_AUX_PCM;
2031 } else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM",
2032 sizeof("SEC_AUX_PCM"))) {
2033 idx = SEC_AUX_PCM;
2034 } else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM",
2035 sizeof("TERT_AUX_PCM"))) {
2036 idx = TERT_AUX_PCM;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002037 } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM",
2038 sizeof("QUAT_AUX_PCM"))) {
2039 idx = QUAT_AUX_PCM;
2040 } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM",
2041 sizeof("QUIN_AUX_PCM"))) {
2042 idx = QUIN_AUX_PCM;
2043 } else if (strnstr(kcontrol->id.name, "SEN_AUX_PCM",
2044 sizeof("SEN_AUX_PCM"))) {
2045 idx = SEN_AUX_PCM;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002046 } else {
2047 pr_err("%s: unsupported port: %s\n",
2048 __func__, kcontrol->id.name);
2049 idx = -EINVAL;
2050 }
2051
2052 return idx;
2053}
2054
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002055static int aux_pcm_get_sample_rate(int value)
2056{
2057 int sample_rate = 0;
2058
2059 switch (value) {
2060 case 1:
2061 sample_rate = SAMPLING_RATE_16KHZ;
2062 break;
2063 case 0:
2064 default:
2065 sample_rate = SAMPLING_RATE_8KHZ;
2066 break;
2067 }
2068 return sample_rate;
2069}
2070
2071static int aux_pcm_get_sample_rate_val(int sample_rate)
2072{
2073 int sample_rate_val = 0;
2074
2075 switch (sample_rate) {
2076 case SAMPLING_RATE_16KHZ:
2077 sample_rate_val = 1;
2078 break;
2079 case SAMPLING_RATE_8KHZ:
2080 default:
2081 sample_rate_val = 0;
2082 break;
2083 }
2084 return sample_rate_val;
2085}
2086
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002087static int mi2s_auxpcm_get_format(int value)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002088{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002089 int format = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002090
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002091 switch (value) {
2092 case 0:
2093 format = SNDRV_PCM_FORMAT_S16_LE;
2094 break;
2095 case 1:
2096 format = SNDRV_PCM_FORMAT_S24_LE;
2097 break;
2098 case 2:
2099 format = SNDRV_PCM_FORMAT_S24_3LE;
2100 break;
2101 case 3:
2102 format = SNDRV_PCM_FORMAT_S32_LE;
2103 break;
2104 default:
2105 format = SNDRV_PCM_FORMAT_S16_LE;
2106 break;
2107 }
2108 return format;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002109}
2110
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002111static int mi2s_auxpcm_get_format_value(int format)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002112{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002113 int value = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002114
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002115 switch (format) {
2116 case SNDRV_PCM_FORMAT_S16_LE:
2117 value = 0;
2118 break;
2119 case SNDRV_PCM_FORMAT_S24_LE:
2120 value = 1;
2121 break;
2122 case SNDRV_PCM_FORMAT_S24_3LE:
2123 value = 2;
2124 break;
2125 case SNDRV_PCM_FORMAT_S32_LE:
2126 value = 3;
2127 break;
2128 default:
2129 value = 0;
2130 break;
2131 }
2132 return value;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002133}
2134
2135static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2136 struct snd_ctl_elem_value *ucontrol)
2137{
2138 int idx = aux_pcm_get_port_idx(kcontrol);
2139
2140 if (idx < 0)
2141 return idx;
2142
2143 ucontrol->value.enumerated.item[0] =
2144 aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate);
2145
2146 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2147 idx, aux_pcm_rx_cfg[idx].sample_rate,
2148 ucontrol->value.enumerated.item[0]);
2149
2150 return 0;
2151}
2152
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002153static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002154 struct snd_ctl_elem_value *ucontrol)
2155{
2156 int idx = aux_pcm_get_port_idx(kcontrol);
2157
2158 if (idx < 0)
2159 return idx;
2160
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002161 aux_pcm_rx_cfg[idx].sample_rate =
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002162 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2163
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002164 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2165 idx, aux_pcm_rx_cfg[idx].sample_rate,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002166 ucontrol->value.enumerated.item[0]);
2167
2168 return 0;
2169}
2170
2171static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2172 struct snd_ctl_elem_value *ucontrol)
2173{
2174 int idx = aux_pcm_get_port_idx(kcontrol);
2175
2176 if (idx < 0)
2177 return idx;
2178
2179 ucontrol->value.enumerated.item[0] =
2180 aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate);
2181
2182 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2183 idx, aux_pcm_tx_cfg[idx].sample_rate,
2184 ucontrol->value.enumerated.item[0]);
2185
2186 return 0;
2187}
2188
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002189static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2190 struct snd_ctl_elem_value *ucontrol)
2191{
2192 int idx = aux_pcm_get_port_idx(kcontrol);
2193
2194 if (idx < 0)
2195 return idx;
2196
2197 aux_pcm_tx_cfg[idx].sample_rate =
2198 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2199
2200 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2201 idx, aux_pcm_tx_cfg[idx].sample_rate,
2202 ucontrol->value.enumerated.item[0]);
2203
2204 return 0;
2205}
2206
2207static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol,
2208 struct snd_ctl_elem_value *ucontrol)
2209{
2210 int idx = aux_pcm_get_port_idx(kcontrol);
2211
2212 if (idx < 0)
2213 return idx;
2214
2215 ucontrol->value.enumerated.item[0] =
2216 mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format);
2217
2218 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
2219 idx, aux_pcm_rx_cfg[idx].bit_format,
2220 ucontrol->value.enumerated.item[0]);
2221
2222 return 0;
2223}
2224
2225static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol,
2226 struct snd_ctl_elem_value *ucontrol)
2227{
2228 int idx = aux_pcm_get_port_idx(kcontrol);
2229
2230 if (idx < 0)
2231 return idx;
2232
2233 aux_pcm_rx_cfg[idx].bit_format =
2234 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2235
2236 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
2237 idx, aux_pcm_rx_cfg[idx].bit_format,
2238 ucontrol->value.enumerated.item[0]);
2239
2240 return 0;
2241}
2242
2243static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol,
2244 struct snd_ctl_elem_value *ucontrol)
2245{
2246 int idx = aux_pcm_get_port_idx(kcontrol);
2247
2248 if (idx < 0)
2249 return idx;
2250
2251 ucontrol->value.enumerated.item[0] =
2252 mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format);
2253
2254 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2255 idx, aux_pcm_tx_cfg[idx].bit_format,
2256 ucontrol->value.enumerated.item[0]);
2257
2258 return 0;
2259}
2260
2261static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol,
2262 struct snd_ctl_elem_value *ucontrol)
2263{
2264 int idx = aux_pcm_get_port_idx(kcontrol);
2265
2266 if (idx < 0)
2267 return idx;
2268
2269 aux_pcm_tx_cfg[idx].bit_format =
2270 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2271
2272 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2273 idx, aux_pcm_tx_cfg[idx].bit_format,
2274 ucontrol->value.enumerated.item[0]);
2275
2276 return 0;
2277}
2278
2279static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol)
2280{
2281 int idx = 0;
2282
2283 if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX",
2284 sizeof("PRIM_MI2S_RX"))) {
2285 idx = PRIM_MI2S;
2286 } else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX",
2287 sizeof("SEC_MI2S_RX"))) {
2288 idx = SEC_MI2S;
2289 } else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX",
2290 sizeof("TERT_MI2S_RX"))) {
2291 idx = TERT_MI2S;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002292 } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX",
2293 sizeof("QUAT_MI2S_RX"))) {
2294 idx = QUAT_MI2S;
2295 } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX",
2296 sizeof("QUIN_MI2S_RX"))) {
2297 idx = QUIN_MI2S;
2298 } else if (strnstr(kcontrol->id.name, "SEN_MI2S_RX",
2299 sizeof("SEN_MI2S_RX"))) {
2300 idx = SEN_MI2S;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002301 } else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX",
2302 sizeof("PRIM_MI2S_TX"))) {
2303 idx = PRIM_MI2S;
2304 } else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX",
2305 sizeof("SEC_MI2S_TX"))) {
2306 idx = SEC_MI2S;
2307 } else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX",
2308 sizeof("TERT_MI2S_TX"))) {
2309 idx = TERT_MI2S;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002310 } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX",
2311 sizeof("QUAT_MI2S_TX"))) {
2312 idx = QUAT_MI2S;
2313 } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX",
2314 sizeof("QUIN_MI2S_TX"))) {
2315 idx = QUIN_MI2S;
2316 } else if (strnstr(kcontrol->id.name, "SEN_MI2S_TX",
2317 sizeof("SEN_MI2S_TX"))) {
2318 idx = SEN_MI2S;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002319 } else {
2320 pr_err("%s: unsupported channel: %s\n",
2321 __func__, kcontrol->id.name);
2322 idx = -EINVAL;
2323 }
2324
2325 return idx;
2326}
2327
2328static int mi2s_get_sample_rate(int value)
2329{
2330 int sample_rate = 0;
2331
2332 switch (value) {
2333 case 0:
2334 sample_rate = SAMPLING_RATE_8KHZ;
2335 break;
2336 case 1:
2337 sample_rate = SAMPLING_RATE_11P025KHZ;
2338 break;
2339 case 2:
2340 sample_rate = SAMPLING_RATE_16KHZ;
2341 break;
2342 case 3:
2343 sample_rate = SAMPLING_RATE_22P05KHZ;
2344 break;
2345 case 4:
2346 sample_rate = SAMPLING_RATE_32KHZ;
2347 break;
2348 case 5:
2349 sample_rate = SAMPLING_RATE_44P1KHZ;
2350 break;
2351 case 6:
2352 sample_rate = SAMPLING_RATE_48KHZ;
2353 break;
2354 case 7:
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07002355 sample_rate = SAMPLING_RATE_88P2KHZ;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002356 break;
2357 case 8:
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07002358 sample_rate = SAMPLING_RATE_96KHZ;
2359 break;
2360 case 9:
2361 sample_rate = SAMPLING_RATE_176P4KHZ;
2362 break;
2363 case 10:
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002364 sample_rate = SAMPLING_RATE_192KHZ;
2365 break;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07002366 case 11:
2367 sample_rate = SAMPLING_RATE_352P8KHZ;
2368 break;
2369 case 12:
2370 sample_rate = SAMPLING_RATE_384KHZ;
2371 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002372 default:
2373 sample_rate = SAMPLING_RATE_48KHZ;
2374 break;
2375 }
2376 return sample_rate;
2377}
2378
2379static int mi2s_get_sample_rate_val(int sample_rate)
2380{
2381 int sample_rate_val = 0;
2382
2383 switch (sample_rate) {
2384 case SAMPLING_RATE_8KHZ:
2385 sample_rate_val = 0;
2386 break;
2387 case SAMPLING_RATE_11P025KHZ:
2388 sample_rate_val = 1;
2389 break;
2390 case SAMPLING_RATE_16KHZ:
2391 sample_rate_val = 2;
2392 break;
2393 case SAMPLING_RATE_22P05KHZ:
2394 sample_rate_val = 3;
2395 break;
2396 case SAMPLING_RATE_32KHZ:
2397 sample_rate_val = 4;
2398 break;
2399 case SAMPLING_RATE_44P1KHZ:
2400 sample_rate_val = 5;
2401 break;
2402 case SAMPLING_RATE_48KHZ:
2403 sample_rate_val = 6;
2404 break;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07002405 case SAMPLING_RATE_88P2KHZ:
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002406 sample_rate_val = 7;
2407 break;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07002408 case SAMPLING_RATE_96KHZ:
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002409 sample_rate_val = 8;
2410 break;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07002411 case SAMPLING_RATE_176P4KHZ:
2412 sample_rate_val = 9;
2413 break;
2414 case SAMPLING_RATE_192KHZ:
2415 sample_rate_val = 10;
2416 break;
2417 case SAMPLING_RATE_352P8KHZ:
2418 sample_rate_val = 11;
2419 break;
2420 case SAMPLING_RATE_384KHZ:
2421 sample_rate_val = 12;
2422 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002423 default:
2424 sample_rate_val = 6;
2425 break;
2426 }
2427 return sample_rate_val;
2428}
2429
2430static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2431 struct snd_ctl_elem_value *ucontrol)
2432{
2433 int idx = mi2s_get_port_idx(kcontrol);
2434
2435 if (idx < 0)
2436 return idx;
2437
2438 ucontrol->value.enumerated.item[0] =
2439 mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate);
2440
2441 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2442 idx, mi2s_rx_cfg[idx].sample_rate,
2443 ucontrol->value.enumerated.item[0]);
2444
2445 return 0;
2446}
2447
2448static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2449 struct snd_ctl_elem_value *ucontrol)
2450{
2451 int idx = mi2s_get_port_idx(kcontrol);
2452
2453 if (idx < 0)
2454 return idx;
2455
2456 mi2s_rx_cfg[idx].sample_rate =
2457 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
2458
2459 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2460 idx, mi2s_rx_cfg[idx].sample_rate,
2461 ucontrol->value.enumerated.item[0]);
2462
2463 return 0;
2464}
2465
2466static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2467 struct snd_ctl_elem_value *ucontrol)
2468{
2469 int idx = mi2s_get_port_idx(kcontrol);
2470
2471 if (idx < 0)
2472 return idx;
2473
2474 ucontrol->value.enumerated.item[0] =
2475 mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate);
2476
2477 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2478 idx, mi2s_tx_cfg[idx].sample_rate,
2479 ucontrol->value.enumerated.item[0]);
2480
2481 return 0;
2482}
2483
2484static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2485 struct snd_ctl_elem_value *ucontrol)
2486{
2487 int idx = mi2s_get_port_idx(kcontrol);
2488
2489 if (idx < 0)
2490 return idx;
2491
2492 mi2s_tx_cfg[idx].sample_rate =
2493 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
2494
2495 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2496 idx, mi2s_tx_cfg[idx].sample_rate,
2497 ucontrol->value.enumerated.item[0]);
2498
2499 return 0;
2500}
2501
2502static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol,
2503 struct snd_ctl_elem_value *ucontrol)
2504{
2505 int idx = mi2s_get_port_idx(kcontrol);
2506
2507 if (idx < 0)
2508 return idx;
2509
2510 ucontrol->value.enumerated.item[0] =
2511 mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format);
2512
2513 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
2514 idx, mi2s_rx_cfg[idx].bit_format,
2515 ucontrol->value.enumerated.item[0]);
2516
2517 return 0;
2518}
2519
2520static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol,
2521 struct snd_ctl_elem_value *ucontrol)
2522{
2523 int idx = mi2s_get_port_idx(kcontrol);
2524
2525 if (idx < 0)
2526 return idx;
2527
2528 mi2s_rx_cfg[idx].bit_format =
2529 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2530
2531 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
2532 idx, mi2s_rx_cfg[idx].bit_format,
2533 ucontrol->value.enumerated.item[0]);
2534
2535 return 0;
2536}
2537
2538static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol,
2539 struct snd_ctl_elem_value *ucontrol)
2540{
2541 int idx = mi2s_get_port_idx(kcontrol);
2542
2543 if (idx < 0)
2544 return idx;
2545
2546 ucontrol->value.enumerated.item[0] =
2547 mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format);
2548
2549 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2550 idx, mi2s_tx_cfg[idx].bit_format,
2551 ucontrol->value.enumerated.item[0]);
2552
2553 return 0;
2554}
2555
2556static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol,
2557 struct snd_ctl_elem_value *ucontrol)
2558{
2559 int idx = mi2s_get_port_idx(kcontrol);
2560
2561 if (idx < 0)
2562 return idx;
2563
2564 mi2s_tx_cfg[idx].bit_format =
2565 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2566
2567 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2568 idx, mi2s_tx_cfg[idx].bit_format,
2569 ucontrol->value.enumerated.item[0]);
2570
2571 return 0;
2572}
2573static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol,
2574 struct snd_ctl_elem_value *ucontrol)
2575{
2576 int idx = mi2s_get_port_idx(kcontrol);
2577
2578 if (idx < 0)
2579 return idx;
2580
2581 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
2582 idx, mi2s_rx_cfg[idx].channels);
2583 ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1;
2584
2585 return 0;
2586}
2587
2588static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol,
2589 struct snd_ctl_elem_value *ucontrol)
2590{
2591 int idx = mi2s_get_port_idx(kcontrol);
2592
2593 if (idx < 0)
2594 return idx;
2595
2596 mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
2597 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
2598 idx, mi2s_rx_cfg[idx].channels);
2599
2600 return 1;
2601}
2602
2603static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol,
2604 struct snd_ctl_elem_value *ucontrol)
2605{
2606 int idx = mi2s_get_port_idx(kcontrol);
2607
2608 if (idx < 0)
2609 return idx;
2610
2611 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
2612 idx, mi2s_tx_cfg[idx].channels);
2613 ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1;
2614
2615 return 0;
2616}
2617
2618static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol,
2619 struct snd_ctl_elem_value *ucontrol)
2620{
2621 int idx = mi2s_get_port_idx(kcontrol);
2622
2623 if (idx < 0)
2624 return idx;
2625
2626 mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
2627 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
2628 idx, mi2s_tx_cfg[idx].channels);
2629
2630 return 1;
2631}
2632
2633static int msm_get_port_id(int be_id)
2634{
2635 int afe_port_id = 0;
2636
2637 switch (be_id) {
2638 case MSM_BACKEND_DAI_PRI_MI2S_RX:
2639 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX;
2640 break;
2641 case MSM_BACKEND_DAI_PRI_MI2S_TX:
2642 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX;
2643 break;
2644 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
2645 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX;
2646 break;
2647 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
2648 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX;
2649 break;
2650 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
2651 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX;
2652 break;
2653 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
2654 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
2655 break;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002656 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
2657 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
2658 break;
2659 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
2660 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
2661 break;
2662 case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
2663 afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX;
2664 break;
2665 case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
2666 afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
2667 break;
2668 case MSM_BACKEND_DAI_SENARY_MI2S_RX:
2669 afe_port_id = AFE_PORT_ID_SENARY_MI2S_RX;
2670 break;
2671 case MSM_BACKEND_DAI_SENARY_MI2S_TX:
2672 afe_port_id = AFE_PORT_ID_SENARY_MI2S_TX;
2673 break;
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07002674 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
2675 afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0;
2676 break;
2677 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
2678 afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_1;
2679 break;
2680 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
2681 afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_2;
2682 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002683 default:
2684 pr_err("%s: Invalid BE id: %d\n", __func__, be_id);
2685 afe_port_id = -EINVAL;
2686 }
2687
2688 return afe_port_id;
2689}
2690
2691static u32 get_mi2s_bits_per_sample(u32 bit_format)
2692{
2693 u32 bit_per_sample = 0;
2694
2695 switch (bit_format) {
2696 case SNDRV_PCM_FORMAT_S32_LE:
2697 case SNDRV_PCM_FORMAT_S24_3LE:
2698 case SNDRV_PCM_FORMAT_S24_LE:
2699 bit_per_sample = 32;
2700 break;
2701 case SNDRV_PCM_FORMAT_S16_LE:
2702 default:
2703 bit_per_sample = 16;
2704 break;
2705 }
2706
2707 return bit_per_sample;
2708}
2709
2710static void update_mi2s_clk_val(int dai_id, int stream)
2711{
2712 u32 bit_per_sample = 0;
2713
2714 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
2715 bit_per_sample =
2716 get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format);
2717 mi2s_clk[dai_id].clk_freq_in_hz =
2718 mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
2719 } else {
2720 bit_per_sample =
2721 get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format);
2722 mi2s_clk[dai_id].clk_freq_in_hz =
2723 mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
2724 }
2725}
2726
2727static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
2728{
2729 int ret = 0;
2730 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2731 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2732 int port_id = 0;
2733 int index = cpu_dai->id;
2734
2735 port_id = msm_get_port_id(rtd->dai_link->id);
2736 if (port_id < 0) {
2737 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
2738 ret = port_id;
2739 goto err;
2740 }
2741
2742 if (enable) {
2743 update_mi2s_clk_val(index, substream->stream);
2744 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
2745 mi2s_clk[index].clk_freq_in_hz);
2746 }
2747
2748 mi2s_clk[index].enable = enable;
2749 ret = afe_set_lpass_clock_v2(port_id,
2750 &mi2s_clk[index]);
2751 if (ret < 0) {
2752 dev_err(rtd->card->dev,
2753 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
2754 __func__, port_id, ret);
2755 goto err;
2756 }
2757
2758err:
2759 return ret;
2760}
2761
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002762static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol)
2763{
2764 int idx = 0;
2765
2766 if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0",
2767 sizeof("WSA_CDC_DMA_RX_0")))
2768 idx = WSA_CDC_DMA_RX_0;
2769 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1",
2770 sizeof("WSA_CDC_DMA_RX_0")))
2771 idx = WSA_CDC_DMA_RX_1;
2772 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_0",
2773 sizeof("RX_CDC_DMA_RX_0")))
2774 idx = RX_CDC_DMA_RX_0;
2775 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_1",
2776 sizeof("RX_CDC_DMA_RX_1")))
2777 idx = RX_CDC_DMA_RX_1;
2778 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_2",
2779 sizeof("RX_CDC_DMA_RX_2")))
2780 idx = RX_CDC_DMA_RX_2;
2781 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_3",
2782 sizeof("RX_CDC_DMA_RX_3")))
2783 idx = RX_CDC_DMA_RX_3;
2784 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_5",
2785 sizeof("RX_CDC_DMA_RX_5")))
2786 idx = RX_CDC_DMA_RX_5;
2787 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0",
2788 sizeof("WSA_CDC_DMA_TX_0")))
2789 idx = WSA_CDC_DMA_TX_0;
2790 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1",
2791 sizeof("WSA_CDC_DMA_TX_1")))
2792 idx = WSA_CDC_DMA_TX_1;
2793 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2",
2794 sizeof("WSA_CDC_DMA_TX_2")))
2795 idx = WSA_CDC_DMA_TX_2;
2796 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_0",
2797 sizeof("TX_CDC_DMA_TX_0")))
2798 idx = TX_CDC_DMA_TX_0;
2799 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_3",
2800 sizeof("TX_CDC_DMA_TX_3")))
2801 idx = TX_CDC_DMA_TX_3;
2802 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_4",
2803 sizeof("TX_CDC_DMA_TX_4")))
2804 idx = TX_CDC_DMA_TX_4;
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08002805 else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_0",
2806 sizeof("VA_CDC_DMA_TX_0")))
2807 idx = VA_CDC_DMA_TX_0;
2808 else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_1",
2809 sizeof("VA_CDC_DMA_TX_1")))
2810 idx = VA_CDC_DMA_TX_1;
2811 else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_2",
2812 sizeof("VA_CDC_DMA_TX_2")))
2813 idx = VA_CDC_DMA_TX_2;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002814 else {
2815 pr_err("%s: unsupported channel: %s\n",
2816 __func__, kcontrol->id.name);
2817 return -EINVAL;
2818 }
2819
2820 return idx;
2821}
2822
2823static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol,
2824 struct snd_ctl_elem_value *ucontrol)
2825{
2826 int ch_num = cdc_dma_get_port_idx(kcontrol);
2827
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002828 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002829 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2830 return ch_num;
2831 }
2832
2833 pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__,
2834 cdc_dma_rx_cfg[ch_num].channels - 1);
2835 ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1;
2836 return 0;
2837}
2838
2839static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol,
2840 struct snd_ctl_elem_value *ucontrol)
2841{
2842 int ch_num = cdc_dma_get_port_idx(kcontrol);
2843
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002844 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002845 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2846 return ch_num;
2847 }
2848
2849 cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1;
2850
2851 pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__,
2852 cdc_dma_rx_cfg[ch_num].channels);
2853 return 1;
2854}
2855
2856static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol,
2857 struct snd_ctl_elem_value *ucontrol)
2858{
2859 int ch_num = cdc_dma_get_port_idx(kcontrol);
2860
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002861 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002862 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2863 return ch_num;
2864 }
2865
2866 switch (cdc_dma_rx_cfg[ch_num].bit_format) {
2867 case SNDRV_PCM_FORMAT_S32_LE:
2868 ucontrol->value.integer.value[0] = 3;
2869 break;
2870 case SNDRV_PCM_FORMAT_S24_3LE:
2871 ucontrol->value.integer.value[0] = 2;
2872 break;
2873 case SNDRV_PCM_FORMAT_S24_LE:
2874 ucontrol->value.integer.value[0] = 1;
2875 break;
2876 case SNDRV_PCM_FORMAT_S16_LE:
2877 default:
2878 ucontrol->value.integer.value[0] = 0;
2879 break;
2880 }
2881
2882 pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n",
2883 __func__, cdc_dma_rx_cfg[ch_num].bit_format,
2884 ucontrol->value.integer.value[0]);
2885 return 0;
2886}
2887
2888static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol,
2889 struct snd_ctl_elem_value *ucontrol)
2890{
2891 int rc = 0;
2892 int ch_num = cdc_dma_get_port_idx(kcontrol);
2893
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002894 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002895 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2896 return ch_num;
2897 }
2898
2899 switch (ucontrol->value.integer.value[0]) {
2900 case 3:
2901 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE;
2902 break;
2903 case 2:
2904 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
2905 break;
2906 case 1:
2907 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE;
2908 break;
2909 case 0:
2910 default:
2911 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE;
2912 break;
2913 }
2914 pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n",
2915 __func__, cdc_dma_rx_cfg[ch_num].bit_format,
2916 ucontrol->value.integer.value[0]);
2917
2918 return rc;
2919}
2920
2921
2922static int cdc_dma_get_sample_rate_val(int sample_rate)
2923{
2924 int sample_rate_val = 0;
2925
2926 switch (sample_rate) {
2927 case SAMPLING_RATE_8KHZ:
2928 sample_rate_val = 0;
2929 break;
2930 case SAMPLING_RATE_11P025KHZ:
2931 sample_rate_val = 1;
2932 break;
2933 case SAMPLING_RATE_16KHZ:
2934 sample_rate_val = 2;
2935 break;
2936 case SAMPLING_RATE_22P05KHZ:
2937 sample_rate_val = 3;
2938 break;
2939 case SAMPLING_RATE_32KHZ:
2940 sample_rate_val = 4;
2941 break;
2942 case SAMPLING_RATE_44P1KHZ:
2943 sample_rate_val = 5;
2944 break;
2945 case SAMPLING_RATE_48KHZ:
2946 sample_rate_val = 6;
2947 break;
2948 case SAMPLING_RATE_88P2KHZ:
2949 sample_rate_val = 7;
2950 break;
2951 case SAMPLING_RATE_96KHZ:
2952 sample_rate_val = 8;
2953 break;
2954 case SAMPLING_RATE_176P4KHZ:
2955 sample_rate_val = 9;
2956 break;
2957 case SAMPLING_RATE_192KHZ:
2958 sample_rate_val = 10;
2959 break;
2960 case SAMPLING_RATE_352P8KHZ:
2961 sample_rate_val = 11;
2962 break;
2963 case SAMPLING_RATE_384KHZ:
2964 sample_rate_val = 12;
2965 break;
2966 default:
2967 sample_rate_val = 6;
2968 break;
2969 }
2970 return sample_rate_val;
2971}
2972
2973static int cdc_dma_get_sample_rate(int value)
2974{
2975 int sample_rate = 0;
2976
2977 switch (value) {
2978 case 0:
2979 sample_rate = SAMPLING_RATE_8KHZ;
2980 break;
2981 case 1:
2982 sample_rate = SAMPLING_RATE_11P025KHZ;
2983 break;
2984 case 2:
2985 sample_rate = SAMPLING_RATE_16KHZ;
2986 break;
2987 case 3:
2988 sample_rate = SAMPLING_RATE_22P05KHZ;
2989 break;
2990 case 4:
2991 sample_rate = SAMPLING_RATE_32KHZ;
2992 break;
2993 case 5:
2994 sample_rate = SAMPLING_RATE_44P1KHZ;
2995 break;
2996 case 6:
2997 sample_rate = SAMPLING_RATE_48KHZ;
2998 break;
2999 case 7:
3000 sample_rate = SAMPLING_RATE_88P2KHZ;
3001 break;
3002 case 8:
3003 sample_rate = SAMPLING_RATE_96KHZ;
3004 break;
3005 case 9:
3006 sample_rate = SAMPLING_RATE_176P4KHZ;
3007 break;
3008 case 10:
3009 sample_rate = SAMPLING_RATE_192KHZ;
3010 break;
3011 case 11:
3012 sample_rate = SAMPLING_RATE_352P8KHZ;
3013 break;
3014 case 12:
3015 sample_rate = SAMPLING_RATE_384KHZ;
3016 break;
3017 default:
3018 sample_rate = SAMPLING_RATE_48KHZ;
3019 break;
3020 }
3021 return sample_rate;
3022}
3023
3024static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
3025 struct snd_ctl_elem_value *ucontrol)
3026{
3027 int ch_num = cdc_dma_get_port_idx(kcontrol);
3028
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07003029 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003030 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3031 return ch_num;
3032 }
3033
3034 ucontrol->value.enumerated.item[0] =
3035 cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate);
3036
3037 pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__,
3038 cdc_dma_rx_cfg[ch_num].sample_rate);
3039 return 0;
3040}
3041
3042static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
3043 struct snd_ctl_elem_value *ucontrol)
3044{
3045 int ch_num = cdc_dma_get_port_idx(kcontrol);
3046
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07003047 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003048 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3049 return ch_num;
3050 }
3051
3052 cdc_dma_rx_cfg[ch_num].sample_rate =
3053 cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]);
3054
3055
3056 pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n",
3057 __func__, ucontrol->value.enumerated.item[0],
3058 cdc_dma_rx_cfg[ch_num].sample_rate);
3059 return 0;
3060}
3061
3062static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol,
3063 struct snd_ctl_elem_value *ucontrol)
3064{
3065 int ch_num = cdc_dma_get_port_idx(kcontrol);
3066
3067 if (ch_num < 0) {
3068 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3069 return ch_num;
3070 }
3071
3072 pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__,
3073 cdc_dma_tx_cfg[ch_num].channels);
3074 ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1;
3075 return 0;
3076}
3077
3078static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol,
3079 struct snd_ctl_elem_value *ucontrol)
3080{
3081 int ch_num = cdc_dma_get_port_idx(kcontrol);
3082
3083 if (ch_num < 0) {
3084 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3085 return ch_num;
3086 }
3087
3088 cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1;
3089
3090 pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__,
3091 cdc_dma_tx_cfg[ch_num].channels);
3092 return 1;
3093}
3094
3095static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
3096 struct snd_ctl_elem_value *ucontrol)
3097{
3098 int sample_rate_val;
3099 int ch_num = cdc_dma_get_port_idx(kcontrol);
3100
3101 if (ch_num < 0) {
3102 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3103 return ch_num;
3104 }
3105
3106 switch (cdc_dma_tx_cfg[ch_num].sample_rate) {
3107 case SAMPLING_RATE_384KHZ:
3108 sample_rate_val = 12;
3109 break;
3110 case SAMPLING_RATE_352P8KHZ:
3111 sample_rate_val = 11;
3112 break;
3113 case SAMPLING_RATE_192KHZ:
3114 sample_rate_val = 10;
3115 break;
3116 case SAMPLING_RATE_176P4KHZ:
3117 sample_rate_val = 9;
3118 break;
3119 case SAMPLING_RATE_96KHZ:
3120 sample_rate_val = 8;
3121 break;
3122 case SAMPLING_RATE_88P2KHZ:
3123 sample_rate_val = 7;
3124 break;
3125 case SAMPLING_RATE_48KHZ:
3126 sample_rate_val = 6;
3127 break;
3128 case SAMPLING_RATE_44P1KHZ:
3129 sample_rate_val = 5;
3130 break;
3131 case SAMPLING_RATE_32KHZ:
3132 sample_rate_val = 4;
3133 break;
3134 case SAMPLING_RATE_22P05KHZ:
3135 sample_rate_val = 3;
3136 break;
3137 case SAMPLING_RATE_16KHZ:
3138 sample_rate_val = 2;
3139 break;
3140 case SAMPLING_RATE_11P025KHZ:
3141 sample_rate_val = 1;
3142 break;
3143 case SAMPLING_RATE_8KHZ:
3144 sample_rate_val = 0;
3145 break;
3146 default:
3147 sample_rate_val = 6;
3148 break;
3149 }
3150
3151 ucontrol->value.integer.value[0] = sample_rate_val;
3152 pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__,
3153 cdc_dma_tx_cfg[ch_num].sample_rate);
3154 return 0;
3155}
3156
3157static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
3158 struct snd_ctl_elem_value *ucontrol)
3159{
3160 int ch_num = cdc_dma_get_port_idx(kcontrol);
3161
3162 if (ch_num < 0) {
3163 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3164 return ch_num;
3165 }
3166
3167 switch (ucontrol->value.integer.value[0]) {
3168 case 12:
3169 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ;
3170 break;
3171 case 11:
3172 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ;
3173 break;
3174 case 10:
3175 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ;
3176 break;
3177 case 9:
3178 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ;
3179 break;
3180 case 8:
3181 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ;
3182 break;
3183 case 7:
3184 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ;
3185 break;
3186 case 6:
3187 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ;
3188 break;
3189 case 5:
3190 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ;
3191 break;
3192 case 4:
3193 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ;
3194 break;
3195 case 3:
3196 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ;
3197 break;
3198 case 2:
3199 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ;
3200 break;
3201 case 1:
3202 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ;
3203 break;
3204 case 0:
3205 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ;
3206 break;
3207 default:
3208 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ;
3209 break;
3210 }
3211
3212 pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n",
3213 __func__, ucontrol->value.integer.value[0],
3214 cdc_dma_tx_cfg[ch_num].sample_rate);
3215 return 0;
3216}
3217
3218static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol,
3219 struct snd_ctl_elem_value *ucontrol)
3220{
3221 int ch_num = cdc_dma_get_port_idx(kcontrol);
3222
3223 if (ch_num < 0) {
3224 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3225 return ch_num;
3226 }
3227
3228 switch (cdc_dma_tx_cfg[ch_num].bit_format) {
3229 case SNDRV_PCM_FORMAT_S32_LE:
3230 ucontrol->value.integer.value[0] = 3;
3231 break;
3232 case SNDRV_PCM_FORMAT_S24_3LE:
3233 ucontrol->value.integer.value[0] = 2;
3234 break;
3235 case SNDRV_PCM_FORMAT_S24_LE:
3236 ucontrol->value.integer.value[0] = 1;
3237 break;
3238 case SNDRV_PCM_FORMAT_S16_LE:
3239 default:
3240 ucontrol->value.integer.value[0] = 0;
3241 break;
3242 }
3243
3244 pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n",
3245 __func__, cdc_dma_tx_cfg[ch_num].bit_format,
3246 ucontrol->value.integer.value[0]);
3247 return 0;
3248}
3249
3250static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol,
3251 struct snd_ctl_elem_value *ucontrol)
3252{
3253 int rc = 0;
3254 int ch_num = cdc_dma_get_port_idx(kcontrol);
3255
3256 if (ch_num < 0) {
3257 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
3258 return ch_num;
3259 }
3260
3261 switch (ucontrol->value.integer.value[0]) {
3262 case 3:
3263 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE;
3264 break;
3265 case 2:
3266 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
3267 break;
3268 case 1:
3269 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE;
3270 break;
3271 case 0:
3272 default:
3273 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE;
3274 break;
3275 }
3276 pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n",
3277 __func__, cdc_dma_tx_cfg[ch_num].bit_format,
3278 ucontrol->value.integer.value[0]);
3279
3280 return rc;
3281}
3282
3283static int msm_cdc_dma_get_idx_from_beid(int32_t be_id)
3284{
3285 int idx = 0;
3286
3287 switch (be_id) {
3288 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
3289 idx = WSA_CDC_DMA_RX_0;
3290 break;
3291 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
3292 idx = WSA_CDC_DMA_TX_0;
3293 break;
3294 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
3295 idx = WSA_CDC_DMA_RX_1;
3296 break;
3297 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
3298 idx = WSA_CDC_DMA_TX_1;
3299 break;
3300 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
3301 idx = WSA_CDC_DMA_TX_2;
3302 break;
3303 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
3304 idx = RX_CDC_DMA_RX_0;
3305 break;
3306 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
3307 idx = RX_CDC_DMA_RX_1;
3308 break;
3309 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
3310 idx = RX_CDC_DMA_RX_2;
3311 break;
3312 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
3313 idx = RX_CDC_DMA_RX_3;
3314 break;
3315 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5:
3316 idx = RX_CDC_DMA_RX_5;
3317 break;
3318 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
3319 idx = TX_CDC_DMA_TX_0;
3320 break;
3321 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
3322 idx = TX_CDC_DMA_TX_3;
3323 break;
3324 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
3325 idx = TX_CDC_DMA_TX_4;
3326 break;
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003327 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
3328 idx = VA_CDC_DMA_TX_0;
3329 break;
3330 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
3331 idx = VA_CDC_DMA_TX_1;
3332 break;
3333 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
3334 idx = VA_CDC_DMA_TX_2;
3335 break;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003336 default:
3337 idx = RX_CDC_DMA_RX_0;
3338 break;
3339 }
3340
3341 return idx;
3342}
3343
Banajit Goswami83a370d2019-03-05 16:15:21 -08003344static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol,
3345 struct snd_ctl_elem_value *ucontrol)
3346{
3347 /*
3348 * Slimbus_7_Rx/Tx sample rate values should always be in sync (same)
3349 * when used for BT_SCO use case. Return either Rx or Tx sample rate
3350 * value.
3351 */
3352 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
3353 case SAMPLING_RATE_96KHZ:
3354 ucontrol->value.integer.value[0] = 5;
3355 break;
3356 case SAMPLING_RATE_88P2KHZ:
3357 ucontrol->value.integer.value[0] = 4;
3358 break;
3359 case SAMPLING_RATE_48KHZ:
3360 ucontrol->value.integer.value[0] = 3;
3361 break;
3362 case SAMPLING_RATE_44P1KHZ:
3363 ucontrol->value.integer.value[0] = 2;
3364 break;
3365 case SAMPLING_RATE_16KHZ:
3366 ucontrol->value.integer.value[0] = 1;
3367 break;
3368 case SAMPLING_RATE_8KHZ:
3369 default:
3370 ucontrol->value.integer.value[0] = 0;
3371 break;
3372 }
3373 pr_debug("%s: sample rate = %d\n", __func__,
3374 slim_rx_cfg[SLIM_RX_7].sample_rate);
3375
3376 return 0;
3377}
3378
3379static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol,
3380 struct snd_ctl_elem_value *ucontrol)
3381{
3382 switch (ucontrol->value.integer.value[0]) {
3383 case 1:
3384 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
3385 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
3386 break;
3387 case 2:
3388 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3389 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3390 break;
3391 case 3:
3392 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
3393 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
3394 break;
3395 case 4:
3396 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3397 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3398 break;
3399 case 5:
3400 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
3401 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
3402 break;
3403 case 0:
3404 default:
3405 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
3406 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
3407 break;
3408 }
3409 pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n",
3410 __func__,
3411 slim_rx_cfg[SLIM_RX_7].sample_rate,
3412 slim_tx_cfg[SLIM_TX_7].sample_rate,
3413 ucontrol->value.enumerated.item[0]);
3414
3415 return 0;
3416}
3417
3418static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol,
3419 struct snd_ctl_elem_value *ucontrol)
3420{
3421 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
3422 case SAMPLING_RATE_96KHZ:
3423 ucontrol->value.integer.value[0] = 5;
3424 break;
3425 case SAMPLING_RATE_88P2KHZ:
3426 ucontrol->value.integer.value[0] = 4;
3427 break;
3428 case SAMPLING_RATE_48KHZ:
3429 ucontrol->value.integer.value[0] = 3;
3430 break;
3431 case SAMPLING_RATE_44P1KHZ:
3432 ucontrol->value.integer.value[0] = 2;
3433 break;
3434 case SAMPLING_RATE_16KHZ:
3435 ucontrol->value.integer.value[0] = 1;
3436 break;
3437 case SAMPLING_RATE_8KHZ:
3438 default:
3439 ucontrol->value.integer.value[0] = 0;
3440 break;
3441 }
3442 pr_debug("%s: sample rate rx = %d\n", __func__,
3443 slim_rx_cfg[SLIM_RX_7].sample_rate);
3444
3445 return 0;
3446}
3447
3448static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol,
3449 struct snd_ctl_elem_value *ucontrol)
3450{
3451 switch (ucontrol->value.integer.value[0]) {
3452 case 1:
3453 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
3454 break;
3455 case 2:
3456 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3457 break;
3458 case 3:
3459 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
3460 break;
3461 case 4:
3462 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3463 break;
3464 case 5:
3465 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
3466 break;
3467 case 0:
3468 default:
3469 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
3470 break;
3471 }
3472 pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n",
3473 __func__,
3474 slim_rx_cfg[SLIM_RX_7].sample_rate,
3475 ucontrol->value.enumerated.item[0]);
3476
3477 return 0;
3478}
3479
3480static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol,
3481 struct snd_ctl_elem_value *ucontrol)
3482{
3483 switch (slim_tx_cfg[SLIM_TX_7].sample_rate) {
3484 case SAMPLING_RATE_96KHZ:
3485 ucontrol->value.integer.value[0] = 5;
3486 break;
3487 case SAMPLING_RATE_88P2KHZ:
3488 ucontrol->value.integer.value[0] = 4;
3489 break;
3490 case SAMPLING_RATE_48KHZ:
3491 ucontrol->value.integer.value[0] = 3;
3492 break;
3493 case SAMPLING_RATE_44P1KHZ:
3494 ucontrol->value.integer.value[0] = 2;
3495 break;
3496 case SAMPLING_RATE_16KHZ:
3497 ucontrol->value.integer.value[0] = 1;
3498 break;
3499 case SAMPLING_RATE_8KHZ:
3500 default:
3501 ucontrol->value.integer.value[0] = 0;
3502 break;
3503 }
3504 pr_debug("%s: sample rate tx = %d\n", __func__,
3505 slim_tx_cfg[SLIM_TX_7].sample_rate);
3506
3507 return 0;
3508}
3509
3510static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol,
3511 struct snd_ctl_elem_value *ucontrol)
3512{
3513 switch (ucontrol->value.integer.value[0]) {
3514 case 1:
3515 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
3516 break;
3517 case 2:
3518 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3519 break;
3520 case 3:
3521 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
3522 break;
3523 case 4:
3524 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3525 break;
3526 case 5:
3527 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
3528 break;
3529 case 0:
3530 default:
3531 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
3532 break;
3533 }
3534 pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n",
3535 __func__,
3536 slim_tx_cfg[SLIM_TX_7].sample_rate,
3537 ucontrol->value.enumerated.item[0]);
3538
3539 return 0;
3540}
3541
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003542static const struct snd_kcontrol_new msm_int_snd_controls[] = {
3543 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs,
3544 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3545 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs,
3546 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3547 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Channels", rx_cdc_dma_rx_0_chs,
3548 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3549 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Channels", rx_cdc_dma_rx_1_chs,
3550 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3551 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Channels", rx_cdc_dma_rx_2_chs,
3552 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3553 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Channels", rx_cdc_dma_rx_3_chs,
3554 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3555 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Channels", rx_cdc_dma_rx_5_chs,
3556 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3557 SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs,
3558 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3559 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs,
3560 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3561 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs,
3562 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3563 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Channels", tx_cdc_dma_tx_0_chs,
3564 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3565 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Channels", tx_cdc_dma_tx_3_chs,
3566 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3567 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Channels", tx_cdc_dma_tx_4_chs,
3568 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003569 SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Channels", va_cdc_dma_tx_0_chs,
3570 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3571 SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Channels", va_cdc_dma_tx_1_chs,
3572 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3573 SOC_ENUM_EXT("VA_CDC_DMA_TX_2 Channels", va_cdc_dma_tx_2_chs,
3574 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003575 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format,
3576 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3577 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format,
3578 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003579 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format,
3580 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3581 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format,
3582 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3583 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Format", tx_cdc_dma_tx_0_format,
3584 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3585 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Format", tx_cdc_dma_tx_3_format,
3586 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3587 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Format", tx_cdc_dma_tx_4_format,
3588 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003589 SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Format", va_cdc_dma_tx_0_format,
3590 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3591 SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Format", va_cdc_dma_tx_1_format,
3592 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3593 SOC_ENUM_EXT("VA_CDC_DMA_TX_2 Format", va_cdc_dma_tx_2_format,
3594 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003595 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate",
3596 wsa_cdc_dma_rx_0_sample_rate,
3597 cdc_dma_rx_sample_rate_get,
3598 cdc_dma_rx_sample_rate_put),
3599 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate",
3600 wsa_cdc_dma_rx_1_sample_rate,
3601 cdc_dma_rx_sample_rate_get,
3602 cdc_dma_rx_sample_rate_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003603 SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate",
3604 wsa_cdc_dma_tx_0_sample_rate,
3605 cdc_dma_tx_sample_rate_get,
3606 cdc_dma_tx_sample_rate_put),
3607 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate",
3608 wsa_cdc_dma_tx_1_sample_rate,
3609 cdc_dma_tx_sample_rate_get,
3610 cdc_dma_tx_sample_rate_put),
3611 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate",
3612 wsa_cdc_dma_tx_2_sample_rate,
3613 cdc_dma_tx_sample_rate_get,
3614 cdc_dma_tx_sample_rate_put),
3615 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 SampleRate",
3616 tx_cdc_dma_tx_0_sample_rate,
3617 cdc_dma_tx_sample_rate_get,
3618 cdc_dma_tx_sample_rate_put),
3619 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate",
3620 tx_cdc_dma_tx_3_sample_rate,
3621 cdc_dma_tx_sample_rate_get,
3622 cdc_dma_tx_sample_rate_put),
3623 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate",
3624 tx_cdc_dma_tx_4_sample_rate,
3625 cdc_dma_tx_sample_rate_get,
3626 cdc_dma_tx_sample_rate_put),
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003627 SOC_ENUM_EXT("VA_CDC_DMA_TX_0 SampleRate",
3628 va_cdc_dma_tx_0_sample_rate,
3629 cdc_dma_tx_sample_rate_get,
3630 cdc_dma_tx_sample_rate_put),
3631 SOC_ENUM_EXT("VA_CDC_DMA_TX_1 SampleRate",
3632 va_cdc_dma_tx_1_sample_rate,
3633 cdc_dma_tx_sample_rate_get,
3634 cdc_dma_tx_sample_rate_put),
3635 SOC_ENUM_EXT("VA_CDC_DMA_TX_2 SampleRate",
3636 va_cdc_dma_tx_2_sample_rate,
3637 cdc_dma_tx_sample_rate_get,
3638 cdc_dma_tx_sample_rate_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003639};
3640
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -07003641static const struct snd_kcontrol_new msm_int_wcd9380_snd_controls[] = {
3642 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc80_dma_rx_0_format,
3643 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3644 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc80_dma_rx_1_format,
3645 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3646 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc80_dma_rx_2_format,
3647 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3648 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc80_dma_rx_3_format,
3649 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3650 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc80_dma_rx_5_format,
3651 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3652 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate",
3653 rx_cdc80_dma_rx_0_sample_rate,
3654 cdc_dma_rx_sample_rate_get,
3655 cdc_dma_rx_sample_rate_put),
3656 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate",
3657 rx_cdc80_dma_rx_1_sample_rate,
3658 cdc_dma_rx_sample_rate_get,
3659 cdc_dma_rx_sample_rate_put),
3660 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate",
3661 rx_cdc80_dma_rx_2_sample_rate,
3662 cdc_dma_rx_sample_rate_get,
3663 cdc_dma_rx_sample_rate_put),
3664 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate",
3665 rx_cdc80_dma_rx_3_sample_rate,
3666 cdc_dma_rx_sample_rate_get,
3667 cdc_dma_rx_sample_rate_put),
3668 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate",
3669 rx_cdc80_dma_rx_5_sample_rate,
3670 cdc_dma_rx_sample_rate_get,
3671 cdc_dma_rx_sample_rate_put),
3672};
3673
3674static const struct snd_kcontrol_new msm_int_wcd9385_snd_controls[] = {
3675 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc85_dma_rx_0_format,
3676 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3677 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc85_dma_rx_1_format,
3678 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3679 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc85_dma_rx_2_format,
3680 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3681 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc85_dma_rx_3_format,
3682 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3683 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc85_dma_rx_5_format,
3684 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3685 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate",
3686 rx_cdc85_dma_rx_0_sample_rate,
3687 cdc_dma_rx_sample_rate_get,
3688 cdc_dma_rx_sample_rate_put),
3689 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate",
3690 rx_cdc85_dma_rx_1_sample_rate,
3691 cdc_dma_rx_sample_rate_get,
3692 cdc_dma_rx_sample_rate_put),
3693 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate",
3694 rx_cdc85_dma_rx_2_sample_rate,
3695 cdc_dma_rx_sample_rate_get,
3696 cdc_dma_rx_sample_rate_put),
3697 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate",
3698 rx_cdc85_dma_rx_3_sample_rate,
3699 cdc_dma_rx_sample_rate_get,
3700 cdc_dma_rx_sample_rate_put),
3701 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate",
3702 rx_cdc85_dma_rx_5_sample_rate,
3703 cdc_dma_rx_sample_rate_get,
3704 cdc_dma_rx_sample_rate_put),
3705};
3706
Kunlei Zhangf61a2312020-02-11 15:37:03 +08003707static const struct snd_kcontrol_new msm_int_wcd937x_snd_controls[] = {
3708 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc_dma_rx_0_format,
3709 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3710 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc_dma_rx_1_format,
3711 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3712 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc_dma_rx_2_format,
3713 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3714 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc_dma_rx_3_format,
3715 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3716 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc_dma_rx_5_format,
3717 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3718 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate",
3719 rx_cdc_dma_rx_0_sample_rate,
3720 cdc_dma_rx_sample_rate_get,
3721 cdc_dma_rx_sample_rate_put),
3722 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate",
3723 rx_cdc_dma_rx_1_sample_rate,
3724 cdc_dma_rx_sample_rate_get,
3725 cdc_dma_rx_sample_rate_put),
3726 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate",
3727 rx_cdc_dma_rx_2_sample_rate,
3728 cdc_dma_rx_sample_rate_get,
3729 cdc_dma_rx_sample_rate_put),
3730 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate",
3731 rx_cdc_dma_rx_3_sample_rate,
3732 cdc_dma_rx_sample_rate_get,
3733 cdc_dma_rx_sample_rate_put),
3734 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate",
3735 rx_cdc_dma_rx_5_sample_rate,
3736 cdc_dma_rx_sample_rate_get,
3737 cdc_dma_rx_sample_rate_put),
3738};
3739
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003740static const struct snd_kcontrol_new msm_common_snd_controls[] = {
3741 SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate,
3742 usb_audio_rx_sample_rate_get,
3743 usb_audio_rx_sample_rate_put),
3744 SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate,
3745 usb_audio_tx_sample_rate_get,
3746 usb_audio_tx_sample_rate_put),
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05303747 SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
3748 usb_audio_rx_format_get, usb_audio_rx_format_put),
3749 SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
3750 usb_audio_tx_format_get, usb_audio_tx_format_put),
3751 SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
3752 usb_audio_rx_ch_get, usb_audio_rx_ch_put),
3753 SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
3754 usb_audio_tx_ch_get, usb_audio_tx_ch_put),
3755 SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs,
3756 proxy_rx_ch_get, proxy_rx_ch_put),
3757 SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
3758 ext_disp_rx_ch_get, ext_disp_rx_ch_put),
3759 SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
3760 ext_disp_rx_format_get, ext_disp_rx_format_put),
3761 SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate,
3762 ext_disp_rx_sample_rate_get,
3763 ext_disp_rx_sample_rate_put),
3764 SOC_ENUM_EXT("Display Port1 RX Channels", ext_disp_rx_chs,
3765 ext_disp_rx_ch_get, ext_disp_rx_ch_put),
3766 SOC_ENUM_EXT("Display Port1 RX Bit Format", ext_disp_rx_format,
3767 ext_disp_rx_format_get, ext_disp_rx_format_put),
3768 SOC_ENUM_EXT("Display Port1 RX SampleRate", ext_disp_rx_sample_rate,
3769 ext_disp_rx_sample_rate_get,
3770 ext_disp_rx_sample_rate_put),
3771 SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
3772 msm_bt_sample_rate_get,
3773 msm_bt_sample_rate_put),
3774 SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
3775 msm_bt_sample_rate_rx_get,
3776 msm_bt_sample_rate_rx_put),
3777 SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
3778 msm_bt_sample_rate_tx_get,
3779 msm_bt_sample_rate_tx_put),
3780 SOC_ENUM_EXT("AFE_LOOPBACK_TX Channels", afe_loopback_tx_chs,
3781 afe_loopback_tx_ch_get, afe_loopback_tx_ch_put),
3782 SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs,
3783 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
3784};
3785
3786static const struct snd_kcontrol_new msm_tdm_snd_controls[] = {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003787 SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3788 tdm_rx_sample_rate_get,
3789 tdm_rx_sample_rate_put),
3790 SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3791 tdm_rx_sample_rate_get,
3792 tdm_rx_sample_rate_put),
3793 SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3794 tdm_rx_sample_rate_get,
3795 tdm_rx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003796 SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3797 tdm_rx_sample_rate_get,
3798 tdm_rx_sample_rate_put),
3799 SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3800 tdm_rx_sample_rate_get,
3801 tdm_rx_sample_rate_put),
3802 SOC_ENUM_EXT("SEN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3803 tdm_rx_sample_rate_get,
3804 tdm_rx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003805 SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3806 tdm_tx_sample_rate_get,
3807 tdm_tx_sample_rate_put),
3808 SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3809 tdm_tx_sample_rate_get,
3810 tdm_tx_sample_rate_put),
3811 SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3812 tdm_tx_sample_rate_get,
3813 tdm_tx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003814 SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3815 tdm_tx_sample_rate_get,
3816 tdm_tx_sample_rate_put),
3817 SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3818 tdm_tx_sample_rate_get,
3819 tdm_tx_sample_rate_put),
3820 SOC_ENUM_EXT("SEN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3821 tdm_tx_sample_rate_get,
3822 tdm_tx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003823 SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format,
3824 tdm_rx_format_get,
3825 tdm_rx_format_put),
3826 SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format,
3827 tdm_rx_format_get,
3828 tdm_rx_format_put),
3829 SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format,
3830 tdm_rx_format_get,
3831 tdm_rx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003832 SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format,
3833 tdm_rx_format_get,
3834 tdm_rx_format_put),
3835 SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format,
3836 tdm_rx_format_get,
3837 tdm_rx_format_put),
3838 SOC_ENUM_EXT("SEN_TDM_RX_0 Format", tdm_rx_format,
3839 tdm_rx_format_get,
3840 tdm_rx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003841 SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format,
3842 tdm_tx_format_get,
3843 tdm_tx_format_put),
3844 SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format,
3845 tdm_tx_format_get,
3846 tdm_tx_format_put),
3847 SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format,
3848 tdm_tx_format_get,
3849 tdm_tx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003850 SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format,
3851 tdm_tx_format_get,
3852 tdm_tx_format_put),
3853 SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format,
3854 tdm_tx_format_get,
3855 tdm_tx_format_put),
3856 SOC_ENUM_EXT("SEN_TDM_TX_0 Format", tdm_tx_format,
3857 tdm_tx_format_get,
3858 tdm_tx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003859 SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs,
3860 tdm_rx_ch_get,
3861 tdm_rx_ch_put),
3862 SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs,
3863 tdm_rx_ch_get,
3864 tdm_rx_ch_put),
3865 SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs,
3866 tdm_rx_ch_get,
3867 tdm_rx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003868 SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs,
3869 tdm_rx_ch_get,
3870 tdm_rx_ch_put),
3871 SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs,
3872 tdm_rx_ch_get,
3873 tdm_rx_ch_put),
3874 SOC_ENUM_EXT("SEN_TDM_RX_0 Channels", tdm_rx_chs,
3875 tdm_rx_ch_get,
3876 tdm_rx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003877 SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs,
3878 tdm_tx_ch_get,
3879 tdm_tx_ch_put),
3880 SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs,
3881 tdm_tx_ch_get,
3882 tdm_tx_ch_put),
3883 SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs,
3884 tdm_tx_ch_get,
3885 tdm_tx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003886 SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs,
3887 tdm_tx_ch_get,
3888 tdm_tx_ch_put),
3889 SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs,
3890 tdm_tx_ch_get,
3891 tdm_tx_ch_put),
3892 SOC_ENUM_EXT("SEN_TDM_TX_0 Channels", tdm_tx_chs,
3893 tdm_tx_ch_get,
3894 tdm_tx_ch_put),
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05303895 SOC_SINGLE_MULTI_EXT("TDM Slot Map", SND_SOC_NOPM, 0, 255, 0,
3896 TDM_MAX_SLOTS + MAX_PATH, NULL, tdm_slot_map_put),
3897};
3898
3899static const struct snd_kcontrol_new msm_auxpcm_snd_controls[] = {
3900 SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
3901 aux_pcm_rx_sample_rate_get,
3902 aux_pcm_rx_sample_rate_put),
3903 SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate,
3904 aux_pcm_rx_sample_rate_get,
3905 aux_pcm_rx_sample_rate_put),
3906 SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
3907 aux_pcm_rx_sample_rate_get,
3908 aux_pcm_rx_sample_rate_put),
3909 SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
3910 aux_pcm_rx_sample_rate_get,
3911 aux_pcm_rx_sample_rate_put),
3912 SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate,
3913 aux_pcm_rx_sample_rate_get,
3914 aux_pcm_rx_sample_rate_put),
3915 SOC_ENUM_EXT("SEN_AUX_PCM_RX SampleRate", sen_aux_pcm_rx_sample_rate,
3916 aux_pcm_rx_sample_rate_get,
3917 aux_pcm_rx_sample_rate_put),
3918 SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
3919 aux_pcm_tx_sample_rate_get,
3920 aux_pcm_tx_sample_rate_put),
3921 SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate,
3922 aux_pcm_tx_sample_rate_get,
3923 aux_pcm_tx_sample_rate_put),
3924 SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
3925 aux_pcm_tx_sample_rate_get,
3926 aux_pcm_tx_sample_rate_put),
3927 SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
3928 aux_pcm_tx_sample_rate_get,
3929 aux_pcm_tx_sample_rate_put),
3930 SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate,
3931 aux_pcm_tx_sample_rate_get,
3932 aux_pcm_tx_sample_rate_put),
3933 SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate,
3934 aux_pcm_tx_sample_rate_get,
3935 aux_pcm_tx_sample_rate_put),
3936 SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
3937 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3938 SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format,
3939 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3940 SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format,
3941 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3942 SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format,
3943 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3944 SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format,
3945 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3946 SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format,
3947 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3948 SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
3949 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3950 SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format,
3951 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3952 SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format,
3953 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3954 SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format,
3955 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3956 SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
3957 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3958 SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format,
3959 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3960};
3961
3962static const struct snd_kcontrol_new msm_mi2s_snd_controls[] = {
3963 SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
3964 mi2s_rx_sample_rate_get,
3965 mi2s_rx_sample_rate_put),
3966 SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate,
3967 mi2s_rx_sample_rate_get,
3968 mi2s_rx_sample_rate_put),
3969 SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
3970 mi2s_rx_sample_rate_get,
3971 mi2s_rx_sample_rate_put),
3972 SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
3973 mi2s_rx_sample_rate_get,
3974 mi2s_rx_sample_rate_put),
3975 SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate,
3976 mi2s_rx_sample_rate_get,
3977 mi2s_rx_sample_rate_put),
3978 SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate,
3979 mi2s_rx_sample_rate_get,
3980 mi2s_rx_sample_rate_put),
3981 SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
3982 mi2s_tx_sample_rate_get,
3983 mi2s_tx_sample_rate_put),
3984 SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate,
3985 mi2s_tx_sample_rate_get,
3986 mi2s_tx_sample_rate_put),
3987 SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
3988 mi2s_tx_sample_rate_get,
3989 mi2s_tx_sample_rate_put),
3990 SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
3991 mi2s_tx_sample_rate_get,
3992 mi2s_tx_sample_rate_put),
3993 SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate,
3994 mi2s_tx_sample_rate_get,
3995 mi2s_tx_sample_rate_put),
3996 SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate,
3997 mi2s_tx_sample_rate_get,
3998 mi2s_tx_sample_rate_put),
3999 SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
4000 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
4001 SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
4002 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
4003 SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
4004 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
4005 SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
4006 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
4007 SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format,
4008 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
4009 SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format,
4010 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
4011 SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
4012 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
4013 SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
4014 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
4015 SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
4016 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
4017 SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
4018 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
4019 SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format,
4020 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
4021 SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format,
4022 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004023 SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs,
4024 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
4025 SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs,
4026 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
4027 SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs,
4028 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004029 SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs,
4030 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
4031 SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs,
4032 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
4033 SOC_ENUM_EXT("SEN_MI2S_RX Channels", sen_mi2s_rx_chs,
4034 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004035 SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs,
4036 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
4037 SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs,
4038 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
4039 SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs,
4040 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004041 SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs,
4042 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
4043 SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs,
4044 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
4045 SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs,
4046 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004047};
4048
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07004049static const struct snd_kcontrol_new msm_snd_controls[] = {
4050 SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
4051 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
4052 SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
4053 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
4054 SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
4055 aux_pcm_rx_sample_rate_get,
4056 aux_pcm_rx_sample_rate_put),
4057 SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
4058 aux_pcm_tx_sample_rate_get,
4059 aux_pcm_tx_sample_rate_put),
4060};
4061
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004062static int msm_ext_disp_get_idx_from_beid(int32_t be_id)
4063{
4064 int idx;
4065
4066 switch (be_id) {
4067 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
4068 idx = EXT_DISP_RX_IDX_DP;
4069 break;
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -07004070 case MSM_BACKEND_DAI_DISPLAY_PORT_RX_1:
4071 idx = EXT_DISP_RX_IDX_DP1;
4072 break;
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004073 default:
4074 pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id);
4075 idx = -EINVAL;
4076 break;
4077 }
4078
4079 return idx;
4080}
4081
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07004082static int kona_send_island_va_config(int32_t be_id)
4083{
4084 int rc = 0;
4085 int port_id = 0xFFFF;
4086
4087 port_id = msm_get_port_id(be_id);
4088 if (port_id < 0) {
4089 pr_err("%s: Invalid island interface, be_id: %d\n",
4090 __func__, be_id);
4091 rc = -EINVAL;
4092 } else {
4093 /*
4094 * send island mode config
4095 * This should be the first configuration
4096 */
4097 rc = afe_send_port_island_mode(port_id);
4098 if (rc)
4099 pr_err("%s: afe send island mode failed %d\n",
4100 __func__, rc);
4101 }
4102
4103 return rc;
4104}
4105
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004106static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
4107 struct snd_pcm_hw_params *params)
4108{
4109 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4110 struct snd_interval *rate = hw_param_interval(params,
4111 SNDRV_PCM_HW_PARAM_RATE);
4112 struct snd_interval *channels = hw_param_interval(params,
4113 SNDRV_PCM_HW_PARAM_CHANNELS);
Meng Wange8e53822019-03-18 10:49:50 +08004114 int idx = 0, rc = 0;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004115
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004116 pr_debug("%s: dai_id= %d, format = %d, rate = %d\n",
4117 __func__, dai_link->id, params_format(params),
4118 params_rate(params));
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004119
4120 switch (dai_link->id) {
4121 case MSM_BACKEND_DAI_USB_RX:
4122 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4123 usb_rx_cfg.bit_format);
4124 rate->min = rate->max = usb_rx_cfg.sample_rate;
4125 channels->min = channels->max = usb_rx_cfg.channels;
4126 break;
4127
4128 case MSM_BACKEND_DAI_USB_TX:
4129 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4130 usb_tx_cfg.bit_format);
4131 rate->min = rate->max = usb_tx_cfg.sample_rate;
4132 channels->min = channels->max = usb_tx_cfg.channels;
4133 break;
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004134
4135 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -07004136 case MSM_BACKEND_DAI_DISPLAY_PORT_RX_1:
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004137 idx = msm_ext_disp_get_idx_from_beid(dai_link->id);
4138 if (idx < 0) {
4139 pr_err("%s: Incorrect ext disp idx %d\n",
4140 __func__, idx);
4141 rc = idx;
4142 goto done;
4143 }
4144
4145 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4146 ext_disp_rx_cfg[idx].bit_format);
4147 rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate;
4148 channels->min = channels->max = ext_disp_rx_cfg[idx].channels;
4149 break;
4150
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004151 case MSM_BACKEND_DAI_AFE_PCM_RX:
4152 channels->min = channels->max = proxy_rx_cfg.channels;
4153 rate->min = rate->max = SAMPLING_RATE_48KHZ;
4154 break;
4155
4156 case MSM_BACKEND_DAI_PRI_TDM_RX_0:
4157 channels->min = channels->max =
4158 tdm_rx_cfg[TDM_PRI][TDM_0].channels;
4159 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4160 tdm_rx_cfg[TDM_PRI][TDM_0].bit_format);
4161 rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate;
4162 break;
4163
4164 case MSM_BACKEND_DAI_PRI_TDM_TX_0:
4165 channels->min = channels->max =
4166 tdm_tx_cfg[TDM_PRI][TDM_0].channels;
4167 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4168 tdm_tx_cfg[TDM_PRI][TDM_0].bit_format);
4169 rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate;
4170 break;
4171
4172 case MSM_BACKEND_DAI_SEC_TDM_RX_0:
4173 channels->min = channels->max =
4174 tdm_rx_cfg[TDM_SEC][TDM_0].channels;
4175 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4176 tdm_rx_cfg[TDM_SEC][TDM_0].bit_format);
4177 rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate;
4178 break;
4179
4180 case MSM_BACKEND_DAI_SEC_TDM_TX_0:
4181 channels->min = channels->max =
4182 tdm_tx_cfg[TDM_SEC][TDM_0].channels;
4183 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4184 tdm_tx_cfg[TDM_SEC][TDM_0].bit_format);
4185 rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate;
4186 break;
4187
4188 case MSM_BACKEND_DAI_TERT_TDM_RX_0:
4189 channels->min = channels->max =
4190 tdm_rx_cfg[TDM_TERT][TDM_0].channels;
4191 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4192 tdm_rx_cfg[TDM_TERT][TDM_0].bit_format);
4193 rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate;
4194 break;
4195
4196 case MSM_BACKEND_DAI_TERT_TDM_TX_0:
4197 channels->min = channels->max =
4198 tdm_tx_cfg[TDM_TERT][TDM_0].channels;
4199 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4200 tdm_tx_cfg[TDM_TERT][TDM_0].bit_format);
4201 rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate;
4202 break;
4203
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004204 case MSM_BACKEND_DAI_QUAT_TDM_RX_0:
4205 channels->min = channels->max =
4206 tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
4207 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4208 tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format);
4209 rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate;
4210 break;
4211
4212 case MSM_BACKEND_DAI_QUAT_TDM_TX_0:
4213 channels->min = channels->max =
4214 tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
4215 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4216 tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format);
4217 rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate;
4218 break;
4219
4220 case MSM_BACKEND_DAI_QUIN_TDM_RX_0:
4221 channels->min = channels->max =
4222 tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
4223 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4224 tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format);
4225 rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate;
4226 break;
4227
4228 case MSM_BACKEND_DAI_QUIN_TDM_TX_0:
4229 channels->min = channels->max =
4230 tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
4231 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4232 tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format);
4233 rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate;
4234 break;
4235
4236 case MSM_BACKEND_DAI_SEN_TDM_RX_0:
4237 channels->min = channels->max =
4238 tdm_rx_cfg[TDM_SEN][TDM_0].channels;
4239 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4240 tdm_rx_cfg[TDM_SEN][TDM_0].bit_format);
4241 rate->min = rate->max = tdm_rx_cfg[TDM_SEN][TDM_0].sample_rate;
4242 break;
4243
4244 case MSM_BACKEND_DAI_SEN_TDM_TX_0:
4245 channels->min = channels->max =
4246 tdm_tx_cfg[TDM_SEN][TDM_0].channels;
4247 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4248 tdm_tx_cfg[TDM_SEN][TDM_0].bit_format);
4249 rate->min = rate->max = tdm_tx_cfg[TDM_SEN][TDM_0].sample_rate;
4250 break;
4251
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004252 case MSM_BACKEND_DAI_AUXPCM_RX:
4253 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4254 aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format);
4255 rate->min = rate->max =
4256 aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate;
4257 channels->min = channels->max =
4258 aux_pcm_rx_cfg[PRIM_AUX_PCM].channels;
4259 break;
4260
4261 case MSM_BACKEND_DAI_AUXPCM_TX:
4262 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4263 aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format);
4264 rate->min = rate->max =
4265 aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate;
4266 channels->min = channels->max =
4267 aux_pcm_tx_cfg[PRIM_AUX_PCM].channels;
4268 break;
4269
4270 case MSM_BACKEND_DAI_SEC_AUXPCM_RX:
4271 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4272 aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format);
4273 rate->min = rate->max =
4274 aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate;
4275 channels->min = channels->max =
4276 aux_pcm_rx_cfg[SEC_AUX_PCM].channels;
4277 break;
4278
4279 case MSM_BACKEND_DAI_SEC_AUXPCM_TX:
4280 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4281 aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format);
4282 rate->min = rate->max =
4283 aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate;
4284 channels->min = channels->max =
4285 aux_pcm_tx_cfg[SEC_AUX_PCM].channels;
4286 break;
4287
4288 case MSM_BACKEND_DAI_TERT_AUXPCM_RX:
4289 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4290 aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format);
4291 rate->min = rate->max =
4292 aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate;
4293 channels->min = channels->max =
4294 aux_pcm_rx_cfg[TERT_AUX_PCM].channels;
4295 break;
4296
4297 case MSM_BACKEND_DAI_TERT_AUXPCM_TX:
4298 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4299 aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format);
4300 rate->min = rate->max =
4301 aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate;
4302 channels->min = channels->max =
4303 aux_pcm_tx_cfg[TERT_AUX_PCM].channels;
4304 break;
4305
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004306 case MSM_BACKEND_DAI_QUAT_AUXPCM_RX:
4307 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4308 aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format);
4309 rate->min = rate->max =
4310 aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate;
4311 channels->min = channels->max =
4312 aux_pcm_rx_cfg[QUAT_AUX_PCM].channels;
4313 break;
4314
4315 case MSM_BACKEND_DAI_QUAT_AUXPCM_TX:
4316 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4317 aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format);
4318 rate->min = rate->max =
4319 aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate;
4320 channels->min = channels->max =
4321 aux_pcm_tx_cfg[QUAT_AUX_PCM].channels;
4322 break;
4323
4324 case MSM_BACKEND_DAI_QUIN_AUXPCM_RX:
4325 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4326 aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format);
4327 rate->min = rate->max =
4328 aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate;
4329 channels->min = channels->max =
4330 aux_pcm_rx_cfg[QUIN_AUX_PCM].channels;
4331 break;
4332
4333 case MSM_BACKEND_DAI_QUIN_AUXPCM_TX:
4334 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4335 aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format);
4336 rate->min = rate->max =
4337 aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate;
4338 channels->min = channels->max =
4339 aux_pcm_tx_cfg[QUIN_AUX_PCM].channels;
4340 break;
4341
4342 case MSM_BACKEND_DAI_SEN_AUXPCM_RX:
4343 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4344 aux_pcm_rx_cfg[SEN_AUX_PCM].bit_format);
4345 rate->min = rate->max =
4346 aux_pcm_rx_cfg[SEN_AUX_PCM].sample_rate;
4347 channels->min = channels->max =
4348 aux_pcm_rx_cfg[SEN_AUX_PCM].channels;
4349 break;
4350
4351 case MSM_BACKEND_DAI_SEN_AUXPCM_TX:
4352 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4353 aux_pcm_tx_cfg[SEN_AUX_PCM].bit_format);
4354 rate->min = rate->max =
4355 aux_pcm_tx_cfg[SEN_AUX_PCM].sample_rate;
4356 channels->min = channels->max =
4357 aux_pcm_tx_cfg[SEN_AUX_PCM].channels;
4358 break;
4359
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004360 case MSM_BACKEND_DAI_PRI_MI2S_RX:
4361 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4362 mi2s_rx_cfg[PRIM_MI2S].bit_format);
4363 rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate;
4364 channels->min = channels->max =
4365 mi2s_rx_cfg[PRIM_MI2S].channels;
4366 break;
4367
4368 case MSM_BACKEND_DAI_PRI_MI2S_TX:
4369 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4370 mi2s_tx_cfg[PRIM_MI2S].bit_format);
4371 rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate;
4372 channels->min = channels->max =
4373 mi2s_tx_cfg[PRIM_MI2S].channels;
4374 break;
4375
4376 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
4377 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4378 mi2s_rx_cfg[SEC_MI2S].bit_format);
4379 rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate;
4380 channels->min = channels->max =
4381 mi2s_rx_cfg[SEC_MI2S].channels;
4382 break;
4383
4384 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
4385 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4386 mi2s_tx_cfg[SEC_MI2S].bit_format);
4387 rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate;
4388 channels->min = channels->max =
4389 mi2s_tx_cfg[SEC_MI2S].channels;
4390 break;
4391
4392 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
4393 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4394 mi2s_rx_cfg[TERT_MI2S].bit_format);
4395 rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate;
4396 channels->min = channels->max =
4397 mi2s_rx_cfg[TERT_MI2S].channels;
4398 break;
4399
4400 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
4401 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4402 mi2s_tx_cfg[TERT_MI2S].bit_format);
4403 rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate;
4404 channels->min = channels->max =
4405 mi2s_tx_cfg[TERT_MI2S].channels;
4406 break;
4407
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004408 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
4409 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4410 mi2s_rx_cfg[QUAT_MI2S].bit_format);
4411 rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate;
4412 channels->min = channels->max =
4413 mi2s_rx_cfg[QUAT_MI2S].channels;
4414 break;
4415
4416 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
4417 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4418 mi2s_tx_cfg[QUAT_MI2S].bit_format);
4419 rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate;
4420 channels->min = channels->max =
4421 mi2s_tx_cfg[QUAT_MI2S].channels;
4422 break;
4423
4424 case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
4425 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4426 mi2s_rx_cfg[QUIN_MI2S].bit_format);
4427 rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate;
4428 channels->min = channels->max =
4429 mi2s_rx_cfg[QUIN_MI2S].channels;
4430 break;
4431
4432 case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
4433 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4434 mi2s_tx_cfg[QUIN_MI2S].bit_format);
4435 rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate;
4436 channels->min = channels->max =
4437 mi2s_tx_cfg[QUIN_MI2S].channels;
4438 break;
4439
4440 case MSM_BACKEND_DAI_SENARY_MI2S_RX:
4441 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4442 mi2s_rx_cfg[SEN_MI2S].bit_format);
4443 rate->min = rate->max = mi2s_rx_cfg[SEN_MI2S].sample_rate;
4444 channels->min = channels->max =
4445 mi2s_rx_cfg[SEN_MI2S].channels;
4446 break;
4447
4448 case MSM_BACKEND_DAI_SENARY_MI2S_TX:
4449 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4450 mi2s_tx_cfg[SEN_MI2S].bit_format);
4451 rate->min = rate->max = mi2s_tx_cfg[SEN_MI2S].sample_rate;
4452 channels->min = channels->max =
4453 mi2s_tx_cfg[SEN_MI2S].channels;
4454 break;
4455
Meng Wang574f4942019-02-18 12:59:41 +08004456 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
4457 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
4458 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
4459 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
4460 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
4461 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
4462 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4463 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4464 cdc_dma_rx_cfg[idx].bit_format);
4465 rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate;
4466 channels->min = channels->max = cdc_dma_rx_cfg[idx].channels;
4467 break;
4468
4469 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
4470 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
4471 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
4472 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
4473 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08004474 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
4475 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
4476 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
4477 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4478 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
Meng Wang574f4942019-02-18 12:59:41 +08004479 cdc_dma_tx_cfg[idx].bit_format);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08004480 rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate;
4481 channels->min = channels->max = cdc_dma_tx_cfg[idx].channels;
4482 break;
4483
Meng Wang574f4942019-02-18 12:59:41 +08004484 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
Vangala, Amarnath1b9c7892020-05-08 17:59:02 +05304485 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
Meng Wang574f4942019-02-18 12:59:41 +08004486 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4487 SNDRV_PCM_FORMAT_S32_LE);
Vangala, Amarnath1b9c7892020-05-08 17:59:02 +05304488 rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate;
Meng Wang574f4942019-02-18 12:59:41 +08004489 channels->min = channels->max = msm_vi_feed_tx_ch;
4490 break;
4491
Banajit Goswami83a370d2019-03-05 16:15:21 -08004492 case MSM_BACKEND_DAI_SLIMBUS_7_RX:
4493 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4494 slim_rx_cfg[SLIM_RX_7].bit_format);
4495 rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate;
4496 channels->min = channels->max =
4497 slim_rx_cfg[SLIM_RX_7].channels;
4498 break;
4499
4500 case MSM_BACKEND_DAI_SLIMBUS_7_TX:
Prasad Kumpatlad7df1232019-11-29 19:39:17 +05304501 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4502 slim_tx_cfg[SLIM_TX_7].bit_format);
Banajit Goswami83a370d2019-03-05 16:15:21 -08004503 rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate;
4504 channels->min = channels->max =
4505 slim_tx_cfg[SLIM_TX_7].channels;
4506 break;
4507
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05304508 case MSM_BACKEND_DAI_SLIMBUS_8_TX:
4509 rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate;
4510 channels->min = channels->max =
4511 slim_tx_cfg[SLIM_TX_8].channels;
4512 break;
4513
Meng Wange8e53822019-03-18 10:49:50 +08004514 case MSM_BACKEND_DAI_AFE_LOOPBACK_TX:
4515 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4516 afe_loopback_tx_cfg[idx].bit_format);
4517 rate->min = rate->max = afe_loopback_tx_cfg[idx].sample_rate;
4518 channels->min = channels->max =
4519 afe_loopback_tx_cfg[idx].channels;
4520 break;
4521
Meng Wang574f4942019-02-18 12:59:41 +08004522 default:
4523 rate->min = rate->max = SAMPLING_RATE_48KHZ;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004524 break;
4525 }
4526
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004527done:
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004528 return rc;
4529}
4530
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08004531static bool msm_usbc_swap_gnd_mic(struct snd_soc_component *component, bool active)
4532{
4533 struct snd_soc_card *card = component->card;
4534 struct msm_asoc_mach_data *pdata =
4535 snd_soc_card_get_drvdata(card);
4536
4537 if (!pdata->fsa_handle)
4538 return false;
4539
4540 return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP);
4541}
4542
4543static bool msm_swap_gnd_mic(struct snd_soc_component *component, bool active)
4544{
4545 int value = 0;
4546 bool ret = false;
4547 struct snd_soc_card *card;
4548 struct msm_asoc_mach_data *pdata;
4549
4550 if (!component) {
4551 pr_err("%s component is NULL\n", __func__);
4552 return false;
4553 }
4554 card = component->card;
4555 pdata = snd_soc_card_get_drvdata(card);
4556
4557 if (!pdata)
4558 return false;
4559
4560 if (wcd_mbhc_cfg.enable_usbc_analog)
4561 return msm_usbc_swap_gnd_mic(component, active);
4562
4563 /* if usbc is not defined, swap using us_euro_gpio_p */
4564 if (pdata->us_euro_gpio_p) {
4565 value = msm_cdc_pinctrl_get_state(
4566 pdata->us_euro_gpio_p);
4567 if (value)
4568 msm_cdc_pinctrl_select_sleep_state(
4569 pdata->us_euro_gpio_p);
4570 else
4571 msm_cdc_pinctrl_select_active_state(
4572 pdata->us_euro_gpio_p);
4573 dev_dbg(component->dev, "%s: swap select switch %d to %d\n",
4574 __func__, value, !value);
4575 ret = true;
4576 }
4577
4578 return ret;
4579}
4580
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004581static int kona_tdm_snd_hw_params(struct snd_pcm_substream *substream,
4582 struct snd_pcm_hw_params *params)
4583{
4584 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4585 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4586 int ret = 0;
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004587 int slot_width = TDM_SLOT_WIDTH_BITS;
4588 int channels, slots = TDM_MAX_SLOTS;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004589 unsigned int slot_mask, rate, clk_freq;
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004590 unsigned int *slot_offset;
4591 struct tdm_dev_config *config;
4592 unsigned int path_dir = 0, interface = 0, channel_interface = 0;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004593
4594 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
4595
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004596 if (cpu_dai->id < AFE_PORT_ID_TDM_PORT_RANGE_START) {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004597 pr_err("%s: dai id 0x%x not supported\n",
4598 __func__, cpu_dai->id);
4599 return -EINVAL;
4600 }
4601
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004602 /* RX or TX */
4603 path_dir = cpu_dai->id % MAX_PATH;
4604
4605 /* PRI, SEC, TERT, QUAT, QUIN, ... */
4606 interface = (cpu_dai->id - AFE_PORT_ID_TDM_PORT_RANGE_START)
4607 / (MAX_PATH * TDM_PORT_MAX);
4608
4609 /* 0, 1, 2, .. 7 */
4610 channel_interface =
4611 ((cpu_dai->id - AFE_PORT_ID_TDM_PORT_RANGE_START) / MAX_PATH)
4612 % TDM_PORT_MAX;
4613
4614 pr_debug("%s: path dir: %u, interface %u, channel interface %u\n",
4615 __func__, path_dir, interface, channel_interface);
4616
4617 config = ((struct tdm_dev_config *) tdm_cfg[interface]) +
4618 (path_dir * TDM_PORT_MAX) + channel_interface;
4619 slot_offset = config->tdm_slot_offset;
4620
4621 if (path_dir)
4622 channels = tdm_tx_cfg[interface][channel_interface].channels;
4623 else
4624 channels = tdm_rx_cfg[interface][channel_interface].channels;
4625
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004626 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4627 /*2 slot config - bits 0 and 1 set for the first two slots */
4628 slot_mask = 0x0000FFFF >> (16 - slots);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004629
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004630 pr_debug("%s: tdm rx slot_width %d slots %d slot_mask %x\n",
4631 __func__, slot_width, slots, slot_mask);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004632
4633 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
4634 slots, slot_width);
4635 if (ret < 0) {
4636 pr_err("%s: failed to set tdm rx slot, err:%d\n",
4637 __func__, ret);
4638 goto end;
4639 }
4640
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004641 pr_debug("%s: tdm rx channels: %d\n", __func__, channels);
4642
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004643 ret = snd_soc_dai_set_channel_map(cpu_dai,
4644 0, NULL, channels, slot_offset);
4645 if (ret < 0) {
4646 pr_err("%s: failed to set tdm rx channel map, err:%d\n",
4647 __func__, ret);
4648 goto end;
4649 }
4650 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
4651 /*2 slot config - bits 0 and 1 set for the first two slots */
4652 slot_mask = 0x0000FFFF >> (16 - slots);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004653
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004654 pr_debug("%s: tdm tx slot_width %d slots %d slot_mask %x\n",
4655 __func__, slot_width, slots, slot_mask);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004656
4657 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
4658 slots, slot_width);
4659 if (ret < 0) {
4660 pr_err("%s: failed to set tdm tx slot, err:%d\n",
4661 __func__, ret);
4662 goto end;
4663 }
4664
Vignesh Kulothungan2139a7d2019-08-07 12:07:20 -07004665 pr_debug("%s: tdm tx channels: %d\n", __func__, channels);
4666
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004667 ret = snd_soc_dai_set_channel_map(cpu_dai,
4668 channels, slot_offset, 0, NULL);
4669 if (ret < 0) {
4670 pr_err("%s: failed to set tdm tx channel map, err:%d\n",
4671 __func__, ret);
4672 goto end;
4673 }
4674 } else {
4675 ret = -EINVAL;
4676 pr_err("%s: invalid use case, err:%d\n",
4677 __func__, ret);
4678 goto end;
4679 }
4680
4681 rate = params_rate(params);
4682 clk_freq = rate * slot_width * slots;
4683 ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT);
4684 if (ret < 0)
4685 pr_err("%s: failed to set tdm clk, err:%d\n",
4686 __func__, ret);
4687
4688end:
4689 return ret;
4690}
4691
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004692static int msm_get_tdm_mode(u32 port_id)
4693{
4694 int tdm_mode;
4695
4696 switch (port_id) {
4697 case AFE_PORT_ID_PRIMARY_TDM_RX:
4698 case AFE_PORT_ID_PRIMARY_TDM_TX:
4699 tdm_mode = TDM_PRI;
4700 break;
4701 case AFE_PORT_ID_SECONDARY_TDM_RX:
4702 case AFE_PORT_ID_SECONDARY_TDM_TX:
4703 tdm_mode = TDM_SEC;
4704 break;
4705 case AFE_PORT_ID_TERTIARY_TDM_RX:
4706 case AFE_PORT_ID_TERTIARY_TDM_TX:
4707 tdm_mode = TDM_TERT;
4708 break;
4709 case AFE_PORT_ID_QUATERNARY_TDM_RX:
4710 case AFE_PORT_ID_QUATERNARY_TDM_TX:
4711 tdm_mode = TDM_QUAT;
4712 break;
4713 case AFE_PORT_ID_QUINARY_TDM_RX:
4714 case AFE_PORT_ID_QUINARY_TDM_TX:
4715 tdm_mode = TDM_QUIN;
4716 break;
4717 case AFE_PORT_ID_SENARY_TDM_RX:
4718 case AFE_PORT_ID_SENARY_TDM_TX:
4719 tdm_mode = TDM_SEN;
4720 break;
4721 default:
4722 pr_err("%s: Invalid port id: %d\n", __func__, port_id);
4723 tdm_mode = -EINVAL;
4724 }
4725 return tdm_mode;
4726}
4727
4728static int kona_tdm_snd_startup(struct snd_pcm_substream *substream)
4729{
4730 int ret = 0;
4731 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4732 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4733 struct snd_soc_card *card = rtd->card;
4734 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4735 int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
4736
4737 if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) {
4738 ret = -EINVAL;
4739 pr_err("%s: Invalid TDM interface %d\n",
4740 __func__, ret);
4741 return ret;
4742 }
4743
4744 if (pdata->mi2s_gpio_p[tdm_mode]) {
4745 if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode]))
4746 == 0) {
4747 ret = msm_cdc_pinctrl_select_active_state(
4748 pdata->mi2s_gpio_p[tdm_mode]);
4749 if (ret) {
4750 pr_err("%s: TDM GPIO pinctrl set active failed with %d\n",
4751 __func__, ret);
4752 goto done;
4753 }
4754 }
4755 atomic_inc(&(pdata->mi2s_gpio_ref_count[tdm_mode]));
4756 }
4757
4758done:
4759 return ret;
4760}
4761
4762static void kona_tdm_snd_shutdown(struct snd_pcm_substream *substream)
4763{
4764 int ret = 0;
4765 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4766 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4767 struct snd_soc_card *card = rtd->card;
4768 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4769 int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
4770
4771 if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) {
4772 ret = -EINVAL;
4773 pr_err("%s: Invalid TDM interface %d\n",
4774 __func__, ret);
4775 return;
4776 }
4777
4778 if (pdata->mi2s_gpio_p[tdm_mode]) {
4779 atomic_dec(&(pdata->mi2s_gpio_ref_count[tdm_mode]));
4780 if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode]))
4781 == 0) {
4782 ret = msm_cdc_pinctrl_select_sleep_state(
4783 pdata->mi2s_gpio_p[tdm_mode]);
4784 if (ret)
4785 pr_err("%s: TDM GPIO pinctrl set sleep failed with %d\n",
4786 __func__, ret);
4787 }
4788 }
4789}
4790
4791static int kona_aux_snd_startup(struct snd_pcm_substream *substream)
4792{
4793 int ret = 0;
4794 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4795 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4796 struct snd_soc_card *card = rtd->card;
4797 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4798 u32 aux_mode = cpu_dai->id - 1;
4799
4800 if (aux_mode >= AUX_PCM_MAX) {
4801 ret = -EINVAL;
4802 pr_err("%s: Invalid AUX interface %d\n",
4803 __func__, ret);
4804 return ret;
4805 }
4806
4807 if (pdata->mi2s_gpio_p[aux_mode]) {
4808 if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode]))
4809 == 0) {
4810 ret = msm_cdc_pinctrl_select_active_state(
4811 pdata->mi2s_gpio_p[aux_mode]);
4812 if (ret) {
4813 pr_err("%s: AUX GPIO pinctrl set active failed with %d\n",
4814 __func__, ret);
4815 goto done;
4816 }
4817 }
4818 atomic_inc(&(pdata->mi2s_gpio_ref_count[aux_mode]));
4819 }
4820
4821done:
4822 return ret;
4823}
4824
4825static void kona_aux_snd_shutdown(struct snd_pcm_substream *substream)
4826{
4827 int ret = 0;
4828 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4829 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4830 struct snd_soc_card *card = rtd->card;
4831 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4832 u32 aux_mode = cpu_dai->id - 1;
4833
4834 if (aux_mode >= AUX_PCM_MAX) {
4835 pr_err("%s: Invalid AUX interface %d\n",
4836 __func__, ret);
4837 return;
4838 }
4839
4840 if (pdata->mi2s_gpio_p[aux_mode]) {
4841 atomic_dec(&(pdata->mi2s_gpio_ref_count[aux_mode]));
4842 if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode]))
4843 == 0) {
4844 ret = msm_cdc_pinctrl_select_sleep_state(
4845 pdata->mi2s_gpio_p[aux_mode]);
4846 if (ret)
4847 pr_err("%s: AUX GPIO pinctrl set sleep failed with %d\n",
4848 __func__, ret);
4849 }
4850 }
4851}
4852
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07004853static int msm_snd_cdc_dma_startup(struct snd_pcm_substream *substream)
4854{
4855 int ret = 0;
4856 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4857 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4858
4859 switch (dai_link->id) {
4860 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
4861 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
4862 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
4863 ret = kona_send_island_va_config(dai_link->id);
4864 if (ret)
4865 pr_err("%s: send island va cfg failed, err: %d\n",
4866 __func__, ret);
4867 break;
4868 }
4869
4870 return ret;
4871}
4872
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004873static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream,
4874 struct snd_pcm_hw_params *params)
4875{
4876 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4877 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4878 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4879 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4880
4881 int ret = 0;
4882 u32 rx_ch_cdc_dma, tx_ch_cdc_dma;
4883 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
4884 u32 user_set_tx_ch = 0;
4885 u32 user_set_rx_ch = 0;
4886 u32 ch_id;
4887
4888 ret = snd_soc_dai_get_channel_map(codec_dai,
4889 &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt,
4890 &rx_ch_cdc_dma);
4891 if (ret < 0) {
4892 pr_err("%s: failed to get codec chan map, err:%d\n",
4893 __func__, ret);
4894 goto err;
4895 }
4896
4897 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4898 switch (dai_link->id) {
4899 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
4900 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
4901 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
4902 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
4903 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
4904 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
4905 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_4:
4906 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5:
4907 {
4908 ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4909 pr_debug("%s: id %d rx_ch=%d\n", __func__,
4910 ch_id, cdc_dma_rx_cfg[ch_id].channels);
4911 user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels;
4912 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
4913 user_set_rx_ch, &rx_ch_cdc_dma);
4914 if (ret < 0) {
4915 pr_err("%s: failed to set cpu chan map, err:%d\n",
4916 __func__, ret);
4917 goto err;
4918 }
4919
4920 }
4921 break;
4922 }
4923 } else {
4924 switch (dai_link->id) {
4925 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
4926 {
4927 user_set_tx_ch = msm_vi_feed_tx_ch;
4928 }
4929 break;
4930 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
4931 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
4932 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
4933 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
4934 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08004935 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
4936 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
4937 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004938 {
4939 ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4940 pr_debug("%s: id %d tx_ch=%d\n", __func__,
4941 ch_id, cdc_dma_tx_cfg[ch_id].channels);
4942 user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels;
4943 }
4944 break;
4945 }
4946
4947 ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch,
4948 &tx_ch_cdc_dma, 0, 0);
4949 if (ret < 0) {
4950 pr_err("%s: failed to set cpu chan map, err:%d\n",
4951 __func__, ret);
4952 goto err;
4953 }
4954 }
4955
4956err:
4957 return ret;
4958}
4959
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004960static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
4961{
4962 cpumask_t mask;
4963
4964 if (pm_qos_request_active(&substream->latency_pm_qos_req))
4965 pm_qos_remove_request(&substream->latency_pm_qos_req);
4966
4967 cpumask_clear(&mask);
4968 cpumask_set_cpu(1, &mask); /* affine to core 1 */
4969 cpumask_set_cpu(2, &mask); /* affine to core 2 */
4970 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
4971
4972 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
4973
4974 pm_qos_add_request(&substream->latency_pm_qos_req,
4975 PM_QOS_CPU_DMA_LATENCY,
4976 MSM_LL_QOS_VALUE);
4977 return 0;
4978}
4979
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07004980void mi2s_disable_audio_vote(struct snd_pcm_substream *substream)
4981{
4982 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4983 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4984 int index = cpu_dai->id;
4985 struct snd_soc_card *card = rtd->card;
4986 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4987 int sample_rate = 0;
4988
4989 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4990 sample_rate = mi2s_rx_cfg[index].sample_rate;
4991 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
4992 sample_rate = mi2s_tx_cfg[index].sample_rate;
4993 } else {
4994 pr_err("%s: invalid stream %d\n", __func__, substream->stream);
4995 return;
4996 }
4997
4998 if (IS_MSM_INTERFACE_MI2S(index) && IS_FRACTIONAL(sample_rate)) {
4999 if (pdata->lpass_audio_hw_vote != NULL) {
5000 if (--pdata->core_audio_vote_count == 0) {
5001 clk_disable_unprepare(
5002 pdata->lpass_audio_hw_vote);
5003 } else if (pdata->core_audio_vote_count < 0) {
5004 pr_err("%s: audio vote mismatch\n", __func__);
5005 pdata->core_audio_vote_count = 0;
5006 }
5007 } else {
5008 pr_err("%s: Invalid lpass audio hw node\n", __func__);
5009 }
5010 }
5011}
5012
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005013static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
5014{
5015 int ret = 0;
5016 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5017 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5018 int index = cpu_dai->id;
5019 unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005020 struct snd_soc_card *card = rtd->card;
5021 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07005022 int sample_rate = 0;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005023
5024 dev_dbg(rtd->card->dev,
5025 "%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
5026 __func__, substream->name, substream->stream,
5027 cpu_dai->name, cpu_dai->id);
5028
5029 if (index < PRIM_MI2S || index >= MI2S_MAX) {
5030 ret = -EINVAL;
5031 dev_err(rtd->card->dev,
5032 "%s: CPU DAI id (%d) out of range\n",
5033 __func__, cpu_dai->id);
5034 goto err;
5035 }
5036 /*
5037 * Mutex protection in case the same MI2S
5038 * interface using for both TX and RX so
5039 * that the same clock won't be enable twice.
5040 */
5041 mutex_lock(&mi2s_intf_conf[index].lock);
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07005042 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5043 sample_rate = mi2s_rx_cfg[index].sample_rate;
5044 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
5045 sample_rate = mi2s_tx_cfg[index].sample_rate;
5046 } else {
5047 pr_err("%s: invalid stream %d\n", __func__, substream->stream);
5048 ret = -EINVAL;
5049 goto vote_err;
5050 }
5051
5052 if (IS_MSM_INTERFACE_MI2S(index) && IS_FRACTIONAL(sample_rate)) {
5053 if (pdata->lpass_audio_hw_vote == NULL) {
5054 dev_err(rtd->card->dev, "%s: Invalid lpass audio hw node\n",
5055 __func__);
5056 ret = -EINVAL;
5057 goto vote_err;
5058 }
5059 if (pdata->core_audio_vote_count == 0) {
5060 ret = clk_prepare_enable(pdata->lpass_audio_hw_vote);
5061 if (ret < 0) {
5062 dev_err(rtd->card->dev, "%s: audio vote error\n",
5063 __func__);
5064 goto vote_err;
5065 }
5066 }
5067 pdata->core_audio_vote_count++;
5068 }
5069
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005070 if (++mi2s_intf_conf[index].ref_cnt == 1) {
5071 /* Check if msm needs to provide the clock to the interface */
5072 if (!mi2s_intf_conf[index].msm_is_mi2s_master) {
5073 mi2s_clk[index].clk_id = mi2s_ebit_clk[index];
5074 fmt = SND_SOC_DAIFMT_CBM_CFM;
5075 }
5076 ret = msm_mi2s_set_sclk(substream, true);
5077 if (ret < 0) {
5078 dev_err(rtd->card->dev,
5079 "%s: afe lpass clock failed to enable MI2S clock, err:%d\n",
5080 __func__, ret);
5081 goto clean_up;
5082 }
5083
5084 ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
5085 if (ret < 0) {
5086 pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n",
5087 __func__, index, ret);
5088 goto clk_off;
5089 }
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005090 if (pdata->mi2s_gpio_p[index]) {
5091 if (atomic_read(&(pdata->mi2s_gpio_ref_count[index]))
5092 == 0) {
5093 ret = msm_cdc_pinctrl_select_active_state(
5094 pdata->mi2s_gpio_p[index]);
5095 if (ret) {
5096 pr_err("%s: MI2S GPIO pinctrl set active failed with %d\n",
5097 __func__, ret);
5098 goto clk_off;
5099 }
5100 }
5101 atomic_inc(&(pdata->mi2s_gpio_ref_count[index]));
5102 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005103 }
5104clk_off:
5105 if (ret < 0)
5106 msm_mi2s_set_sclk(substream, false);
5107clean_up:
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07005108 if (ret < 0) {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005109 mi2s_intf_conf[index].ref_cnt--;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07005110 mi2s_disable_audio_vote(substream);
5111 }
5112vote_err:
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005113 mutex_unlock(&mi2s_intf_conf[index].lock);
5114err:
5115 return ret;
5116}
5117
5118static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
5119{
5120 int ret = 0;
5121 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5122 int index = rtd->cpu_dai->id;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005123 struct snd_soc_card *card = rtd->card;
5124 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005125
5126 pr_debug("%s(): substream = %s stream = %d\n", __func__,
5127 substream->name, substream->stream);
5128 if (index < PRIM_MI2S || index >= MI2S_MAX) {
5129 pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index);
5130 return;
5131 }
5132
5133 mutex_lock(&mi2s_intf_conf[index].lock);
5134 if (--mi2s_intf_conf[index].ref_cnt == 0) {
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005135 if (pdata->mi2s_gpio_p[index]) {
5136 atomic_dec(&(pdata->mi2s_gpio_ref_count[index]));
5137 if (atomic_read(&(pdata->mi2s_gpio_ref_count[index]))
5138 == 0) {
5139 ret = msm_cdc_pinctrl_select_sleep_state(
5140 pdata->mi2s_gpio_p[index]);
5141 if (ret)
5142 pr_err("%s: MI2S GPIO pinctrl set sleep failed with %d\n",
5143 __func__, ret);
5144 }
5145 }
5146
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005147 ret = msm_mi2s_set_sclk(substream, false);
5148 if (ret < 0)
5149 pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
5150 __func__, index, ret);
5151 }
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07005152 mi2s_disable_audio_vote(substream);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005153 mutex_unlock(&mi2s_intf_conf[index].lock);
5154}
5155
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05305156static int msm_wcn_hw_params_lito(struct snd_pcm_substream *substream,
5157 struct snd_pcm_hw_params *params)
5158{
5159 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5160 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5161 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5162 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5163 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO];
5164 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
5165 int ret = 0;
5166
5167 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
5168 codec_dai->name, codec_dai->id);
5169 ret = snd_soc_dai_get_channel_map(codec_dai,
5170 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5171 if (ret) {
5172 dev_err(rtd->dev,
5173 "%s: failed to get BTFM codec chan map\n, err:%d\n",
5174 __func__, ret);
5175 goto err;
5176 }
5177
5178 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n",
5179 __func__, tx_ch_cnt, dai_link->id);
5180
5181 ret = snd_soc_dai_set_channel_map(cpu_dai,
5182 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
5183 if (ret)
5184 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
5185 __func__, ret);
5186
5187err:
5188 return ret;
5189}
5190
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08005191static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
5192 struct snd_pcm_hw_params *params)
5193{
5194 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5195 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5196 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5197 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5198 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
5199 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
5200 int ret = 0;
5201
5202 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
5203 codec_dai->name, codec_dai->id);
5204 ret = snd_soc_dai_get_channel_map(codec_dai,
5205 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5206 if (ret) {
5207 dev_err(rtd->dev,
5208 "%s: failed to get BTFM codec chan map\n, err:%d\n",
5209 __func__, ret);
5210 goto err;
5211 }
5212
5213 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n",
5214 __func__, tx_ch_cnt, dai_link->id);
5215
5216 ret = snd_soc_dai_set_channel_map(cpu_dai,
5217 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
5218 if (ret)
5219 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
5220 __func__, ret);
5221
5222err:
5223 return ret;
5224}
5225
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005226static struct snd_soc_ops kona_aux_be_ops = {
5227 .startup = kona_aux_snd_startup,
5228 .shutdown = kona_aux_snd_shutdown
5229};
5230
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005231static struct snd_soc_ops kona_tdm_be_ops = {
5232 .hw_params = kona_tdm_snd_hw_params,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005233 .startup = kona_tdm_snd_startup,
5234 .shutdown = kona_tdm_snd_shutdown
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005235};
5236
5237static struct snd_soc_ops msm_mi2s_be_ops = {
5238 .startup = msm_mi2s_snd_startup,
5239 .shutdown = msm_mi2s_snd_shutdown,
5240};
5241
5242static struct snd_soc_ops msm_fe_qos_ops = {
5243 .prepare = msm_fe_qos_prepare,
5244};
5245
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005246static struct snd_soc_ops msm_cdc_dma_be_ops = {
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07005247 .startup = msm_snd_cdc_dma_startup,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005248 .hw_params = msm_snd_cdc_dma_hw_params,
5249};
5250
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08005251static struct snd_soc_ops msm_wcn_ops = {
5252 .hw_params = msm_wcn_hw_params,
5253};
5254
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05305255static struct snd_soc_ops msm_wcn_ops_lito = {
5256 .hw_params = msm_wcn_hw_params_lito,
5257};
5258
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005259static int msm_dmic_event(struct snd_soc_dapm_widget *w,
5260 struct snd_kcontrol *kcontrol, int event)
5261{
5262 struct msm_asoc_mach_data *pdata = NULL;
5263 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
5264 int ret = 0;
5265 u32 dmic_idx;
5266 int *dmic_gpio_cnt;
5267 struct device_node *dmic_gpio;
5268 char *wname;
5269
5270 wname = strpbrk(w->name, "012345");
5271 if (!wname) {
5272 dev_err(component->dev, "%s: widget not found\n", __func__);
5273 return -EINVAL;
5274 }
5275
5276 ret = kstrtouint(wname, 10, &dmic_idx);
5277 if (ret < 0) {
5278 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
5279 __func__);
5280 return -EINVAL;
5281 }
5282
5283 pdata = snd_soc_card_get_drvdata(component->card);
5284
5285 switch (dmic_idx) {
5286 case 0:
5287 case 1:
5288 dmic_gpio_cnt = &dmic_0_1_gpio_cnt;
5289 dmic_gpio = pdata->dmic01_gpio_p;
5290 break;
5291 case 2:
5292 case 3:
5293 dmic_gpio_cnt = &dmic_2_3_gpio_cnt;
5294 dmic_gpio = pdata->dmic23_gpio_p;
5295 break;
5296 case 4:
5297 case 5:
5298 dmic_gpio_cnt = &dmic_4_5_gpio_cnt;
5299 dmic_gpio = pdata->dmic45_gpio_p;
5300 break;
5301 default:
5302 dev_err(component->dev, "%s: Invalid DMIC Selection\n",
5303 __func__);
5304 return -EINVAL;
5305 }
5306
5307 dev_dbg(component->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n",
5308 __func__, event, dmic_idx, *dmic_gpio_cnt);
5309
5310 switch (event) {
5311 case SND_SOC_DAPM_PRE_PMU:
5312 (*dmic_gpio_cnt)++;
5313 if (*dmic_gpio_cnt == 1) {
5314 ret = msm_cdc_pinctrl_select_active_state(
5315 dmic_gpio);
5316 if (ret < 0) {
5317 pr_err("%s: gpio set cannot be activated %sd",
5318 __func__, "dmic_gpio");
5319 return ret;
5320 }
5321 }
5322
5323 break;
5324 case SND_SOC_DAPM_POST_PMD:
5325 (*dmic_gpio_cnt)--;
5326 if (*dmic_gpio_cnt == 0) {
5327 ret = msm_cdc_pinctrl_select_sleep_state(
5328 dmic_gpio);
5329 if (ret < 0) {
5330 pr_err("%s: gpio set cannot be de-activated %sd",
5331 __func__, "dmic_gpio");
5332 return ret;
5333 }
5334 }
5335 break;
5336 default:
5337 pr_err("%s: invalid DAPM event %d\n", __func__, event);
5338 return -EINVAL;
5339 }
5340 return 0;
5341}
5342
5343static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = {
5344 SND_SOC_DAPM_MIC("Analog Mic1", NULL),
5345 SND_SOC_DAPM_MIC("Analog Mic2", NULL),
5346 SND_SOC_DAPM_MIC("Analog Mic3", NULL),
5347 SND_SOC_DAPM_MIC("Analog Mic4", NULL),
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08005348 SND_SOC_DAPM_MIC("Analog Mic5", NULL),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005349 SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event),
5350 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
5351 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
5352 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
5353 SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
5354 SND_SOC_DAPM_MIC("Digital Mic5", msm_dmic_event),
Laxminath Kasamdb79e5f2019-07-18 13:47:57 +05305355 SND_SOC_DAPM_MIC("Digital Mic6", NULL),
5356 SND_SOC_DAPM_MIC("Digital Mic7", NULL),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005357};
5358
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08005359static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
5360{
5361 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
5362 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160};
5363 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5364
5365 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
5366 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
5367}
5368
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05305369static int msm_wcn_init_lito(struct snd_soc_pcm_runtime *rtd)
5370{
5371 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
5372 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO] = {159, 160, 161};
5373 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5374
5375 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
5376 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
5377}
5378
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05305379#ifndef CONFIG_TDM_DISABLE
5380static void msm_add_tdm_snd_controls(struct snd_soc_component *component)
5381{
5382 snd_soc_add_component_controls(component, msm_tdm_snd_controls,
5383 ARRAY_SIZE(msm_tdm_snd_controls));
5384}
5385#else
5386static void msm_add_tdm_snd_controls(struct snd_soc_component *component)
5387{
5388 return;
5389}
5390#endif
5391
5392#ifndef CONFIG_MI2S_DISABLE
5393static void msm_add_mi2s_snd_controls(struct snd_soc_component *component)
5394{
5395 snd_soc_add_component_controls(component, msm_mi2s_snd_controls,
5396 ARRAY_SIZE(msm_mi2s_snd_controls));
5397}
5398#else
5399static void msm_add_mi2s_snd_controls(struct snd_soc_component *component)
5400{
5401 return;
5402}
5403#endif
5404
5405#ifndef CONFIG_AUXPCM_DISABLE
5406static void msm_add_auxpcm_snd_controls(struct snd_soc_component *component)
5407{
5408 snd_soc_add_component_controls(component, msm_auxpcm_snd_controls,
5409 ARRAY_SIZE(msm_auxpcm_snd_controls));
5410}
5411#else
5412static void msm_add_auxpcm_snd_controls(struct snd_soc_component *component)
5413{
5414 return;
5415}
5416#endif
5417
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005418static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
5419{
5420 int ret = -EINVAL;
5421 struct snd_soc_component *component;
5422 struct snd_soc_dapm_context *dapm;
5423 struct snd_card *card;
5424 struct snd_info_entry *entry;
5425 struct snd_soc_component *aux_comp;
Kunlei Zhang4bfe0fe2020-03-06 21:20:07 +08005426 struct platform_device *pdev = NULL;
5427 int i = 0;
5428 char *data = NULL;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005429 struct msm_asoc_mach_data *pdata =
5430 snd_soc_card_get_drvdata(rtd->card);
5431
5432 component = snd_soc_rtdcom_lookup(rtd, "bolero_codec");
5433 if (!component) {
5434 pr_err("%s: could not find component for bolero_codec\n",
5435 __func__);
5436 return ret;
5437 }
5438
5439 dapm = snd_soc_component_get_dapm(component);
5440
5441 ret = snd_soc_add_component_controls(component, msm_int_snd_controls,
5442 ARRAY_SIZE(msm_int_snd_controls));
5443 if (ret < 0) {
5444 pr_err("%s: add_component_controls failed: %d\n",
5445 __func__, ret);
5446 return ret;
5447 }
5448 ret = snd_soc_add_component_controls(component, msm_common_snd_controls,
5449 ARRAY_SIZE(msm_common_snd_controls));
5450 if (ret < 0) {
5451 pr_err("%s: add common snd controls failed: %d\n",
5452 __func__, ret);
5453 return ret;
5454 }
5455
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05305456 msm_add_tdm_snd_controls(component);
5457 msm_add_mi2s_snd_controls(component);
5458 msm_add_auxpcm_snd_controls(component);
5459
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005460 snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
5461 ARRAY_SIZE(msm_int_dapm_widgets));
5462
5463 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
5464 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
5465 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
5466 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
Sudheer Papothi3fc2d772019-05-11 14:11:29 +05305467 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
5468 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
Laxminath Kasamdb79e5f2019-07-18 13:47:57 +05305469 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6");
5470 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic7");
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005471
5472 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1");
5473 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2");
5474 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3");
5475 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4");
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08005476 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5");
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005477
5478 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT");
5479 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT");
5480 snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI");
5481 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA");
5482
5483 snd_soc_dapm_sync(dapm);
5484
5485 /*
5486 * Send speaker configuration only for WSA8810.
5487 * Default configuration is for WSA8815.
5488 */
5489 dev_dbg(component->dev, "%s: Number of aux devices: %d\n",
5490 __func__, rtd->card->num_aux_devs);
5491 if (rtd->card->num_aux_devs &&
5492 !list_empty(&rtd->card->component_dev_list)) {
Meng Wangbb5e0e92019-06-05 15:24:39 +08005493 list_for_each_entry(aux_comp,
5494 &rtd->card->aux_comp_list,
5495 card_aux_list) {
5496 if (aux_comp->name != NULL && (
5497 !strcmp(aux_comp->name, WSA8810_NAME_1) ||
5498 !strcmp(aux_comp->name, WSA8810_NAME_2))) {
5499 wsa_macro_set_spkr_mode(component,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005500 WSA_MACRO_SPKR_MODE_1);
Meng Wangbb5e0e92019-06-05 15:24:39 +08005501 wsa_macro_set_spkr_gain_offset(component,
5502 WSA_MACRO_GAIN_OFFSET_M1P5_DB);
5503 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005504 }
Kunlei Zhang4bfe0fe2020-03-06 21:20:07 +08005505 }
5506
5507 for (i = 0; i < rtd->card->num_aux_devs; i++)
5508 {
5509 if (msm_aux_dev[i].name != NULL ) {
5510 if (strstr(msm_aux_dev[i].name, "wsa"))
5511 continue;
5512 }
5513
5514 if (msm_aux_dev[i].codec_of_node) {
5515 pdev = of_find_device_by_node(
5516 msm_aux_dev[i].codec_of_node);
5517
5518 if (pdev)
5519 data = (char*) of_device_get_match_data(
5520 &pdev->dev);
5521 if (data != NULL) {
5522 if (!strncmp(data, "wcd937x",
5523 sizeof("wcd937x"))) {
5524 bolero_set_port_map(component,
5525 ARRAY_SIZE(sm_port_map_wcd937x),
5526 sm_port_map_wcd937x);
5527 break;
5528 } else if (!strncmp( data, "wcd938x",
5529 sizeof("wcd938x"))) {
5530 if (pdata->lito_v2_enabled) {
5531 /*
5532 * Enable tx data line3 for
5533 * saipan version v2 and
5534 * write corresponding
5535 * lpi register.
5536 */
5537 bolero_set_port_map(component,
5538 ARRAY_SIZE(sm_port_map_v2),
5539 sm_port_map_v2);
5540 } else {
5541 bolero_set_port_map(component,
5542 ARRAY_SIZE(sm_port_map),
5543 sm_port_map);
5544 }
5545 break;
5546 }
5547 }
Vatsal Bucha71e0b482019-09-11 14:51:20 +05305548 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005549 }
Kunlei Zhang4bfe0fe2020-03-06 21:20:07 +08005550
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005551 card = rtd->card->snd_card;
5552 if (!pdata->codec_root) {
5553 entry = snd_info_create_subdir(card->module, "codecs",
5554 card->proc_root);
5555 if (!entry) {
5556 pr_debug("%s: Cannot create codecs module entry\n",
5557 __func__);
5558 ret = 0;
5559 goto err;
5560 }
5561 pdata->codec_root = entry;
5562 }
5563 bolero_info_create_codec_entry(pdata->codec_root, component);
Karthikeyan Mani664bd4a2019-02-21 13:30:34 -08005564 bolero_register_wake_irq(component, false);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005565 codec_reg_done = true;
5566 return 0;
5567err:
5568 return ret;
5569}
5570
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08005571static void *def_wcd_mbhc_cal(void)
5572{
5573 void *wcd_mbhc_cal;
5574 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
5575 u16 *btn_high;
5576
5577 wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
5578 WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
5579 if (!wcd_mbhc_cal)
5580 return NULL;
5581
5582 WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->v_hs_max = WCD_MBHC_HS_V_MAX;
5583 WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->num_btn = WCD_MBHC_DEF_BUTTONS;
5584 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal);
5585 btn_high = ((void *)&btn_cfg->_v_btn_low) +
5586 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
5587
5588 btn_high[0] = 75;
5589 btn_high[1] = 150;
5590 btn_high[2] = 237;
5591 btn_high[3] = 500;
5592 btn_high[4] = 500;
5593 btn_high[5] = 500;
5594 btn_high[6] = 500;
5595 btn_high[7] = 500;
5596
5597 return wcd_mbhc_cal;
5598}
5599
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005600/* Digital audio interface glue - connects codec <---> CPU */
5601static struct snd_soc_dai_link msm_common_dai_links[] = {
5602 /* FrontEnd DAI Links */
5603 {/* hw:x,0 */
5604 .name = MSM_DAILINK_NAME(Media1),
5605 .stream_name = "MultiMedia1",
5606 .cpu_dai_name = "MultiMedia1",
5607 .platform_name = "msm-pcm-dsp.0",
5608 .dynamic = 1,
5609 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
5610 .dpcm_playback = 1,
5611 .dpcm_capture = 1,
5612 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5613 SND_SOC_DPCM_TRIGGER_POST},
5614 .codec_dai_name = "snd-soc-dummy-dai",
5615 .codec_name = "snd-soc-dummy",
5616 .ignore_suspend = 1,
5617 /* this dainlink has playback support */
5618 .ignore_pmdown_time = 1,
5619 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
5620 },
5621 {/* hw:x,1 */
5622 .name = MSM_DAILINK_NAME(Media2),
5623 .stream_name = "MultiMedia2",
5624 .cpu_dai_name = "MultiMedia2",
5625 .platform_name = "msm-pcm-dsp.0",
5626 .dynamic = 1,
5627 .dpcm_playback = 1,
5628 .dpcm_capture = 1,
5629 .codec_dai_name = "snd-soc-dummy-dai",
5630 .codec_name = "snd-soc-dummy",
5631 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5632 SND_SOC_DPCM_TRIGGER_POST},
5633 .ignore_suspend = 1,
5634 /* this dainlink has playback support */
5635 .ignore_pmdown_time = 1,
5636 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
5637 },
5638 {/* hw:x,2 */
5639 .name = "VoiceMMode1",
5640 .stream_name = "VoiceMMode1",
5641 .cpu_dai_name = "VoiceMMode1",
5642 .platform_name = "msm-pcm-voice",
5643 .dynamic = 1,
5644 .dpcm_playback = 1,
5645 .dpcm_capture = 1,
5646 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5647 SND_SOC_DPCM_TRIGGER_POST},
5648 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5649 .ignore_suspend = 1,
5650 .ignore_pmdown_time = 1,
5651 .codec_dai_name = "snd-soc-dummy-dai",
5652 .codec_name = "snd-soc-dummy",
5653 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
5654 },
5655 {/* hw:x,3 */
5656 .name = "MSM VoIP",
5657 .stream_name = "VoIP",
5658 .cpu_dai_name = "VoIP",
5659 .platform_name = "msm-voip-dsp",
5660 .dynamic = 1,
5661 .dpcm_playback = 1,
5662 .dpcm_capture = 1,
5663 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5664 SND_SOC_DPCM_TRIGGER_POST},
5665 .codec_dai_name = "snd-soc-dummy-dai",
5666 .codec_name = "snd-soc-dummy",
5667 .ignore_suspend = 1,
5668 /* this dainlink has playback support */
5669 .ignore_pmdown_time = 1,
5670 .id = MSM_FRONTEND_DAI_VOIP,
5671 },
5672 {/* hw:x,4 */
5673 .name = MSM_DAILINK_NAME(ULL),
5674 .stream_name = "MultiMedia3",
5675 .cpu_dai_name = "MultiMedia3",
5676 .platform_name = "msm-pcm-dsp.2",
5677 .dynamic = 1,
5678 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
5679 .dpcm_playback = 1,
5680 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5681 SND_SOC_DPCM_TRIGGER_POST},
5682 .codec_dai_name = "snd-soc-dummy-dai",
5683 .codec_name = "snd-soc-dummy",
5684 .ignore_suspend = 1,
5685 /* this dainlink has playback support */
5686 .ignore_pmdown_time = 1,
5687 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
5688 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005689 {/* hw:x,5 */
5690 .name = "MSM AFE-PCM RX",
5691 .stream_name = "AFE-PROXY RX",
5692 .cpu_dai_name = "msm-dai-q6-dev.241",
5693 .codec_name = "msm-stub-codec.1",
5694 .codec_dai_name = "msm-stub-rx",
5695 .platform_name = "msm-pcm-afe",
5696 .dpcm_playback = 1,
5697 .ignore_suspend = 1,
5698 /* this dainlink has playback support */
5699 .ignore_pmdown_time = 1,
5700 },
5701 {/* hw:x,6 */
5702 .name = "MSM AFE-PCM TX",
5703 .stream_name = "AFE-PROXY TX",
5704 .cpu_dai_name = "msm-dai-q6-dev.240",
5705 .codec_name = "msm-stub-codec.1",
5706 .codec_dai_name = "msm-stub-tx",
5707 .platform_name = "msm-pcm-afe",
5708 .dpcm_capture = 1,
5709 .ignore_suspend = 1,
5710 },
5711 {/* hw:x,7 */
5712 .name = MSM_DAILINK_NAME(Compress1),
5713 .stream_name = "Compress1",
5714 .cpu_dai_name = "MultiMedia4",
5715 .platform_name = "msm-compress-dsp",
5716 .dynamic = 1,
5717 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
5718 .dpcm_playback = 1,
5719 .dpcm_capture = 1,
5720 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5721 SND_SOC_DPCM_TRIGGER_POST},
5722 .codec_dai_name = "snd-soc-dummy-dai",
5723 .codec_name = "snd-soc-dummy",
5724 .ignore_suspend = 1,
5725 .ignore_pmdown_time = 1,
5726 /* this dainlink has playback support */
5727 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
5728 },
Meng Wang197cb302019-03-01 13:54:38 +08005729 /* Hostless PCM purpose */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005730 {/* hw:x,8 */
5731 .name = "AUXPCM Hostless",
5732 .stream_name = "AUXPCM Hostless",
5733 .cpu_dai_name = "AUXPCM_HOSTLESS",
5734 .platform_name = "msm-pcm-hostless",
5735 .dynamic = 1,
5736 .dpcm_playback = 1,
5737 .dpcm_capture = 1,
5738 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5739 SND_SOC_DPCM_TRIGGER_POST},
5740 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5741 .ignore_suspend = 1,
5742 /* this dainlink has playback support */
5743 .ignore_pmdown_time = 1,
5744 .codec_dai_name = "snd-soc-dummy-dai",
5745 .codec_name = "snd-soc-dummy",
5746 },
5747 {/* hw:x,9 */
5748 .name = MSM_DAILINK_NAME(LowLatency),
5749 .stream_name = "MultiMedia5",
5750 .cpu_dai_name = "MultiMedia5",
5751 .platform_name = "msm-pcm-dsp.1",
5752 .dynamic = 1,
5753 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
5754 .dpcm_playback = 1,
5755 .dpcm_capture = 1,
5756 .codec_dai_name = "snd-soc-dummy-dai",
5757 .codec_name = "snd-soc-dummy",
5758 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5759 SND_SOC_DPCM_TRIGGER_POST},
5760 .ignore_suspend = 1,
5761 /* this dainlink has playback support */
5762 .ignore_pmdown_time = 1,
5763 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
5764 .ops = &msm_fe_qos_ops,
5765 },
5766 {/* hw:x,10 */
5767 .name = "Listen 1 Audio Service",
5768 .stream_name = "Listen 1 Audio Service",
5769 .cpu_dai_name = "LSM1",
5770 .platform_name = "msm-lsm-client",
5771 .dynamic = 1,
5772 .dpcm_capture = 1,
5773 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5774 SND_SOC_DPCM_TRIGGER_POST },
5775 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5776 .ignore_suspend = 1,
5777 .codec_dai_name = "snd-soc-dummy-dai",
5778 .codec_name = "snd-soc-dummy",
5779 .id = MSM_FRONTEND_DAI_LSM1,
5780 },
5781 /* Multiple Tunnel instances */
5782 {/* hw:x,11 */
5783 .name = MSM_DAILINK_NAME(Compress2),
5784 .stream_name = "Compress2",
5785 .cpu_dai_name = "MultiMedia7",
5786 .platform_name = "msm-compress-dsp",
5787 .dynamic = 1,
5788 .dpcm_playback = 1,
5789 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5790 SND_SOC_DPCM_TRIGGER_POST},
5791 .codec_dai_name = "snd-soc-dummy-dai",
5792 .codec_name = "snd-soc-dummy",
5793 .ignore_suspend = 1,
5794 .ignore_pmdown_time = 1,
5795 /* this dainlink has playback support */
5796 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
5797 },
5798 {/* hw:x,12 */
5799 .name = MSM_DAILINK_NAME(MultiMedia10),
5800 .stream_name = "MultiMedia10",
5801 .cpu_dai_name = "MultiMedia10",
5802 .platform_name = "msm-pcm-dsp.1",
5803 .dynamic = 1,
5804 .dpcm_playback = 1,
5805 .dpcm_capture = 1,
5806 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5807 SND_SOC_DPCM_TRIGGER_POST},
5808 .codec_dai_name = "snd-soc-dummy-dai",
5809 .codec_name = "snd-soc-dummy",
5810 .ignore_suspend = 1,
5811 .ignore_pmdown_time = 1,
5812 /* this dainlink has playback support */
5813 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
5814 },
5815 {/* hw:x,13 */
5816 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
5817 .stream_name = "MM_NOIRQ",
5818 .cpu_dai_name = "MultiMedia8",
5819 .platform_name = "msm-pcm-dsp-noirq",
5820 .dynamic = 1,
5821 .dpcm_playback = 1,
5822 .dpcm_capture = 1,
5823 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5824 SND_SOC_DPCM_TRIGGER_POST},
5825 .codec_dai_name = "snd-soc-dummy-dai",
5826 .codec_name = "snd-soc-dummy",
5827 .ignore_suspend = 1,
5828 .ignore_pmdown_time = 1,
5829 /* this dainlink has playback support */
5830 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
5831 .ops = &msm_fe_qos_ops,
5832 },
5833 /* HDMI Hostless */
5834 {/* hw:x,14 */
5835 .name = "HDMI_RX_HOSTLESS",
5836 .stream_name = "HDMI_RX_HOSTLESS",
5837 .cpu_dai_name = "HDMI_HOSTLESS",
5838 .platform_name = "msm-pcm-hostless",
5839 .dynamic = 1,
5840 .dpcm_playback = 1,
5841 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5842 SND_SOC_DPCM_TRIGGER_POST},
5843 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5844 .ignore_suspend = 1,
5845 .ignore_pmdown_time = 1,
5846 .codec_dai_name = "snd-soc-dummy-dai",
5847 .codec_name = "snd-soc-dummy",
5848 },
5849 {/* hw:x,15 */
5850 .name = "VoiceMMode2",
5851 .stream_name = "VoiceMMode2",
5852 .cpu_dai_name = "VoiceMMode2",
5853 .platform_name = "msm-pcm-voice",
5854 .dynamic = 1,
5855 .dpcm_playback = 1,
5856 .dpcm_capture = 1,
5857 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5858 SND_SOC_DPCM_TRIGGER_POST},
5859 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5860 .ignore_suspend = 1,
5861 .ignore_pmdown_time = 1,
5862 .codec_dai_name = "snd-soc-dummy-dai",
5863 .codec_name = "snd-soc-dummy",
5864 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
5865 },
5866 /* LSM FE */
5867 {/* hw:x,16 */
5868 .name = "Listen 2 Audio Service",
5869 .stream_name = "Listen 2 Audio Service",
5870 .cpu_dai_name = "LSM2",
5871 .platform_name = "msm-lsm-client",
5872 .dynamic = 1,
5873 .dpcm_capture = 1,
5874 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5875 SND_SOC_DPCM_TRIGGER_POST },
5876 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5877 .ignore_suspend = 1,
5878 .codec_dai_name = "snd-soc-dummy-dai",
5879 .codec_name = "snd-soc-dummy",
5880 .id = MSM_FRONTEND_DAI_LSM2,
5881 },
5882 {/* hw:x,17 */
5883 .name = "Listen 3 Audio Service",
5884 .stream_name = "Listen 3 Audio Service",
5885 .cpu_dai_name = "LSM3",
5886 .platform_name = "msm-lsm-client",
5887 .dynamic = 1,
5888 .dpcm_capture = 1,
5889 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5890 SND_SOC_DPCM_TRIGGER_POST },
5891 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5892 .ignore_suspend = 1,
5893 .codec_dai_name = "snd-soc-dummy-dai",
5894 .codec_name = "snd-soc-dummy",
5895 .id = MSM_FRONTEND_DAI_LSM3,
5896 },
5897 {/* hw:x,18 */
5898 .name = "Listen 4 Audio Service",
5899 .stream_name = "Listen 4 Audio Service",
5900 .cpu_dai_name = "LSM4",
5901 .platform_name = "msm-lsm-client",
5902 .dynamic = 1,
5903 .dpcm_capture = 1,
5904 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5905 SND_SOC_DPCM_TRIGGER_POST },
5906 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5907 .ignore_suspend = 1,
5908 .codec_dai_name = "snd-soc-dummy-dai",
5909 .codec_name = "snd-soc-dummy",
5910 .id = MSM_FRONTEND_DAI_LSM4,
5911 },
5912 {/* hw:x,19 */
5913 .name = "Listen 5 Audio Service",
5914 .stream_name = "Listen 5 Audio Service",
5915 .cpu_dai_name = "LSM5",
5916 .platform_name = "msm-lsm-client",
5917 .dynamic = 1,
5918 .dpcm_capture = 1,
5919 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5920 SND_SOC_DPCM_TRIGGER_POST },
5921 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5922 .ignore_suspend = 1,
5923 .codec_dai_name = "snd-soc-dummy-dai",
5924 .codec_name = "snd-soc-dummy",
5925 .id = MSM_FRONTEND_DAI_LSM5,
5926 },
5927 {/* hw:x,20 */
5928 .name = "Listen 6 Audio Service",
5929 .stream_name = "Listen 6 Audio Service",
5930 .cpu_dai_name = "LSM6",
5931 .platform_name = "msm-lsm-client",
5932 .dynamic = 1,
5933 .dpcm_capture = 1,
5934 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5935 SND_SOC_DPCM_TRIGGER_POST },
5936 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5937 .ignore_suspend = 1,
5938 .codec_dai_name = "snd-soc-dummy-dai",
5939 .codec_name = "snd-soc-dummy",
5940 .id = MSM_FRONTEND_DAI_LSM6,
5941 },
5942 {/* hw:x,21 */
5943 .name = "Listen 7 Audio Service",
5944 .stream_name = "Listen 7 Audio Service",
5945 .cpu_dai_name = "LSM7",
5946 .platform_name = "msm-lsm-client",
5947 .dynamic = 1,
5948 .dpcm_capture = 1,
5949 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5950 SND_SOC_DPCM_TRIGGER_POST },
5951 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5952 .ignore_suspend = 1,
5953 .codec_dai_name = "snd-soc-dummy-dai",
5954 .codec_name = "snd-soc-dummy",
5955 .id = MSM_FRONTEND_DAI_LSM7,
5956 },
5957 {/* hw:x,22 */
5958 .name = "Listen 8 Audio Service",
5959 .stream_name = "Listen 8 Audio Service",
5960 .cpu_dai_name = "LSM8",
5961 .platform_name = "msm-lsm-client",
5962 .dynamic = 1,
5963 .dpcm_capture = 1,
5964 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5965 SND_SOC_DPCM_TRIGGER_POST },
5966 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5967 .ignore_suspend = 1,
5968 .codec_dai_name = "snd-soc-dummy-dai",
5969 .codec_name = "snd-soc-dummy",
5970 .id = MSM_FRONTEND_DAI_LSM8,
5971 },
5972 {/* hw:x,23 */
5973 .name = MSM_DAILINK_NAME(Media9),
5974 .stream_name = "MultiMedia9",
5975 .cpu_dai_name = "MultiMedia9",
5976 .platform_name = "msm-pcm-dsp.0",
5977 .dynamic = 1,
5978 .dpcm_playback = 1,
5979 .dpcm_capture = 1,
5980 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5981 SND_SOC_DPCM_TRIGGER_POST},
5982 .codec_dai_name = "snd-soc-dummy-dai",
5983 .codec_name = "snd-soc-dummy",
5984 .ignore_suspend = 1,
5985 /* this dainlink has playback support */
5986 .ignore_pmdown_time = 1,
5987 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
5988 },
5989 {/* hw:x,24 */
5990 .name = MSM_DAILINK_NAME(Compress4),
5991 .stream_name = "Compress4",
5992 .cpu_dai_name = "MultiMedia11",
5993 .platform_name = "msm-compress-dsp",
5994 .dynamic = 1,
5995 .dpcm_playback = 1,
5996 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5997 SND_SOC_DPCM_TRIGGER_POST},
5998 .codec_dai_name = "snd-soc-dummy-dai",
5999 .codec_name = "snd-soc-dummy",
6000 .ignore_suspend = 1,
6001 .ignore_pmdown_time = 1,
6002 /* this dainlink has playback support */
6003 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
6004 },
6005 {/* hw:x,25 */
6006 .name = MSM_DAILINK_NAME(Compress5),
6007 .stream_name = "Compress5",
6008 .cpu_dai_name = "MultiMedia12",
6009 .platform_name = "msm-compress-dsp",
6010 .dynamic = 1,
6011 .dpcm_playback = 1,
6012 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6013 SND_SOC_DPCM_TRIGGER_POST},
6014 .codec_dai_name = "snd-soc-dummy-dai",
6015 .codec_name = "snd-soc-dummy",
6016 .ignore_suspend = 1,
6017 .ignore_pmdown_time = 1,
6018 /* this dainlink has playback support */
6019 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
6020 },
6021 {/* hw:x,26 */
6022 .name = MSM_DAILINK_NAME(Compress6),
6023 .stream_name = "Compress6",
6024 .cpu_dai_name = "MultiMedia13",
6025 .platform_name = "msm-compress-dsp",
6026 .dynamic = 1,
6027 .dpcm_playback = 1,
6028 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6029 SND_SOC_DPCM_TRIGGER_POST},
6030 .codec_dai_name = "snd-soc-dummy-dai",
6031 .codec_name = "snd-soc-dummy",
6032 .ignore_suspend = 1,
6033 .ignore_pmdown_time = 1,
6034 /* this dainlink has playback support */
6035 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
6036 },
6037 {/* hw:x,27 */
6038 .name = MSM_DAILINK_NAME(Compress7),
6039 .stream_name = "Compress7",
6040 .cpu_dai_name = "MultiMedia14",
6041 .platform_name = "msm-compress-dsp",
6042 .dynamic = 1,
6043 .dpcm_playback = 1,
6044 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6045 SND_SOC_DPCM_TRIGGER_POST},
6046 .codec_dai_name = "snd-soc-dummy-dai",
6047 .codec_name = "snd-soc-dummy",
6048 .ignore_suspend = 1,
6049 .ignore_pmdown_time = 1,
6050 /* this dainlink has playback support */
6051 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
6052 },
6053 {/* hw:x,28 */
6054 .name = MSM_DAILINK_NAME(Compress8),
6055 .stream_name = "Compress8",
6056 .cpu_dai_name = "MultiMedia15",
6057 .platform_name = "msm-compress-dsp",
6058 .dynamic = 1,
6059 .dpcm_playback = 1,
6060 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6061 SND_SOC_DPCM_TRIGGER_POST},
6062 .codec_dai_name = "snd-soc-dummy-dai",
6063 .codec_name = "snd-soc-dummy",
6064 .ignore_suspend = 1,
6065 .ignore_pmdown_time = 1,
6066 /* this dainlink has playback support */
6067 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
6068 },
6069 {/* hw:x,29 */
6070 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
6071 .stream_name = "MM_NOIRQ_2",
6072 .cpu_dai_name = "MultiMedia16",
6073 .platform_name = "msm-pcm-dsp-noirq",
6074 .dynamic = 1,
6075 .dpcm_playback = 1,
6076 .dpcm_capture = 1,
6077 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6078 SND_SOC_DPCM_TRIGGER_POST},
6079 .codec_dai_name = "snd-soc-dummy-dai",
6080 .codec_name = "snd-soc-dummy",
6081 .ignore_suspend = 1,
6082 .ignore_pmdown_time = 1,
6083 /* this dainlink has playback support */
6084 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
Arun Mirpuri149008c2019-07-17 17:49:49 -07006085 .ops = &msm_fe_qos_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006086 },
6087 {/* hw:x,30 */
6088 .name = "CDC_DMA Hostless",
6089 .stream_name = "CDC_DMA Hostless",
6090 .cpu_dai_name = "CDC_DMA_HOSTLESS",
6091 .platform_name = "msm-pcm-hostless",
6092 .dynamic = 1,
6093 .dpcm_playback = 1,
6094 .dpcm_capture = 1,
6095 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6096 SND_SOC_DPCM_TRIGGER_POST},
6097 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6098 .ignore_suspend = 1,
6099 /* this dailink has playback support */
6100 .ignore_pmdown_time = 1,
6101 .codec_dai_name = "snd-soc-dummy-dai",
6102 .codec_name = "snd-soc-dummy",
6103 },
6104 {/* hw:x,31 */
6105 .name = "TX3_CDC_DMA Hostless",
6106 .stream_name = "TX3_CDC_DMA Hostless",
6107 .cpu_dai_name = "TX3_CDC_DMA_HOSTLESS",
6108 .platform_name = "msm-pcm-hostless",
6109 .dynamic = 1,
6110 .dpcm_capture = 1,
6111 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6112 SND_SOC_DPCM_TRIGGER_POST},
6113 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6114 .ignore_suspend = 1,
6115 .codec_dai_name = "snd-soc-dummy-dai",
6116 .codec_name = "snd-soc-dummy",
6117 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08006118 {/* hw:x,32 */
6119 .name = "Tertiary MI2S TX_Hostless",
6120 .stream_name = "Tertiary MI2S_TX Hostless Capture",
6121 .cpu_dai_name = "TERT_MI2S_TX_HOSTLESS",
6122 .platform_name = "msm-pcm-hostless",
6123 .dynamic = 1,
6124 .dpcm_capture = 1,
6125 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6126 SND_SOC_DPCM_TRIGGER_POST},
6127 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6128 .ignore_suspend = 1,
6129 .ignore_pmdown_time = 1,
6130 .codec_dai_name = "snd-soc-dummy-dai",
6131 .codec_name = "snd-soc-dummy",
6132 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006133};
6134
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006135static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = {
Karthikeyan Manif0de7562019-03-04 16:39:41 -08006136 {/* hw:x,33 */
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006137 .name = LPASS_BE_WSA_CDC_DMA_TX_0,
6138 .stream_name = "WSA CDC DMA0 Capture",
6139 .cpu_dai_name = "msm-dai-cdc-dma-dev.45057",
6140 .platform_name = "msm-pcm-hostless",
6141 .codec_name = "bolero_codec",
6142 .codec_dai_name = "wsa_macro_vifeedback",
6143 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
6144 .be_hw_params_fixup = msm_be_hw_params_fixup,
6145 .ignore_suspend = 1,
6146 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6147 .ops = &msm_cdc_dma_be_ops,
6148 },
6149};
6150
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006151static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
Karthikeyan Manif0de7562019-03-04 16:39:41 -08006152 {/* hw:x,34 */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006153 .name = MSM_DAILINK_NAME(ASM Loopback),
6154 .stream_name = "MultiMedia6",
6155 .cpu_dai_name = "MultiMedia6",
6156 .platform_name = "msm-pcm-loopback",
6157 .dynamic = 1,
6158 .dpcm_playback = 1,
6159 .dpcm_capture = 1,
6160 .codec_dai_name = "snd-soc-dummy-dai",
6161 .codec_name = "snd-soc-dummy",
6162 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6163 SND_SOC_DPCM_TRIGGER_POST},
6164 .ignore_suspend = 1,
6165 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6166 .ignore_pmdown_time = 1,
6167 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
6168 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08006169 {/* hw:x,35 */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006170 .name = "USB Audio Hostless",
6171 .stream_name = "USB Audio Hostless",
6172 .cpu_dai_name = "USBAUDIO_HOSTLESS",
6173 .platform_name = "msm-pcm-hostless",
6174 .dynamic = 1,
6175 .dpcm_playback = 1,
6176 .dpcm_capture = 1,
6177 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6178 SND_SOC_DPCM_TRIGGER_POST},
6179 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6180 .ignore_suspend = 1,
6181 .ignore_pmdown_time = 1,
6182 .codec_dai_name = "snd-soc-dummy-dai",
6183 .codec_name = "snd-soc-dummy",
6184 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08006185 {/* hw:x,36 */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006186 .name = "SLIMBUS_7 Hostless",
6187 .stream_name = "SLIMBUS_7 Hostless",
6188 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
6189 .platform_name = "msm-pcm-hostless",
6190 .dynamic = 1,
6191 .dpcm_capture = 1,
6192 .dpcm_playback = 1,
6193 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6194 SND_SOC_DPCM_TRIGGER_POST},
6195 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6196 .ignore_suspend = 1,
6197 .ignore_pmdown_time = 1,
6198 .codec_dai_name = "snd-soc-dummy-dai",
6199 .codec_name = "snd-soc-dummy",
6200 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08006201 {/* hw:x,37 */
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006202 .name = "Compress Capture",
6203 .stream_name = "Compress9",
6204 .cpu_dai_name = "MultiMedia17",
6205 .platform_name = "msm-compress-dsp",
6206 .dynamic = 1,
6207 .dpcm_capture = 1,
6208 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6209 SND_SOC_DPCM_TRIGGER_POST},
6210 .codec_dai_name = "snd-soc-dummy-dai",
6211 .codec_name = "snd-soc-dummy",
6212 .ignore_suspend = 1,
6213 .ignore_pmdown_time = 1,
6214 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
6215 },
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05306216 {/* hw:x,38 */
6217 .name = "SLIMBUS_8 Hostless",
6218 .stream_name = "SLIMBUS_8 Hostless",
6219 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
6220 .platform_name = "msm-pcm-hostless",
6221 .dynamic = 1,
6222 .dpcm_capture = 1,
6223 .dpcm_playback = 1,
6224 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6225 SND_SOC_DPCM_TRIGGER_POST},
6226 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6227 .ignore_suspend = 1,
6228 .ignore_pmdown_time = 1,
6229 .codec_dai_name = "snd-soc-dummy-dai",
6230 .codec_name = "snd-soc-dummy",
6231 },
Karthikeyan Mani2176abc2019-07-11 14:41:05 -07006232 {/* hw:x,39 */
6233 .name = LPASS_BE_TX_CDC_DMA_TX_5,
6234 .stream_name = "TX CDC DMA5 Capture",
6235 .cpu_dai_name = "msm-dai-cdc-dma-dev.45115",
6236 .platform_name = "msm-pcm-hostless",
6237 .codec_name = "bolero_codec",
6238 .codec_dai_name = "tx_macro_tx3",
6239 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_5,
6240 .be_hw_params_fixup = msm_be_hw_params_fixup,
6241 .ignore_suspend = 1,
6242 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6243 .ops = &msm_cdc_dma_be_ops,
6244 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006245};
6246
6247static struct snd_soc_dai_link msm_common_be_dai_links[] = {
6248 /* Backend AFE DAI Links */
6249 {
6250 .name = LPASS_BE_AFE_PCM_RX,
6251 .stream_name = "AFE Playback",
6252 .cpu_dai_name = "msm-dai-q6-dev.224",
6253 .platform_name = "msm-pcm-routing",
6254 .codec_name = "msm-stub-codec.1",
6255 .codec_dai_name = "msm-stub-rx",
6256 .no_pcm = 1,
6257 .dpcm_playback = 1,
6258 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
6259 .be_hw_params_fixup = msm_be_hw_params_fixup,
6260 /* this dainlink has playback support */
6261 .ignore_pmdown_time = 1,
6262 .ignore_suspend = 1,
6263 },
6264 {
6265 .name = LPASS_BE_AFE_PCM_TX,
6266 .stream_name = "AFE Capture",
6267 .cpu_dai_name = "msm-dai-q6-dev.225",
6268 .platform_name = "msm-pcm-routing",
6269 .codec_name = "msm-stub-codec.1",
6270 .codec_dai_name = "msm-stub-tx",
6271 .no_pcm = 1,
6272 .dpcm_capture = 1,
6273 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
6274 .be_hw_params_fixup = msm_be_hw_params_fixup,
6275 .ignore_suspend = 1,
6276 },
6277 /* Incall Record Uplink BACK END DAI Link */
6278 {
6279 .name = LPASS_BE_INCALL_RECORD_TX,
6280 .stream_name = "Voice Uplink Capture",
6281 .cpu_dai_name = "msm-dai-q6-dev.32772",
6282 .platform_name = "msm-pcm-routing",
6283 .codec_name = "msm-stub-codec.1",
6284 .codec_dai_name = "msm-stub-tx",
6285 .no_pcm = 1,
6286 .dpcm_capture = 1,
6287 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
6288 .be_hw_params_fixup = msm_be_hw_params_fixup,
6289 .ignore_suspend = 1,
6290 },
6291 /* Incall Record Downlink BACK END DAI Link */
6292 {
6293 .name = LPASS_BE_INCALL_RECORD_RX,
6294 .stream_name = "Voice Downlink Capture",
6295 .cpu_dai_name = "msm-dai-q6-dev.32771",
6296 .platform_name = "msm-pcm-routing",
6297 .codec_name = "msm-stub-codec.1",
6298 .codec_dai_name = "msm-stub-tx",
6299 .no_pcm = 1,
6300 .dpcm_capture = 1,
6301 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
6302 .be_hw_params_fixup = msm_be_hw_params_fixup,
6303 .ignore_suspend = 1,
6304 },
6305 /* Incall Music BACK END DAI Link */
6306 {
6307 .name = LPASS_BE_VOICE_PLAYBACK_TX,
6308 .stream_name = "Voice Farend Playback",
6309 .cpu_dai_name = "msm-dai-q6-dev.32773",
6310 .platform_name = "msm-pcm-routing",
6311 .codec_name = "msm-stub-codec.1",
6312 .codec_dai_name = "msm-stub-rx",
6313 .no_pcm = 1,
6314 .dpcm_playback = 1,
6315 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
6316 .be_hw_params_fixup = msm_be_hw_params_fixup,
6317 .ignore_suspend = 1,
6318 .ignore_pmdown_time = 1,
6319 },
6320 /* Incall Music 2 BACK END DAI Link */
6321 {
6322 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
6323 .stream_name = "Voice2 Farend Playback",
6324 .cpu_dai_name = "msm-dai-q6-dev.32770",
6325 .platform_name = "msm-pcm-routing",
6326 .codec_name = "msm-stub-codec.1",
6327 .codec_dai_name = "msm-stub-rx",
6328 .no_pcm = 1,
6329 .dpcm_playback = 1,
6330 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
6331 .be_hw_params_fixup = msm_be_hw_params_fixup,
6332 .ignore_suspend = 1,
6333 .ignore_pmdown_time = 1,
6334 },
Jaideep Sharma2ef4fb22020-03-11 22:29:11 +05306335 /* Proxy Tx BACK END DAI Link */
6336 {
6337 .name = LPASS_BE_PROXY_TX,
6338 .stream_name = "Proxy Capture",
6339 .cpu_dai_name = "msm-dai-q6-dev.8195",
6340 .platform_name = "msm-pcm-routing",
6341 .codec_name = "msm-stub-codec.1",
6342 .codec_dai_name = "msm-stub-tx",
6343 .no_pcm = 1,
6344 .dpcm_capture = 1,
6345 .id = MSM_BACKEND_DAI_PROXY_TX,
6346 .ignore_suspend = 1,
6347 },
6348 /* Proxy Rx BACK END DAI Link */
6349 {
6350 .name = LPASS_BE_PROXY_RX,
6351 .stream_name = "Proxy Playback",
6352 .cpu_dai_name = "msm-dai-q6-dev.8194",
6353 .platform_name = "msm-pcm-routing",
6354 .codec_name = "msm-stub-codec.1",
6355 .codec_dai_name = "msm-stub-rx",
6356 .no_pcm = 1,
6357 .dpcm_playback = 1,
6358 .id = MSM_BACKEND_DAI_PROXY_RX,
6359 .ignore_pmdown_time = 1,
6360 .ignore_suspend = 1,
6361 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006362 {
6363 .name = LPASS_BE_USB_AUDIO_RX,
6364 .stream_name = "USB Audio Playback",
6365 .cpu_dai_name = "msm-dai-q6-dev.28672",
6366 .platform_name = "msm-pcm-routing",
6367 .codec_name = "msm-stub-codec.1",
6368 .codec_dai_name = "msm-stub-rx",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05306369 .dynamic_be = 1,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006370 .no_pcm = 1,
6371 .dpcm_playback = 1,
6372 .id = MSM_BACKEND_DAI_USB_RX,
6373 .be_hw_params_fixup = msm_be_hw_params_fixup,
6374 .ignore_pmdown_time = 1,
6375 .ignore_suspend = 1,
6376 },
6377 {
6378 .name = LPASS_BE_USB_AUDIO_TX,
6379 .stream_name = "USB Audio Capture",
6380 .cpu_dai_name = "msm-dai-q6-dev.28673",
6381 .platform_name = "msm-pcm-routing",
6382 .codec_name = "msm-stub-codec.1",
6383 .codec_dai_name = "msm-stub-tx",
6384 .no_pcm = 1,
6385 .dpcm_capture = 1,
6386 .id = MSM_BACKEND_DAI_USB_TX,
6387 .be_hw_params_fixup = msm_be_hw_params_fixup,
6388 .ignore_suspend = 1,
6389 },
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05306390};
6391
6392
6393static struct snd_soc_dai_link msm_tdm_be_dai_links[] = {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006394 {
6395 .name = LPASS_BE_PRI_TDM_RX_0,
6396 .stream_name = "Primary TDM0 Playback",
6397 .cpu_dai_name = "msm-dai-q6-tdm.36864",
6398 .platform_name = "msm-pcm-routing",
6399 .codec_name = "msm-stub-codec.1",
6400 .codec_dai_name = "msm-stub-rx",
6401 .no_pcm = 1,
6402 .dpcm_playback = 1,
6403 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
6404 .be_hw_params_fixup = msm_be_hw_params_fixup,
6405 .ops = &kona_tdm_be_ops,
6406 .ignore_suspend = 1,
6407 .ignore_pmdown_time = 1,
6408 },
6409 {
6410 .name = LPASS_BE_PRI_TDM_TX_0,
6411 .stream_name = "Primary TDM0 Capture",
6412 .cpu_dai_name = "msm-dai-q6-tdm.36865",
6413 .platform_name = "msm-pcm-routing",
6414 .codec_name = "msm-stub-codec.1",
6415 .codec_dai_name = "msm-stub-tx",
6416 .no_pcm = 1,
6417 .dpcm_capture = 1,
6418 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
6419 .be_hw_params_fixup = msm_be_hw_params_fixup,
6420 .ops = &kona_tdm_be_ops,
6421 .ignore_suspend = 1,
6422 },
6423 {
6424 .name = LPASS_BE_SEC_TDM_RX_0,
6425 .stream_name = "Secondary TDM0 Playback",
6426 .cpu_dai_name = "msm-dai-q6-tdm.36880",
6427 .platform_name = "msm-pcm-routing",
6428 .codec_name = "msm-stub-codec.1",
6429 .codec_dai_name = "msm-stub-rx",
6430 .no_pcm = 1,
6431 .dpcm_playback = 1,
6432 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
6433 .be_hw_params_fixup = msm_be_hw_params_fixup,
6434 .ops = &kona_tdm_be_ops,
6435 .ignore_suspend = 1,
6436 .ignore_pmdown_time = 1,
6437 },
6438 {
6439 .name = LPASS_BE_SEC_TDM_TX_0,
6440 .stream_name = "Secondary TDM0 Capture",
6441 .cpu_dai_name = "msm-dai-q6-tdm.36881",
6442 .platform_name = "msm-pcm-routing",
6443 .codec_name = "msm-stub-codec.1",
6444 .codec_dai_name = "msm-stub-tx",
6445 .no_pcm = 1,
6446 .dpcm_capture = 1,
6447 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
6448 .be_hw_params_fixup = msm_be_hw_params_fixup,
6449 .ops = &kona_tdm_be_ops,
6450 .ignore_suspend = 1,
6451 },
6452 {
6453 .name = LPASS_BE_TERT_TDM_RX_0,
6454 .stream_name = "Tertiary TDM0 Playback",
6455 .cpu_dai_name = "msm-dai-q6-tdm.36896",
6456 .platform_name = "msm-pcm-routing",
6457 .codec_name = "msm-stub-codec.1",
6458 .codec_dai_name = "msm-stub-rx",
6459 .no_pcm = 1,
6460 .dpcm_playback = 1,
6461 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
6462 .be_hw_params_fixup = msm_be_hw_params_fixup,
6463 .ops = &kona_tdm_be_ops,
6464 .ignore_suspend = 1,
6465 .ignore_pmdown_time = 1,
6466 },
6467 {
6468 .name = LPASS_BE_TERT_TDM_TX_0,
6469 .stream_name = "Tertiary TDM0 Capture",
6470 .cpu_dai_name = "msm-dai-q6-tdm.36897",
6471 .platform_name = "msm-pcm-routing",
6472 .codec_name = "msm-stub-codec.1",
6473 .codec_dai_name = "msm-stub-tx",
6474 .no_pcm = 1,
6475 .dpcm_capture = 1,
6476 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
6477 .be_hw_params_fixup = msm_be_hw_params_fixup,
6478 .ops = &kona_tdm_be_ops,
6479 .ignore_suspend = 1,
6480 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006481 {
6482 .name = LPASS_BE_QUAT_TDM_RX_0,
6483 .stream_name = "Quaternary TDM0 Playback",
6484 .cpu_dai_name = "msm-dai-q6-tdm.36912",
6485 .platform_name = "msm-pcm-routing",
6486 .codec_name = "msm-stub-codec.1",
6487 .codec_dai_name = "msm-stub-rx",
6488 .no_pcm = 1,
6489 .dpcm_playback = 1,
6490 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
6491 .be_hw_params_fixup = msm_be_hw_params_fixup,
6492 .ops = &kona_tdm_be_ops,
6493 .ignore_suspend = 1,
6494 .ignore_pmdown_time = 1,
6495 },
6496 {
6497 .name = LPASS_BE_QUAT_TDM_TX_0,
6498 .stream_name = "Quaternary TDM0 Capture",
6499 .cpu_dai_name = "msm-dai-q6-tdm.36913",
6500 .platform_name = "msm-pcm-routing",
6501 .codec_name = "msm-stub-codec.1",
6502 .codec_dai_name = "msm-stub-tx",
6503 .no_pcm = 1,
6504 .dpcm_capture = 1,
6505 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
6506 .be_hw_params_fixup = msm_be_hw_params_fixup,
6507 .ops = &kona_tdm_be_ops,
6508 .ignore_suspend = 1,
6509 },
6510 {
6511 .name = LPASS_BE_QUIN_TDM_RX_0,
6512 .stream_name = "Quinary TDM0 Playback",
6513 .cpu_dai_name = "msm-dai-q6-tdm.36928",
6514 .platform_name = "msm-pcm-routing",
6515 .codec_name = "msm-stub-codec.1",
6516 .codec_dai_name = "msm-stub-rx",
6517 .no_pcm = 1,
6518 .dpcm_playback = 1,
6519 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
6520 .be_hw_params_fixup = msm_be_hw_params_fixup,
6521 .ops = &kona_tdm_be_ops,
6522 .ignore_suspend = 1,
6523 .ignore_pmdown_time = 1,
6524 },
6525 {
6526 .name = LPASS_BE_QUIN_TDM_TX_0,
6527 .stream_name = "Quinary TDM0 Capture",
6528 .cpu_dai_name = "msm-dai-q6-tdm.36929",
6529 .platform_name = "msm-pcm-routing",
6530 .codec_name = "msm-stub-codec.1",
6531 .codec_dai_name = "msm-stub-tx",
6532 .no_pcm = 1,
6533 .dpcm_capture = 1,
6534 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
6535 .be_hw_params_fixup = msm_be_hw_params_fixup,
6536 .ops = &kona_tdm_be_ops,
6537 .ignore_suspend = 1,
6538 },
6539 {
6540 .name = LPASS_BE_SEN_TDM_RX_0,
6541 .stream_name = "Senary TDM0 Playback",
6542 .cpu_dai_name = "msm-dai-q6-tdm.36944",
6543 .platform_name = "msm-pcm-routing",
6544 .codec_name = "msm-stub-codec.1",
6545 .codec_dai_name = "msm-stub-rx",
6546 .no_pcm = 1,
6547 .dpcm_playback = 1,
6548 .id = MSM_BACKEND_DAI_SEN_TDM_RX_0,
6549 .be_hw_params_fixup = msm_be_hw_params_fixup,
6550 .ops = &kona_tdm_be_ops,
6551 .ignore_suspend = 1,
6552 .ignore_pmdown_time = 1,
6553 },
6554 {
6555 .name = LPASS_BE_SEN_TDM_TX_0,
6556 .stream_name = "Senary TDM0 Capture",
6557 .cpu_dai_name = "msm-dai-q6-tdm.36945",
6558 .platform_name = "msm-pcm-routing",
6559 .codec_name = "msm-stub-codec.1",
6560 .codec_dai_name = "msm-stub-tx",
6561 .no_pcm = 1,
6562 .dpcm_capture = 1,
6563 .id = MSM_BACKEND_DAI_SEN_TDM_TX_0,
6564 .be_hw_params_fixup = msm_be_hw_params_fixup,
6565 .ops = &kona_tdm_be_ops,
6566 .ignore_suspend = 1,
6567 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006568};
6569
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006570static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
6571 {
6572 .name = LPASS_BE_SLIMBUS_7_RX,
6573 .stream_name = "Slimbus7 Playback",
6574 .cpu_dai_name = "msm-dai-q6-dev.16398",
6575 .platform_name = "msm-pcm-routing",
6576 .codec_name = "btfmslim_slave",
6577 /* BT codec driver determines capabilities based on
6578 * dai name, bt codecdai name should always contains
6579 * supported usecase information
6580 */
6581 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
6582 .no_pcm = 1,
6583 .dpcm_playback = 1,
6584 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
6585 .be_hw_params_fixup = msm_be_hw_params_fixup,
6586 .init = &msm_wcn_init,
6587 .ops = &msm_wcn_ops,
6588 /* dai link has playback support */
6589 .ignore_pmdown_time = 1,
6590 .ignore_suspend = 1,
6591 },
6592 {
6593 .name = LPASS_BE_SLIMBUS_7_TX,
6594 .stream_name = "Slimbus7 Capture",
6595 .cpu_dai_name = "msm-dai-q6-dev.16399",
6596 .platform_name = "msm-pcm-routing",
6597 .codec_name = "btfmslim_slave",
6598 .codec_dai_name = "btfm_bt_sco_slim_tx",
6599 .no_pcm = 1,
6600 .dpcm_capture = 1,
6601 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
6602 .be_hw_params_fixup = msm_be_hw_params_fixup,
6603 .ops = &msm_wcn_ops,
6604 .ignore_suspend = 1,
6605 },
6606};
6607
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05306608static struct snd_soc_dai_link msm_wcn_btfm_be_dai_links[] = {
6609 {
6610 .name = LPASS_BE_SLIMBUS_7_RX,
6611 .stream_name = "Slimbus7 Playback",
6612 .cpu_dai_name = "msm-dai-q6-dev.16398",
6613 .platform_name = "msm-pcm-routing",
6614 .codec_name = "btfmslim_slave",
6615 /* BT codec driver determines capabilities based on
6616 * dai name, bt codecdai name should always contains
6617 * supported usecase information
6618 */
6619 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
6620 .no_pcm = 1,
6621 .dpcm_playback = 1,
6622 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
6623 .be_hw_params_fixup = msm_be_hw_params_fixup,
6624 .init = &msm_wcn_init_lito,
6625 .ops = &msm_wcn_ops_lito,
6626 /* dai link has playback support */
6627 .ignore_pmdown_time = 1,
6628 .ignore_suspend = 1,
6629 },
6630 {
6631 .name = LPASS_BE_SLIMBUS_7_TX,
6632 .stream_name = "Slimbus7 Capture",
6633 .cpu_dai_name = "msm-dai-q6-dev.16399",
6634 .platform_name = "msm-pcm-routing",
6635 .codec_name = "btfmslim_slave",
6636 .codec_dai_name = "btfm_bt_sco_slim_tx",
6637 .no_pcm = 1,
6638 .dpcm_capture = 1,
6639 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
6640 .be_hw_params_fixup = msm_be_hw_params_fixup,
6641 .ops = &msm_wcn_ops_lito,
6642 .ignore_suspend = 1,
6643 },
6644 {
6645 .name = LPASS_BE_SLIMBUS_8_TX,
6646 .stream_name = "Slimbus8 Capture",
6647 .cpu_dai_name = "msm-dai-q6-dev.16401",
6648 .platform_name = "msm-pcm-routing",
6649 .codec_name = "btfmslim_slave",
6650 .codec_dai_name = "btfm_fm_slim_tx",
6651 .no_pcm = 1,
6652 .dpcm_capture = 1,
6653 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
6654 .be_hw_params_fixup = msm_be_hw_params_fixup,
6655 .ops = &msm_wcn_ops_lito,
6656 .ignore_suspend = 1,
6657 },
6658};
6659
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006660static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
6661 /* DISP PORT BACK END DAI Link */
6662 {
6663 .name = LPASS_BE_DISPLAY_PORT,
6664 .stream_name = "Display Port Playback",
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -07006665 .cpu_dai_name = "msm-dai-q6-dp.0",
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006666 .platform_name = "msm-pcm-routing",
6667 .codec_name = "msm-ext-disp-audio-codec-rx",
6668 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
6669 .no_pcm = 1,
6670 .dpcm_playback = 1,
6671 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
6672 .be_hw_params_fixup = msm_be_hw_params_fixup,
6673 .ignore_pmdown_time = 1,
6674 .ignore_suspend = 1,
6675 },
6676 /* DISP PORT 1 BACK END DAI Link */
6677 {
6678 .name = LPASS_BE_DISPLAY_PORT1,
6679 .stream_name = "Display Port1 Playback",
Vignesh Kulothunganf86a3552019-07-11 15:46:25 -07006680 .cpu_dai_name = "msm-dai-q6-dp.1",
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006681 .platform_name = "msm-pcm-routing",
6682 .codec_name = "msm-ext-disp-audio-codec-rx",
6683 .codec_dai_name = "msm_dp_audio_codec_rx1_dai",
6684 .no_pcm = 1,
6685 .dpcm_playback = 1,
6686 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX_1,
6687 .be_hw_params_fixup = msm_be_hw_params_fixup,
6688 .ignore_pmdown_time = 1,
6689 .ignore_suspend = 1,
6690 },
6691};
6692
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006693static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
6694 {
6695 .name = LPASS_BE_PRI_MI2S_RX,
6696 .stream_name = "Primary MI2S Playback",
6697 .cpu_dai_name = "msm-dai-q6-mi2s.0",
6698 .platform_name = "msm-pcm-routing",
6699 .codec_name = "msm-stub-codec.1",
6700 .codec_dai_name = "msm-stub-rx",
6701 .no_pcm = 1,
6702 .dpcm_playback = 1,
6703 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
6704 .be_hw_params_fixup = msm_be_hw_params_fixup,
6705 .ops = &msm_mi2s_be_ops,
6706 .ignore_suspend = 1,
6707 .ignore_pmdown_time = 1,
6708 },
6709 {
6710 .name = LPASS_BE_PRI_MI2S_TX,
6711 .stream_name = "Primary MI2S Capture",
6712 .cpu_dai_name = "msm-dai-q6-mi2s.0",
6713 .platform_name = "msm-pcm-routing",
6714 .codec_name = "msm-stub-codec.1",
6715 .codec_dai_name = "msm-stub-tx",
6716 .no_pcm = 1,
6717 .dpcm_capture = 1,
6718 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
6719 .be_hw_params_fixup = msm_be_hw_params_fixup,
6720 .ops = &msm_mi2s_be_ops,
6721 .ignore_suspend = 1,
6722 },
6723 {
6724 .name = LPASS_BE_SEC_MI2S_RX,
6725 .stream_name = "Secondary MI2S Playback",
6726 .cpu_dai_name = "msm-dai-q6-mi2s.1",
6727 .platform_name = "msm-pcm-routing",
6728 .codec_name = "msm-stub-codec.1",
6729 .codec_dai_name = "msm-stub-rx",
6730 .no_pcm = 1,
6731 .dpcm_playback = 1,
6732 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
6733 .be_hw_params_fixup = msm_be_hw_params_fixup,
6734 .ops = &msm_mi2s_be_ops,
6735 .ignore_suspend = 1,
6736 .ignore_pmdown_time = 1,
6737 },
6738 {
6739 .name = LPASS_BE_SEC_MI2S_TX,
6740 .stream_name = "Secondary MI2S Capture",
6741 .cpu_dai_name = "msm-dai-q6-mi2s.1",
6742 .platform_name = "msm-pcm-routing",
6743 .codec_name = "msm-stub-codec.1",
6744 .codec_dai_name = "msm-stub-tx",
6745 .no_pcm = 1,
6746 .dpcm_capture = 1,
6747 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
6748 .be_hw_params_fixup = msm_be_hw_params_fixup,
6749 .ops = &msm_mi2s_be_ops,
6750 .ignore_suspend = 1,
6751 },
6752 {
6753 .name = LPASS_BE_TERT_MI2S_RX,
6754 .stream_name = "Tertiary MI2S Playback",
6755 .cpu_dai_name = "msm-dai-q6-mi2s.2",
6756 .platform_name = "msm-pcm-routing",
6757 .codec_name = "msm-stub-codec.1",
6758 .codec_dai_name = "msm-stub-rx",
6759 .no_pcm = 1,
6760 .dpcm_playback = 1,
6761 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
6762 .be_hw_params_fixup = msm_be_hw_params_fixup,
6763 .ops = &msm_mi2s_be_ops,
6764 .ignore_suspend = 1,
6765 .ignore_pmdown_time = 1,
6766 },
6767 {
6768 .name = LPASS_BE_TERT_MI2S_TX,
6769 .stream_name = "Tertiary MI2S Capture",
6770 .cpu_dai_name = "msm-dai-q6-mi2s.2",
6771 .platform_name = "msm-pcm-routing",
6772 .codec_name = "msm-stub-codec.1",
6773 .codec_dai_name = "msm-stub-tx",
6774 .no_pcm = 1,
6775 .dpcm_capture = 1,
6776 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
6777 .be_hw_params_fixup = msm_be_hw_params_fixup,
6778 .ops = &msm_mi2s_be_ops,
6779 .ignore_suspend = 1,
6780 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006781 {
6782 .name = LPASS_BE_QUAT_MI2S_RX,
6783 .stream_name = "Quaternary MI2S Playback",
6784 .cpu_dai_name = "msm-dai-q6-mi2s.3",
6785 .platform_name = "msm-pcm-routing",
6786 .codec_name = "msm-stub-codec.1",
6787 .codec_dai_name = "msm-stub-rx",
6788 .no_pcm = 1,
6789 .dpcm_playback = 1,
6790 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
6791 .be_hw_params_fixup = msm_be_hw_params_fixup,
6792 .ops = &msm_mi2s_be_ops,
6793 .ignore_suspend = 1,
6794 .ignore_pmdown_time = 1,
6795 },
6796 {
6797 .name = LPASS_BE_QUAT_MI2S_TX,
6798 .stream_name = "Quaternary MI2S Capture",
6799 .cpu_dai_name = "msm-dai-q6-mi2s.3",
6800 .platform_name = "msm-pcm-routing",
6801 .codec_name = "msm-stub-codec.1",
6802 .codec_dai_name = "msm-stub-tx",
6803 .no_pcm = 1,
6804 .dpcm_capture = 1,
6805 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
6806 .be_hw_params_fixup = msm_be_hw_params_fixup,
6807 .ops = &msm_mi2s_be_ops,
6808 .ignore_suspend = 1,
6809 },
6810 {
6811 .name = LPASS_BE_QUIN_MI2S_RX,
6812 .stream_name = "Quinary MI2S Playback",
6813 .cpu_dai_name = "msm-dai-q6-mi2s.4",
6814 .platform_name = "msm-pcm-routing",
6815 .codec_name = "msm-stub-codec.1",
6816 .codec_dai_name = "msm-stub-rx",
6817 .no_pcm = 1,
6818 .dpcm_playback = 1,
6819 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
6820 .be_hw_params_fixup = msm_be_hw_params_fixup,
6821 .ops = &msm_mi2s_be_ops,
6822 .ignore_suspend = 1,
6823 .ignore_pmdown_time = 1,
6824 },
6825 {
6826 .name = LPASS_BE_QUIN_MI2S_TX,
6827 .stream_name = "Quinary MI2S Capture",
6828 .cpu_dai_name = "msm-dai-q6-mi2s.4",
6829 .platform_name = "msm-pcm-routing",
6830 .codec_name = "msm-stub-codec.1",
6831 .codec_dai_name = "msm-stub-tx",
6832 .no_pcm = 1,
6833 .dpcm_capture = 1,
6834 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
6835 .be_hw_params_fixup = msm_be_hw_params_fixup,
6836 .ops = &msm_mi2s_be_ops,
6837 .ignore_suspend = 1,
6838 },
6839 {
6840 .name = LPASS_BE_SENARY_MI2S_RX,
6841 .stream_name = "Senary MI2S Playback",
6842 .cpu_dai_name = "msm-dai-q6-mi2s.5",
6843 .platform_name = "msm-pcm-routing",
6844 .codec_name = "msm-stub-codec.1",
6845 .codec_dai_name = "msm-stub-rx",
6846 .no_pcm = 1,
6847 .dpcm_playback = 1,
6848 .id = MSM_BACKEND_DAI_SENARY_MI2S_RX,
6849 .be_hw_params_fixup = msm_be_hw_params_fixup,
6850 .ops = &msm_mi2s_be_ops,
6851 .ignore_suspend = 1,
6852 .ignore_pmdown_time = 1,
6853 },
6854 {
6855 .name = LPASS_BE_SENARY_MI2S_TX,
6856 .stream_name = "Senary MI2S Capture",
6857 .cpu_dai_name = "msm-dai-q6-mi2s.5",
6858 .platform_name = "msm-pcm-routing",
6859 .codec_name = "msm-stub-codec.1",
6860 .codec_dai_name = "msm-stub-tx",
6861 .no_pcm = 1,
6862 .dpcm_capture = 1,
6863 .id = MSM_BACKEND_DAI_SENARY_MI2S_TX,
6864 .be_hw_params_fixup = msm_be_hw_params_fixup,
6865 .ops = &msm_mi2s_be_ops,
6866 .ignore_suspend = 1,
6867 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006868};
6869
6870static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
6871 /* Primary AUX PCM Backend DAI Links */
6872 {
6873 .name = LPASS_BE_AUXPCM_RX,
6874 .stream_name = "AUX PCM Playback",
6875 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
6876 .platform_name = "msm-pcm-routing",
6877 .codec_name = "msm-stub-codec.1",
6878 .codec_dai_name = "msm-stub-rx",
6879 .no_pcm = 1,
6880 .dpcm_playback = 1,
6881 .id = MSM_BACKEND_DAI_AUXPCM_RX,
6882 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006883 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006884 .ignore_pmdown_time = 1,
6885 .ignore_suspend = 1,
6886 },
6887 {
6888 .name = LPASS_BE_AUXPCM_TX,
6889 .stream_name = "AUX PCM Capture",
6890 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
6891 .platform_name = "msm-pcm-routing",
6892 .codec_name = "msm-stub-codec.1",
6893 .codec_dai_name = "msm-stub-tx",
6894 .no_pcm = 1,
6895 .dpcm_capture = 1,
6896 .id = MSM_BACKEND_DAI_AUXPCM_TX,
6897 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006898 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006899 .ignore_suspend = 1,
6900 },
6901 /* Secondary AUX PCM Backend DAI Links */
6902 {
6903 .name = LPASS_BE_SEC_AUXPCM_RX,
6904 .stream_name = "Sec AUX PCM Playback",
6905 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
6906 .platform_name = "msm-pcm-routing",
6907 .codec_name = "msm-stub-codec.1",
6908 .codec_dai_name = "msm-stub-rx",
6909 .no_pcm = 1,
6910 .dpcm_playback = 1,
6911 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
6912 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006913 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006914 .ignore_pmdown_time = 1,
6915 .ignore_suspend = 1,
6916 },
6917 {
6918 .name = LPASS_BE_SEC_AUXPCM_TX,
6919 .stream_name = "Sec AUX PCM Capture",
6920 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
6921 .platform_name = "msm-pcm-routing",
6922 .codec_name = "msm-stub-codec.1",
6923 .codec_dai_name = "msm-stub-tx",
6924 .no_pcm = 1,
6925 .dpcm_capture = 1,
6926 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
6927 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006928 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006929 .ignore_suspend = 1,
6930 },
6931 /* Tertiary AUX PCM Backend DAI Links */
6932 {
6933 .name = LPASS_BE_TERT_AUXPCM_RX,
6934 .stream_name = "Tert AUX PCM Playback",
6935 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
6936 .platform_name = "msm-pcm-routing",
6937 .codec_name = "msm-stub-codec.1",
6938 .codec_dai_name = "msm-stub-rx",
6939 .no_pcm = 1,
6940 .dpcm_playback = 1,
6941 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
6942 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006943 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006944 .ignore_suspend = 1,
6945 },
6946 {
6947 .name = LPASS_BE_TERT_AUXPCM_TX,
6948 .stream_name = "Tert AUX PCM Capture",
6949 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
6950 .platform_name = "msm-pcm-routing",
6951 .codec_name = "msm-stub-codec.1",
6952 .codec_dai_name = "msm-stub-tx",
6953 .no_pcm = 1,
6954 .dpcm_capture = 1,
6955 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
6956 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006957 .ops = &kona_aux_be_ops,
6958 .ignore_suspend = 1,
6959 },
6960 /* Quaternary AUX PCM Backend DAI Links */
6961 {
6962 .name = LPASS_BE_QUAT_AUXPCM_RX,
6963 .stream_name = "Quat AUX PCM Playback",
6964 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
6965 .platform_name = "msm-pcm-routing",
6966 .codec_name = "msm-stub-codec.1",
6967 .codec_dai_name = "msm-stub-rx",
6968 .no_pcm = 1,
6969 .dpcm_playback = 1,
6970 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
6971 .be_hw_params_fixup = msm_be_hw_params_fixup,
6972 .ops = &kona_aux_be_ops,
6973 .ignore_suspend = 1,
6974 },
6975 {
6976 .name = LPASS_BE_QUAT_AUXPCM_TX,
6977 .stream_name = "Quat AUX PCM Capture",
6978 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
6979 .platform_name = "msm-pcm-routing",
6980 .codec_name = "msm-stub-codec.1",
6981 .codec_dai_name = "msm-stub-tx",
6982 .no_pcm = 1,
6983 .dpcm_capture = 1,
6984 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
6985 .be_hw_params_fixup = msm_be_hw_params_fixup,
6986 .ops = &kona_aux_be_ops,
6987 .ignore_suspend = 1,
6988 },
6989 /* Quinary AUX PCM Backend DAI Links */
6990 {
6991 .name = LPASS_BE_QUIN_AUXPCM_RX,
6992 .stream_name = "Quin AUX PCM Playback",
6993 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
6994 .platform_name = "msm-pcm-routing",
6995 .codec_name = "msm-stub-codec.1",
6996 .codec_dai_name = "msm-stub-rx",
6997 .no_pcm = 1,
6998 .dpcm_playback = 1,
6999 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
7000 .be_hw_params_fixup = msm_be_hw_params_fixup,
7001 .ops = &kona_aux_be_ops,
7002 .ignore_suspend = 1,
7003 },
7004 {
7005 .name = LPASS_BE_QUIN_AUXPCM_TX,
7006 .stream_name = "Quin AUX PCM Capture",
7007 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
7008 .platform_name = "msm-pcm-routing",
7009 .codec_name = "msm-stub-codec.1",
7010 .codec_dai_name = "msm-stub-tx",
7011 .no_pcm = 1,
7012 .dpcm_capture = 1,
7013 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
7014 .be_hw_params_fixup = msm_be_hw_params_fixup,
7015 .ops = &kona_aux_be_ops,
7016 .ignore_suspend = 1,
7017 },
7018 /* Senary AUX PCM Backend DAI Links */
7019 {
7020 .name = LPASS_BE_SEN_AUXPCM_RX,
7021 .stream_name = "Sen AUX PCM Playback",
7022 .cpu_dai_name = "msm-dai-q6-auxpcm.6",
7023 .platform_name = "msm-pcm-routing",
7024 .codec_name = "msm-stub-codec.1",
7025 .codec_dai_name = "msm-stub-rx",
7026 .no_pcm = 1,
7027 .dpcm_playback = 1,
7028 .id = MSM_BACKEND_DAI_SEN_AUXPCM_RX,
7029 .be_hw_params_fixup = msm_be_hw_params_fixup,
7030 .ops = &kona_aux_be_ops,
7031 .ignore_suspend = 1,
7032 },
7033 {
7034 .name = LPASS_BE_SEN_AUXPCM_TX,
7035 .stream_name = "Sen AUX PCM Capture",
7036 .cpu_dai_name = "msm-dai-q6-auxpcm.6",
7037 .platform_name = "msm-pcm-routing",
7038 .codec_name = "msm-stub-codec.1",
7039 .codec_dai_name = "msm-stub-tx",
7040 .no_pcm = 1,
7041 .dpcm_capture = 1,
7042 .id = MSM_BACKEND_DAI_SEN_AUXPCM_TX,
7043 .be_hw_params_fixup = msm_be_hw_params_fixup,
7044 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007045 .ignore_suspend = 1,
7046 },
7047};
7048
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007049static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = {
7050 /* WSA CDC DMA Backend DAI Links */
7051 {
7052 .name = LPASS_BE_WSA_CDC_DMA_RX_0,
7053 .stream_name = "WSA CDC DMA0 Playback",
7054 .cpu_dai_name = "msm-dai-cdc-dma-dev.45056",
7055 .platform_name = "msm-pcm-routing",
7056 .codec_name = "bolero_codec",
7057 .codec_dai_name = "wsa_macro_rx1",
7058 .no_pcm = 1,
7059 .dpcm_playback = 1,
7060 .init = &msm_int_audrx_init,
7061 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
7062 .be_hw_params_fixup = msm_be_hw_params_fixup,
7063 .ignore_pmdown_time = 1,
7064 .ignore_suspend = 1,
7065 .ops = &msm_cdc_dma_be_ops,
7066 },
7067 {
7068 .name = LPASS_BE_WSA_CDC_DMA_RX_1,
7069 .stream_name = "WSA CDC DMA1 Playback",
7070 .cpu_dai_name = "msm-dai-cdc-dma-dev.45058",
7071 .platform_name = "msm-pcm-routing",
7072 .codec_name = "bolero_codec",
7073 .codec_dai_name = "wsa_macro_rx_mix",
7074 .no_pcm = 1,
7075 .dpcm_playback = 1,
7076 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1,
7077 .be_hw_params_fixup = msm_be_hw_params_fixup,
7078 .ignore_pmdown_time = 1,
7079 .ignore_suspend = 1,
7080 .ops = &msm_cdc_dma_be_ops,
7081 },
7082 {
7083 .name = LPASS_BE_WSA_CDC_DMA_TX_1,
7084 .stream_name = "WSA CDC DMA1 Capture",
7085 .cpu_dai_name = "msm-dai-cdc-dma-dev.45059",
7086 .platform_name = "msm-pcm-routing",
7087 .codec_name = "bolero_codec",
7088 .codec_dai_name = "wsa_macro_echo",
7089 .no_pcm = 1,
7090 .dpcm_capture = 1,
7091 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1,
7092 .be_hw_params_fixup = msm_be_hw_params_fixup,
7093 .ignore_suspend = 1,
7094 .ops = &msm_cdc_dma_be_ops,
7095 },
7096};
7097
7098static struct snd_soc_dai_link msm_rx_tx_cdc_dma_be_dai_links[] = {
7099 /* RX CDC DMA Backend DAI Links */
7100 {
7101 .name = LPASS_BE_RX_CDC_DMA_RX_0,
7102 .stream_name = "RX CDC DMA0 Playback",
7103 .cpu_dai_name = "msm-dai-cdc-dma-dev.45104",
7104 .platform_name = "msm-pcm-routing",
7105 .codec_name = "bolero_codec",
7106 .codec_dai_name = "rx_macro_rx1",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05307107 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007108 .no_pcm = 1,
7109 .dpcm_playback = 1,
7110 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_0,
7111 .be_hw_params_fixup = msm_be_hw_params_fixup,
7112 .ignore_pmdown_time = 1,
7113 .ignore_suspend = 1,
7114 .ops = &msm_cdc_dma_be_ops,
7115 },
7116 {
7117 .name = LPASS_BE_RX_CDC_DMA_RX_1,
7118 .stream_name = "RX CDC DMA1 Playback",
7119 .cpu_dai_name = "msm-dai-cdc-dma-dev.45106",
7120 .platform_name = "msm-pcm-routing",
7121 .codec_name = "bolero_codec",
7122 .codec_dai_name = "rx_macro_rx2",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05307123 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007124 .no_pcm = 1,
7125 .dpcm_playback = 1,
7126 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
7127 .be_hw_params_fixup = msm_be_hw_params_fixup,
7128 .ignore_pmdown_time = 1,
7129 .ignore_suspend = 1,
7130 .ops = &msm_cdc_dma_be_ops,
7131 },
7132 {
7133 .name = LPASS_BE_RX_CDC_DMA_RX_2,
7134 .stream_name = "RX CDC DMA2 Playback",
7135 .cpu_dai_name = "msm-dai-cdc-dma-dev.45108",
7136 .platform_name = "msm-pcm-routing",
7137 .codec_name = "bolero_codec",
7138 .codec_dai_name = "rx_macro_rx3",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05307139 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007140 .no_pcm = 1,
7141 .dpcm_playback = 1,
7142 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_2,
7143 .be_hw_params_fixup = msm_be_hw_params_fixup,
7144 .ignore_pmdown_time = 1,
7145 .ignore_suspend = 1,
7146 .ops = &msm_cdc_dma_be_ops,
7147 },
7148 {
7149 .name = LPASS_BE_RX_CDC_DMA_RX_3,
7150 .stream_name = "RX CDC DMA3 Playback",
7151 .cpu_dai_name = "msm-dai-cdc-dma-dev.45110",
7152 .platform_name = "msm-pcm-routing",
7153 .codec_name = "bolero_codec",
7154 .codec_dai_name = "rx_macro_rx4",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05307155 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007156 .no_pcm = 1,
7157 .dpcm_playback = 1,
7158 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_3,
7159 .be_hw_params_fixup = msm_be_hw_params_fixup,
7160 .ignore_pmdown_time = 1,
7161 .ignore_suspend = 1,
7162 .ops = &msm_cdc_dma_be_ops,
7163 },
7164 /* TX CDC DMA Backend DAI Links */
7165 {
7166 .name = LPASS_BE_TX_CDC_DMA_TX_3,
7167 .stream_name = "TX CDC DMA3 Capture",
7168 .cpu_dai_name = "msm-dai-cdc-dma-dev.45111",
7169 .platform_name = "msm-pcm-routing",
7170 .codec_name = "bolero_codec",
7171 .codec_dai_name = "tx_macro_tx1",
7172 .no_pcm = 1,
7173 .dpcm_capture = 1,
7174 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
7175 .be_hw_params_fixup = msm_be_hw_params_fixup,
7176 .ignore_suspend = 1,
7177 .ops = &msm_cdc_dma_be_ops,
7178 },
7179 {
7180 .name = LPASS_BE_TX_CDC_DMA_TX_4,
7181 .stream_name = "TX CDC DMA4 Capture",
7182 .cpu_dai_name = "msm-dai-cdc-dma-dev.45113",
7183 .platform_name = "msm-pcm-routing",
7184 .codec_name = "bolero_codec",
7185 .codec_dai_name = "tx_macro_tx2",
7186 .no_pcm = 1,
7187 .dpcm_capture = 1,
7188 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_4,
7189 .be_hw_params_fixup = msm_be_hw_params_fixup,
7190 .ignore_suspend = 1,
7191 .ops = &msm_cdc_dma_be_ops,
7192 },
7193};
7194
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08007195static struct snd_soc_dai_link msm_va_cdc_dma_be_dai_links[] = {
7196 {
7197 .name = LPASS_BE_VA_CDC_DMA_TX_0,
7198 .stream_name = "VA CDC DMA0 Capture",
7199 .cpu_dai_name = "msm-dai-cdc-dma-dev.45089",
7200 .platform_name = "msm-pcm-routing",
7201 .codec_name = "bolero_codec",
7202 .codec_dai_name = "va_macro_tx1",
7203 .no_pcm = 1,
7204 .dpcm_capture = 1,
7205 .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_0,
7206 .be_hw_params_fixup = msm_be_hw_params_fixup,
7207 .ignore_suspend = 1,
7208 .ops = &msm_cdc_dma_be_ops,
7209 },
7210 {
7211 .name = LPASS_BE_VA_CDC_DMA_TX_1,
7212 .stream_name = "VA CDC DMA1 Capture",
7213 .cpu_dai_name = "msm-dai-cdc-dma-dev.45091",
7214 .platform_name = "msm-pcm-routing",
7215 .codec_name = "bolero_codec",
7216 .codec_dai_name = "va_macro_tx2",
7217 .no_pcm = 1,
7218 .dpcm_capture = 1,
7219 .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_1,
7220 .be_hw_params_fixup = msm_be_hw_params_fixup,
7221 .ignore_suspend = 1,
7222 .ops = &msm_cdc_dma_be_ops,
7223 },
7224 {
7225 .name = LPASS_BE_VA_CDC_DMA_TX_2,
7226 .stream_name = "VA CDC DMA2 Capture",
7227 .cpu_dai_name = "msm-dai-cdc-dma-dev.45093",
7228 .platform_name = "msm-pcm-routing",
7229 .codec_name = "bolero_codec",
7230 .codec_dai_name = "va_macro_tx3",
7231 .no_pcm = 1,
7232 .dpcm_capture = 1,
7233 .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_2,
7234 .be_hw_params_fixup = msm_be_hw_params_fixup,
7235 .ignore_suspend = 1,
7236 .ops = &msm_cdc_dma_be_ops,
7237 },
7238};
7239
Meng Wange8e53822019-03-18 10:49:50 +08007240static struct snd_soc_dai_link msm_afe_rxtx_lb_be_dai_link[] = {
7241 {
7242 .name = LPASS_BE_AFE_LOOPBACK_TX,
7243 .stream_name = "AFE Loopback Capture",
7244 .cpu_dai_name = "msm-dai-q6-dev.24577",
7245 .platform_name = "msm-pcm-routing",
7246 .codec_name = "msm-stub-codec.1",
7247 .codec_dai_name = "msm-stub-tx",
7248 .no_pcm = 1,
7249 .dpcm_capture = 1,
7250 .id = MSM_BACKEND_DAI_AFE_LOOPBACK_TX,
7251 .be_hw_params_fixup = msm_be_hw_params_fixup,
7252 .ignore_pmdown_time = 1,
7253 .ignore_suspend = 1,
7254 },
7255};
7256
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007257static struct snd_soc_dai_link msm_kona_dai_links[
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007258 ARRAY_SIZE(msm_common_dai_links) +
7259 ARRAY_SIZE(msm_bolero_fe_dai_links) +
7260 ARRAY_SIZE(msm_common_misc_fe_dai_links) +
7261 ARRAY_SIZE(msm_common_be_dai_links) +
7262 ARRAY_SIZE(msm_mi2s_be_dai_links) +
7263 ARRAY_SIZE(msm_auxpcm_be_dai_links) +
7264 ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) +
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08007265 ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links) +
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08007266 ARRAY_SIZE(msm_va_cdc_dma_be_dai_links) +
7267 ARRAY_SIZE(ext_disp_be_dai_link) +
Meng Wange8e53822019-03-18 10:49:50 +08007268 ARRAY_SIZE(msm_wcn_be_dai_links) +
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05307269 ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) +
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05307270 ARRAY_SIZE(msm_wcn_btfm_be_dai_links) +
7271 ARRAY_SIZE(msm_tdm_be_dai_links)];
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007272
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007273static int msm_populate_dai_link_component_of_node(
7274 struct snd_soc_card *card)
7275{
7276 int i, index, ret = 0;
7277 struct device *cdev = card->dev;
7278 struct snd_soc_dai_link *dai_link = card->dai_link;
7279 struct device_node *np;
7280
7281 if (!cdev) {
7282 dev_err(cdev, "%s: Sound card device memory NULL\n", __func__);
7283 return -ENODEV;
7284 }
7285
7286 for (i = 0; i < card->num_links; i++) {
7287 if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node)
7288 continue;
7289
7290 /* populate platform_of_node for snd card dai links */
7291 if (dai_link[i].platform_name &&
7292 !dai_link[i].platform_of_node) {
7293 index = of_property_match_string(cdev->of_node,
7294 "asoc-platform-names",
7295 dai_link[i].platform_name);
7296 if (index < 0) {
7297 dev_err(cdev, "%s: No match found for platform name: %s\n",
7298 __func__, dai_link[i].platform_name);
7299 ret = index;
7300 goto err;
7301 }
7302 np = of_parse_phandle(cdev->of_node, "asoc-platform",
7303 index);
7304 if (!np) {
7305 dev_err(cdev, "%s: retrieving phandle for platform %s, index %d failed\n",
7306 __func__, dai_link[i].platform_name,
7307 index);
7308 ret = -ENODEV;
7309 goto err;
7310 }
7311 dai_link[i].platform_of_node = np;
7312 dai_link[i].platform_name = NULL;
7313 }
7314
7315 /* populate cpu_of_node for snd card dai links */
7316 if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) {
7317 index = of_property_match_string(cdev->of_node,
7318 "asoc-cpu-names",
7319 dai_link[i].cpu_dai_name);
7320 if (index >= 0) {
7321 np = of_parse_phandle(cdev->of_node, "asoc-cpu",
7322 index);
7323 if (!np) {
7324 dev_err(cdev, "%s: retrieving phandle for cpu dai %s failed\n",
7325 __func__,
7326 dai_link[i].cpu_dai_name);
7327 ret = -ENODEV;
7328 goto err;
7329 }
7330 dai_link[i].cpu_of_node = np;
7331 dai_link[i].cpu_dai_name = NULL;
7332 }
7333 }
7334
7335 /* populate codec_of_node for snd card dai links */
7336 if (dai_link[i].codec_name && !dai_link[i].codec_of_node) {
7337 index = of_property_match_string(cdev->of_node,
7338 "asoc-codec-names",
7339 dai_link[i].codec_name);
7340 if (index < 0)
7341 continue;
7342 np = of_parse_phandle(cdev->of_node, "asoc-codec",
7343 index);
7344 if (!np) {
7345 dev_err(cdev, "%s: retrieving phandle for codec %s failed\n",
7346 __func__, dai_link[i].codec_name);
7347 ret = -ENODEV;
7348 goto err;
7349 }
7350 dai_link[i].codec_of_node = np;
7351 dai_link[i].codec_name = NULL;
7352 }
7353 }
7354
7355err:
7356 return ret;
7357}
7358
7359static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd)
7360{
7361 int ret = -EINVAL;
7362 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, "msm-stub-codec");
7363
7364 if (!component) {
7365 pr_err("* %s: No match for msm-stub-codec component\n", __func__);
7366 return ret;
7367 }
7368
7369 ret = snd_soc_add_component_controls(component, msm_snd_controls,
7370 ARRAY_SIZE(msm_snd_controls));
7371 if (ret < 0) {
7372 dev_err(component->dev,
7373 "%s: add_codec_controls failed, err = %d\n",
7374 __func__, ret);
7375 return ret;
7376 }
7377
7378 return ret;
7379}
7380
7381static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream,
7382 struct snd_pcm_hw_params *params)
7383{
7384 return 0;
7385}
7386
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007387static struct snd_soc_ops msm_stub_be_ops = {
7388 .hw_params = msm_snd_stub_hw_params,
7389};
7390
7391struct snd_soc_card snd_soc_card_stub_msm = {
7392 .name = "kona-stub-snd-card",
7393};
7394
7395static struct snd_soc_dai_link msm_stub_fe_dai_links[] = {
7396 /* FrontEnd DAI Links */
7397 {
7398 .name = "MSMSTUB Media1",
7399 .stream_name = "MultiMedia1",
7400 .cpu_dai_name = "MultiMedia1",
7401 .platform_name = "msm-pcm-dsp.0",
7402 .dynamic = 1,
7403 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
7404 .dpcm_playback = 1,
7405 .dpcm_capture = 1,
7406 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
7407 SND_SOC_DPCM_TRIGGER_POST},
7408 .codec_dai_name = "snd-soc-dummy-dai",
7409 .codec_name = "snd-soc-dummy",
7410 .ignore_suspend = 1,
7411 /* this dainlink has playback support */
7412 .ignore_pmdown_time = 1,
7413 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
7414 },
7415};
7416
7417static struct snd_soc_dai_link msm_stub_be_dai_links[] = {
7418 /* Backend DAI Links */
7419 {
7420 .name = LPASS_BE_AUXPCM_RX,
7421 .stream_name = "AUX PCM Playback",
7422 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
7423 .platform_name = "msm-pcm-routing",
7424 .codec_name = "msm-stub-codec.1",
7425 .codec_dai_name = "msm-stub-rx",
7426 .no_pcm = 1,
7427 .dpcm_playback = 1,
7428 .id = MSM_BACKEND_DAI_AUXPCM_RX,
7429 .init = &msm_audrx_stub_init,
7430 .be_hw_params_fixup = msm_be_hw_params_fixup,
7431 .ignore_pmdown_time = 1,
7432 .ignore_suspend = 1,
7433 .ops = &msm_stub_be_ops,
7434 },
7435 {
7436 .name = LPASS_BE_AUXPCM_TX,
7437 .stream_name = "AUX PCM Capture",
7438 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
7439 .platform_name = "msm-pcm-routing",
7440 .codec_name = "msm-stub-codec.1",
7441 .codec_dai_name = "msm-stub-tx",
7442 .no_pcm = 1,
7443 .dpcm_capture = 1,
7444 .id = MSM_BACKEND_DAI_AUXPCM_TX,
7445 .be_hw_params_fixup = msm_be_hw_params_fixup,
7446 .ignore_suspend = 1,
7447 .ops = &msm_stub_be_ops,
7448 },
7449};
7450
7451static struct snd_soc_dai_link msm_stub_dai_links[
7452 ARRAY_SIZE(msm_stub_fe_dai_links) +
7453 ARRAY_SIZE(msm_stub_be_dai_links)];
7454
7455static const struct of_device_id kona_asoc_machine_of_match[] = {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007456 { .compatible = "qcom,kona-asoc-snd",
7457 .data = "codec"},
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007458 { .compatible = "qcom,kona-asoc-snd-stub",
7459 .data = "stub_codec"},
7460 {},
7461};
7462
7463static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
7464{
7465 struct snd_soc_card *card = NULL;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007466 struct snd_soc_dai_link *dailink = NULL;
7467 int len_1 = 0;
7468 int len_2 = 0;
7469 int total_links = 0;
7470 int rc = 0;
7471 u32 mi2s_audio_intf = 0;
7472 u32 auxpcm_audio_intf = 0;
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08007473 u32 val = 0;
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05307474 u32 wcn_btfm_intf = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007475 const struct of_device_id *match;
7476
7477 match = of_match_node(kona_asoc_machine_of_match, dev->of_node);
7478 if (!match) {
7479 dev_err(dev, "%s: No DT match found for sound card\n",
7480 __func__);
7481 return NULL;
7482 }
7483
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007484 if (!strcmp(match->data, "codec")) {
7485 card = &snd_soc_card_kona_msm;
7486
7487 memcpy(msm_kona_dai_links + total_links,
7488 msm_common_dai_links,
7489 sizeof(msm_common_dai_links));
7490 total_links += ARRAY_SIZE(msm_common_dai_links);
7491
7492 memcpy(msm_kona_dai_links + total_links,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007493 msm_bolero_fe_dai_links,
7494 sizeof(msm_bolero_fe_dai_links));
7495 total_links +=
7496 ARRAY_SIZE(msm_bolero_fe_dai_links);
7497
7498 memcpy(msm_kona_dai_links + total_links,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007499 msm_common_misc_fe_dai_links,
7500 sizeof(msm_common_misc_fe_dai_links));
7501 total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links);
7502
7503 memcpy(msm_kona_dai_links + total_links,
7504 msm_common_be_dai_links,
7505 sizeof(msm_common_be_dai_links));
7506 total_links += ARRAY_SIZE(msm_common_be_dai_links);
7507
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007508 memcpy(msm_kona_dai_links + total_links,
7509 msm_wsa_cdc_dma_be_dai_links,
7510 sizeof(msm_wsa_cdc_dma_be_dai_links));
7511 total_links +=
7512 ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links);
7513
7514 memcpy(msm_kona_dai_links + total_links,
7515 msm_rx_tx_cdc_dma_be_dai_links,
7516 sizeof(msm_rx_tx_cdc_dma_be_dai_links));
7517 total_links +=
7518 ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links);
7519
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08007520 memcpy(msm_kona_dai_links + total_links,
7521 msm_va_cdc_dma_be_dai_links,
7522 sizeof(msm_va_cdc_dma_be_dai_links));
7523 total_links +=
7524 ARRAY_SIZE(msm_va_cdc_dma_be_dai_links);
7525
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007526 rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf",
7527 &mi2s_audio_intf);
7528 if (rc) {
7529 dev_dbg(dev, "%s: No DT match MI2S audio interface\n",
7530 __func__);
7531 } else {
7532 if (mi2s_audio_intf) {
7533 memcpy(msm_kona_dai_links + total_links,
7534 msm_mi2s_be_dai_links,
7535 sizeof(msm_mi2s_be_dai_links));
7536 total_links +=
7537 ARRAY_SIZE(msm_mi2s_be_dai_links);
7538 }
7539 }
7540
7541 rc = of_property_read_u32(dev->of_node,
7542 "qcom,auxpcm-audio-intf",
7543 &auxpcm_audio_intf);
7544 if (rc) {
7545 dev_dbg(dev, "%s: No DT match Aux PCM interface\n",
7546 __func__);
7547 } else {
7548 if (auxpcm_audio_intf) {
7549 memcpy(msm_kona_dai_links + total_links,
7550 msm_auxpcm_be_dai_links,
7551 sizeof(msm_auxpcm_be_dai_links));
7552 total_links +=
7553 ARRAY_SIZE(msm_auxpcm_be_dai_links);
7554 }
7555 }
7556
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08007557 rc = of_property_read_u32(dev->of_node,
7558 "qcom,ext-disp-audio-rx", &val);
7559 if (!rc && val) {
7560 dev_dbg(dev, "%s(): ext disp audio support present\n",
7561 __func__);
7562 memcpy(msm_kona_dai_links + total_links,
7563 ext_disp_be_dai_link,
7564 sizeof(ext_disp_be_dai_link));
7565 total_links += ARRAY_SIZE(ext_disp_be_dai_link);
7566 }
7567
7568 rc = of_property_read_u32(dev->of_node, "qcom,wcn-bt", &val);
7569 if (!rc && val) {
7570 dev_dbg(dev, "%s(): WCN BT support present\n",
7571 __func__);
7572 memcpy(msm_kona_dai_links + total_links,
7573 msm_wcn_be_dai_links,
7574 sizeof(msm_wcn_be_dai_links));
7575 total_links += ARRAY_SIZE(msm_wcn_be_dai_links);
7576 }
7577
Meng Wange8e53822019-03-18 10:49:50 +08007578 rc = of_property_read_u32(dev->of_node, "qcom,afe-rxtx-lb",
7579 &val);
7580 if (!rc && val) {
7581 memcpy(msm_kona_dai_links + total_links,
7582 msm_afe_rxtx_lb_be_dai_link,
7583 sizeof(msm_afe_rxtx_lb_be_dai_link));
7584 total_links +=
7585 ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link);
7586 }
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05307587
Aditya Bavanari2d763ba2020-02-17 13:26:50 +05307588 rc = of_property_read_u32(dev->of_node, "qcom,tdm-audio-intf",
7589 &val);
7590 if (!rc && val) {
7591 memcpy(msm_kona_dai_links + total_links,
7592 msm_tdm_be_dai_links,
7593 sizeof(msm_tdm_be_dai_links));
7594 total_links +=
7595 ARRAY_SIZE(msm_tdm_be_dai_links);
7596 }
7597
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05307598 rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm",
7599 &wcn_btfm_intf);
7600 if (rc) {
7601 dev_dbg(dev, "%s: No DT match wcn btfm interface\n",
7602 __func__);
7603 } else {
7604 if (wcn_btfm_intf) {
7605 memcpy(msm_kona_dai_links + total_links,
7606 msm_wcn_btfm_be_dai_links,
7607 sizeof(msm_wcn_btfm_be_dai_links));
7608 total_links +=
7609 ARRAY_SIZE(msm_wcn_btfm_be_dai_links);
7610 }
7611 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007612 dailink = msm_kona_dai_links;
7613 } else if(!strcmp(match->data, "stub_codec")) {
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007614 card = &snd_soc_card_stub_msm;
7615 len_1 = ARRAY_SIZE(msm_stub_fe_dai_links);
7616 len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links);
7617
7618 memcpy(msm_stub_dai_links,
7619 msm_stub_fe_dai_links,
7620 sizeof(msm_stub_fe_dai_links));
7621 memcpy(msm_stub_dai_links + len_1,
7622 msm_stub_be_dai_links,
7623 sizeof(msm_stub_be_dai_links));
7624
7625 dailink = msm_stub_dai_links;
7626 total_links = len_2;
7627 }
7628
7629 if (card) {
7630 card->dai_link = dailink;
7631 card->num_links = total_links;
7632 }
7633
7634 return card;
7635}
7636
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007637static int msm_wsa881x_init(struct snd_soc_component *component)
7638{
7639 u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
7640 u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
7641 u8 spkleft_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP,
7642 SPKR_L_BOOST, SPKR_L_VI};
7643 u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
7644 SPKR_R_BOOST, SPKR_R_VI};
7645 unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
7646 unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
7647 struct msm_asoc_mach_data *pdata;
7648 struct snd_soc_dapm_context *dapm;
7649 struct snd_card *card;
7650 struct snd_info_entry *entry;
7651 int ret = 0;
7652
7653 if (!component) {
7654 pr_err("%s component is NULL\n", __func__);
7655 return -EINVAL;
7656 }
7657
7658 card = component->card->snd_card;
7659 dapm = snd_soc_component_get_dapm(component);
7660
7661 if (!strcmp(component->name_prefix, "SpkrLeft")) {
7662 dev_dbg(component->dev, "%s: setting left ch map to codec %s\n",
7663 __func__, component->name);
Laxminath Kasam99690f12020-03-15 15:38:21 +05307664 if (strnstr(component->name, "wsa883x", sizeof(component->name)))
7665 wsa883x_set_channel_map(component, &spkleft_ports[0],
7666 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
7667 &ch_rate[0], &spkleft_port_types[0]);
7668 else
7669 wsa881x_set_channel_map(component, &spkleft_ports[0],
7670 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
7671 &ch_rate[0], &spkleft_port_types[0]);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007672 if (dapm->component) {
7673 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
7674 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR");
7675 }
7676 } else if (!strcmp(component->name_prefix, "SpkrRight")) {
7677 dev_dbg(component->dev, "%s: setting right ch map to codec %s\n",
7678 __func__, component->name);
Laxminath Kasam99690f12020-03-15 15:38:21 +05307679 if (strnstr(component->name, "wsa883x", sizeof(component->name)))
7680 wsa883x_set_channel_map(component, &spkright_ports[0],
7681 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
7682 &ch_rate[0], &spkright_port_types[0]);
7683 else
7684 wsa881x_set_channel_map(component, &spkright_ports[0],
7685 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
7686 &ch_rate[0], &spkright_port_types[0]);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007687 if (dapm->component) {
7688 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
7689 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR");
7690 }
7691 } else {
7692 dev_err(component->dev, "%s: wrong codec name %s\n", __func__,
7693 component->name);
7694 ret = -EINVAL;
7695 goto err;
7696 }
7697 pdata = snd_soc_card_get_drvdata(component->card);
7698 if (!pdata->codec_root) {
7699 entry = snd_info_create_subdir(card->module, "codecs",
7700 card->proc_root);
7701 if (!entry) {
7702 pr_err("%s: Cannot create codecs module entry\n",
7703 __func__);
7704 ret = 0;
7705 goto err;
7706 }
7707 pdata->codec_root = entry;
7708 }
Laxminath Kasam99690f12020-03-15 15:38:21 +05307709 if (strnstr(component->name, "wsa883x", sizeof(component->name)))
7710 wsa883x_codec_info_create_codec_entry(pdata->codec_root,
7711 component);
7712 else
7713 wsa881x_codec_info_create_codec_entry(pdata->codec_root,
7714 component);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007715err:
7716 return ret;
7717}
7718
7719static int msm_aux_codec_init(struct snd_soc_component *component)
7720{
7721 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
7722 int ret = 0;
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -07007723 int codec_variant = -1;
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007724 void *mbhc_calibration;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007725 struct snd_info_entry *entry;
7726 struct snd_card *card = component->card->snd_card;
7727 struct msm_asoc_mach_data *pdata;
7728
7729 snd_soc_dapm_ignore_suspend(dapm, "EAR");
7730 snd_soc_dapm_ignore_suspend(dapm, "AUX");
7731 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
7732 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
7733 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
7734 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
7735 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
7736 snd_soc_dapm_ignore_suspend(dapm, "AMIC4");
7737 snd_soc_dapm_sync(dapm);
7738
7739 pdata = snd_soc_card_get_drvdata(component->card);
7740 if (!pdata->codec_root) {
7741 entry = snd_info_create_subdir(card->module, "codecs",
7742 card->proc_root);
7743 if (!entry) {
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007744 dev_dbg(component->dev, "%s: Cannot create codecs module entry\n",
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007745 __func__);
7746 ret = 0;
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007747 goto mbhc_cfg_cal;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007748 }
7749 pdata->codec_root = entry;
7750 }
Kunlei Zhangf61a2312020-02-11 15:37:03 +08007751 if (!strncmp(component->driver->name, "wcd937x", 7)) {
7752 wcd937x_info_create_codec_entry(pdata->codec_root, component);
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -07007753 ret = snd_soc_add_component_controls(component,
Kunlei Zhangf61a2312020-02-11 15:37:03 +08007754 msm_int_wcd937x_snd_controls,
7755 ARRAY_SIZE(msm_int_wcd937x_snd_controls));
7756 } else {
7757 wcd938x_info_create_codec_entry(pdata->codec_root, component);
7758 codec_variant = wcd938x_get_codec_variant(component);
7759 dev_dbg(component->dev, "%s: variant %d\n", __func__, codec_variant);
7760 if (codec_variant == WCD9380)
7761 ret = snd_soc_add_component_controls(component,
7762 msm_int_wcd9380_snd_controls,
7763 ARRAY_SIZE(msm_int_wcd9380_snd_controls));
7764 else if (codec_variant == WCD9385)
7765 ret = snd_soc_add_component_controls(component,
7766 msm_int_wcd9385_snd_controls,
7767 ARRAY_SIZE(msm_int_wcd9385_snd_controls));
7768 }
Vignesh Kulothungan406c2bf2019-07-19 10:17:55 -07007769
7770 if (ret < 0) {
7771 dev_err(component->dev, "%s: add codec specific snd controls failed: %d\n",
7772 __func__, ret);
7773 return ret;
7774 }
7775
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007776mbhc_cfg_cal:
7777 mbhc_calibration = def_wcd_mbhc_cal();
7778 if (!mbhc_calibration)
7779 return -ENOMEM;
7780 wcd_mbhc_cfg.calibration = mbhc_calibration;
Kunlei Zhangf61a2312020-02-11 15:37:03 +08007781 if (!strncmp(component->driver->name, "wcd937x", 7))
7782 ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
7783 else
7784 ret = wcd938x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007785 if (ret) {
7786 dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n",
7787 __func__, ret);
7788 goto err_hs_detect;
7789 }
7790 return 0;
7791
7792err_hs_detect:
7793 kfree(mbhc_calibration);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007794 return ret;
7795}
7796
7797static int msm_init_aux_dev(struct platform_device *pdev,
7798 struct snd_soc_card *card)
7799{
7800 struct device_node *wsa_of_node;
7801 struct device_node *aux_codec_of_node;
7802 u32 wsa_max_devs;
7803 u32 wsa_dev_cnt;
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307804 u32 codec_max_aux_devs = 0;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007805 u32 codec_aux_dev_cnt = 0;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007806 int i;
Xiao Lid8bb93c2020-01-07 12:59:05 +08007807 struct msm_wsa881x_dev_info *wsa881x_dev_info = NULL;
7808 struct aux_codec_dev_info *aux_cdc_dev_info = NULL;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007809 const char *auxdev_name_prefix[1];
7810 char *dev_name_str = NULL;
7811 int found = 0;
7812 int codecs_found = 0;
7813 int ret = 0;
7814
7815 /* Get maximum WSA device count for this platform */
7816 ret = of_property_read_u32(pdev->dev.of_node,
7817 "qcom,wsa-max-devs", &wsa_max_devs);
7818 if (ret) {
7819 dev_info(&pdev->dev,
7820 "%s: wsa-max-devs property missing in DT %s, ret = %d\n",
7821 __func__, pdev->dev.of_node->full_name, ret);
7822 wsa_max_devs = 0;
7823 goto codec_aux_dev;
7824 }
7825 if (wsa_max_devs == 0) {
7826 dev_warn(&pdev->dev,
7827 "%s: Max WSA devices is 0 for this target?\n",
7828 __func__);
7829 goto codec_aux_dev;
7830 }
7831
7832 /* Get count of WSA device phandles for this platform */
7833 wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node,
7834 "qcom,wsa-devs", NULL);
7835 if (wsa_dev_cnt == -ENOENT) {
7836 dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n",
7837 __func__);
7838 goto err;
7839 } else if (wsa_dev_cnt <= 0) {
7840 dev_err(&pdev->dev,
7841 "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n",
7842 __func__, wsa_dev_cnt);
7843 ret = -EINVAL;
7844 goto err;
7845 }
7846
7847 /*
7848 * Expect total phandles count to be NOT less than maximum possible
7849 * WSA count. However, if it is less, then assign same value to
7850 * max count as well.
7851 */
7852 if (wsa_dev_cnt < wsa_max_devs) {
7853 dev_dbg(&pdev->dev,
7854 "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n",
7855 __func__, wsa_max_devs, wsa_dev_cnt);
7856 wsa_max_devs = wsa_dev_cnt;
7857 }
7858
7859 /* Make sure prefix string passed for each WSA device */
7860 ret = of_property_count_strings(pdev->dev.of_node,
7861 "qcom,wsa-aux-dev-prefix");
7862 if (ret != wsa_dev_cnt) {
7863 dev_err(&pdev->dev,
7864 "%s: expecting %d wsa prefix. Defined only %d in DT\n",
7865 __func__, wsa_dev_cnt, ret);
7866 ret = -EINVAL;
7867 goto err;
7868 }
7869
7870 /*
7871 * Alloc mem to store phandle and index info of WSA device, if already
7872 * registered with ALSA core
7873 */
7874 wsa881x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
7875 sizeof(struct msm_wsa881x_dev_info),
7876 GFP_KERNEL);
7877 if (!wsa881x_dev_info) {
7878 ret = -ENOMEM;
7879 goto err;
7880 }
7881
7882 /*
7883 * search and check whether all WSA devices are already
7884 * registered with ALSA core or not. If found a node, store
7885 * the node and the index in a local array of struct for later
7886 * use.
7887 */
7888 for (i = 0; i < wsa_dev_cnt; i++) {
7889 wsa_of_node = of_parse_phandle(pdev->dev.of_node,
7890 "qcom,wsa-devs", i);
7891 if (unlikely(!wsa_of_node)) {
7892 /* we should not be here */
7893 dev_err(&pdev->dev,
7894 "%s: wsa dev node is not present\n",
7895 __func__);
7896 ret = -EINVAL;
7897 goto err;
7898 }
Aditya Bavanari4fcf3b42020-06-02 16:00:14 +05307899 if (soc_find_component_locked(wsa_of_node, NULL)) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007900 /* WSA device registered with ALSA core */
7901 wsa881x_dev_info[found].of_node = wsa_of_node;
7902 wsa881x_dev_info[found].index = i;
7903 found++;
7904 if (found == wsa_max_devs)
7905 break;
7906 }
7907 }
7908
7909 if (found < wsa_max_devs) {
7910 dev_dbg(&pdev->dev,
7911 "%s: failed to find %d components. Found only %d\n",
7912 __func__, wsa_max_devs, found);
7913 return -EPROBE_DEFER;
7914 }
7915 dev_info(&pdev->dev,
7916 "%s: found %d wsa881x devices registered with ALSA core\n",
7917 __func__, found);
7918
7919codec_aux_dev:
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307920 /* Get maximum aux codec device count for this platform */
7921 ret = of_property_read_u32(pdev->dev.of_node,
7922 "qcom,codec-max-aux-devs",
7923 &codec_max_aux_devs);
7924 if (ret) {
7925 dev_err(&pdev->dev,
7926 "%s: codec-max-aux-devs property missing in DT %s, ret = %d\n",
7927 __func__, pdev->dev.of_node->full_name, ret);
7928 codec_max_aux_devs = 0;
7929 goto aux_dev_register;
7930 }
7931 if (codec_max_aux_devs == 0) {
7932 dev_dbg(&pdev->dev,
7933 "%s: Max aux codec devices is 0 for this target?\n",
7934 __func__);
7935 goto aux_dev_register;
7936 }
7937
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007938 /* Get count of aux codec device phandles for this platform */
7939 codec_aux_dev_cnt = of_count_phandle_with_args(
7940 pdev->dev.of_node,
7941 "qcom,codec-aux-devs", NULL);
7942 if (codec_aux_dev_cnt == -ENOENT) {
7943 dev_warn(&pdev->dev, "%s: No aux codec defined in DT.\n",
7944 __func__);
7945 goto err;
7946 } else if (codec_aux_dev_cnt <= 0) {
7947 dev_err(&pdev->dev,
7948 "%s: Error reading aux codec device from DT, dev_cnt=%d\n",
7949 __func__, codec_aux_dev_cnt);
7950 ret = -EINVAL;
7951 goto err;
7952 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007953
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007954 /*
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307955 * Expect total phandles count to be NOT less than maximum possible
7956 * AUX device count. However, if it is less, then assign same value to
7957 * max count as well.
7958 */
7959 if (codec_aux_dev_cnt < codec_max_aux_devs) {
7960 dev_dbg(&pdev->dev,
7961 "%s: codec_max_aux_devs = %d cannot exceed codec_aux_dev_cnt = %d\n",
7962 __func__, codec_max_aux_devs,
7963 codec_aux_dev_cnt);
7964 codec_max_aux_devs = codec_aux_dev_cnt;
7965 }
7966
7967 /*
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007968 * Alloc mem to store phandle and index info of aux codec
7969 * if already registered with ALSA core
7970 */
7971 aux_cdc_dev_info = devm_kcalloc(&pdev->dev, codec_aux_dev_cnt,
7972 sizeof(struct aux_codec_dev_info),
7973 GFP_KERNEL);
7974 if (!aux_cdc_dev_info) {
7975 ret = -ENOMEM;
7976 goto err;
7977 }
7978
7979 /*
7980 * search and check whether all aux codecs are already
7981 * registered with ALSA core or not. If found a node, store
7982 * the node and the index in a local array of struct for later
7983 * use.
7984 */
7985 for (i = 0; i < codec_aux_dev_cnt; i++) {
7986 aux_codec_of_node = of_parse_phandle(pdev->dev.of_node,
7987 "qcom,codec-aux-devs", i);
7988 if (unlikely(!aux_codec_of_node)) {
7989 /* we should not be here */
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007990 dev_err(&pdev->dev,
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007991 "%s: aux codec dev node is not present\n",
7992 __func__);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007993 ret = -EINVAL;
7994 goto err;
7995 }
Aditya Bavanari4fcf3b42020-06-02 16:00:14 +05307996 if (soc_find_component_locked(aux_codec_of_node, NULL)) {
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007997 /* AUX codec registered with ALSA core */
7998 aux_cdc_dev_info[codecs_found].of_node =
7999 aux_codec_of_node;
8000 aux_cdc_dev_info[codecs_found].index = i;
8001 codecs_found++;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07008002 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07008003 }
8004
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08008005 if (codecs_found < codec_aux_dev_cnt) {
8006 dev_dbg(&pdev->dev,
8007 "%s: failed to find %d components. Found only %d\n",
8008 __func__, codec_aux_dev_cnt, codecs_found);
8009 return -EPROBE_DEFER;
8010 }
8011 dev_info(&pdev->dev,
8012 "%s: found %d AUX codecs registered with ALSA core\n",
8013 __func__, codecs_found);
8014
Sudheer Papothid6d524d2019-06-19 02:31:11 +05308015aux_dev_register:
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07008016 card->num_aux_devs = wsa_max_devs + codec_aux_dev_cnt;
8017 card->num_configs = wsa_max_devs + codec_aux_dev_cnt;
8018
8019 /* Alloc array of AUX devs struct */
8020 msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs,
8021 sizeof(struct snd_soc_aux_dev),
8022 GFP_KERNEL);
8023 if (!msm_aux_dev) {
8024 ret = -ENOMEM;
8025 goto err;
8026 }
8027
8028 /* Alloc array of codec conf struct */
8029 msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_configs,
8030 sizeof(struct snd_soc_codec_conf),
8031 GFP_KERNEL);
8032 if (!msm_codec_conf) {
8033 ret = -ENOMEM;
8034 goto err;
8035 }
8036
8037 for (i = 0; i < wsa_max_devs; i++) {
8038 dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN,
8039 GFP_KERNEL);
8040 if (!dev_name_str) {
8041 ret = -ENOMEM;
8042 goto err;
8043 }
8044
8045 ret = of_property_read_string_index(pdev->dev.of_node,
8046 "qcom,wsa-aux-dev-prefix",
8047 wsa881x_dev_info[i].index,
8048 auxdev_name_prefix);
8049 if (ret) {
8050 dev_err(&pdev->dev,
8051 "%s: failed to read wsa aux dev prefix, ret = %d\n",
8052 __func__, ret);
8053 ret = -EINVAL;
8054 goto err;
8055 }
8056
8057 snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i);
8058 msm_aux_dev[i].name = dev_name_str;
8059 msm_aux_dev[i].codec_name = NULL;
8060 msm_aux_dev[i].codec_of_node =
8061 wsa881x_dev_info[i].of_node;
8062 msm_aux_dev[i].init = msm_wsa881x_init;
8063 msm_codec_conf[i].dev_name = NULL;
8064 msm_codec_conf[i].name_prefix = auxdev_name_prefix[0];
8065 msm_codec_conf[i].of_node =
8066 wsa881x_dev_info[i].of_node;
8067 }
8068
8069 for (i = 0; i < codec_aux_dev_cnt; i++) {
8070 msm_aux_dev[wsa_max_devs + i].name = NULL;
8071 msm_aux_dev[wsa_max_devs + i].codec_name = NULL;
8072 msm_aux_dev[wsa_max_devs + i].codec_of_node =
8073 aux_cdc_dev_info[i].of_node;
8074 msm_aux_dev[wsa_max_devs + i].init = msm_aux_codec_init;
8075 msm_codec_conf[wsa_max_devs + i].dev_name = NULL;
8076 msm_codec_conf[wsa_max_devs + i].name_prefix =
8077 NULL;
8078 msm_codec_conf[wsa_max_devs + i].of_node =
8079 aux_cdc_dev_info[i].of_node;
8080 }
8081
8082 card->codec_conf = msm_codec_conf;
8083 card->aux_dev = msm_aux_dev;
8084err:
8085 return ret;
8086}
8087
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008088static void msm_i2s_auxpcm_init(struct platform_device *pdev)
8089{
8090 int count = 0;
8091 u32 mi2s_master_slave[MI2S_MAX];
8092 int ret = 0;
8093
8094 for (count = 0; count < MI2S_MAX; count++) {
8095 mutex_init(&mi2s_intf_conf[count].lock);
8096 mi2s_intf_conf[count].ref_cnt = 0;
8097 }
8098
8099 ret = of_property_read_u32_array(pdev->dev.of_node,
8100 "qcom,msm-mi2s-master",
8101 mi2s_master_slave, MI2S_MAX);
8102 if (ret) {
8103 dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n",
8104 __func__);
8105 } else {
8106 for (count = 0; count < MI2S_MAX; count++) {
8107 mi2s_intf_conf[count].msm_is_mi2s_master =
8108 mi2s_master_slave[count];
8109 }
8110 }
8111}
8112
8113static void msm_i2s_auxpcm_deinit(void)
8114{
8115 int count = 0;
8116
8117 for (count = 0; count < MI2S_MAX; count++) {
8118 mutex_destroy(&mi2s_intf_conf[count].lock);
8119 mi2s_intf_conf[count].ref_cnt = 0;
8120 mi2s_intf_conf[count].msm_is_mi2s_master = 0;
8121 }
8122}
8123
8124static int kona_ssr_enable(struct device *dev, void *data)
8125{
8126 struct platform_device *pdev = to_platform_device(dev);
8127 struct snd_soc_card *card = platform_get_drvdata(pdev);
8128 int ret = 0;
8129
8130 if (!card) {
8131 dev_err(dev, "%s: card is NULL\n", __func__);
8132 ret = -EINVAL;
8133 goto err;
8134 }
8135
8136 if (!strcmp(card->name, "kona-stub-snd-card")) {
8137 /* TODO */
8138 dev_dbg(dev, "%s: TODO \n", __func__);
8139 }
8140
8141 snd_soc_card_change_online_state(card, 1);
8142 dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__);
8143
8144err:
8145 return ret;
8146}
8147
8148static void kona_ssr_disable(struct device *dev, void *data)
8149{
8150 struct platform_device *pdev = to_platform_device(dev);
8151 struct snd_soc_card *card = platform_get_drvdata(pdev);
8152
8153 if (!card) {
8154 dev_err(dev, "%s: card is NULL\n", __func__);
8155 return;
8156 }
8157
8158 dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__);
8159 snd_soc_card_change_online_state(card, 0);
8160
8161 if (!strcmp(card->name, "kona-stub-snd-card")) {
8162 /* TODO */
8163 dev_dbg(dev, "%s: TODO \n", __func__);
8164 }
8165}
8166
8167static const struct snd_event_ops kona_ssr_ops = {
8168 .enable = kona_ssr_enable,
8169 .disable = kona_ssr_disable,
8170};
8171
8172static int msm_audio_ssr_compare(struct device *dev, void *data)
8173{
8174 struct device_node *node = data;
8175
8176 dev_dbg(dev, "%s: dev->of_node = 0x%p, node = 0x%p\n",
8177 __func__, dev->of_node, node);
8178 return (dev->of_node && dev->of_node == node);
8179}
8180
8181static int msm_audio_ssr_register(struct device *dev)
8182{
8183 struct device_node *np = dev->of_node;
8184 struct snd_event_clients *ssr_clients = NULL;
8185 struct device_node *node = NULL;
8186 int ret = 0;
8187 int i = 0;
8188
8189 for (i = 0; ; i++) {
8190 node = of_parse_phandle(np, "qcom,msm_audio_ssr_devs", i);
8191 if (!node)
8192 break;
8193 snd_event_mstr_add_client(&ssr_clients,
8194 msm_audio_ssr_compare, node);
8195 }
8196
8197 ret = snd_event_master_register(dev, &kona_ssr_ops,
8198 ssr_clients, NULL);
8199 if (!ret)
8200 snd_event_notify(dev, SND_EVENT_UP);
8201
8202 return ret;
8203}
8204
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008205static int msm_asoc_machine_probe(struct platform_device *pdev)
8206{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008207 struct snd_soc_card *card = NULL;
8208 struct msm_asoc_mach_data *pdata = NULL;
8209 const char *mbhc_audio_jack_type = NULL;
8210 int ret = 0;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08008211 uint index = 0;
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07008212 struct clk *lpass_audio_hw_vote = NULL;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008213
8214 if (!pdev->dev.of_node) {
8215 dev_err(&pdev->dev, "%s: No platform supplied from device tree\n", __func__);
8216 return -EINVAL;
8217 }
8218
8219 pdata = devm_kzalloc(&pdev->dev,
8220 sizeof(struct msm_asoc_mach_data), GFP_KERNEL);
8221 if (!pdata)
8222 return -ENOMEM;
8223
Vatsal Bucha71e0b482019-09-11 14:51:20 +05308224 of_property_read_u32(pdev->dev.of_node,
8225 "qcom,lito-is-v2-enabled",
8226 &pdata->lito_v2_enabled);
8227
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008228 card = populate_snd_card_dailinks(&pdev->dev);
8229 if (!card) {
8230 dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
8231 ret = -EINVAL;
8232 goto err;
8233 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008234
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008235 card->dev = &pdev->dev;
8236 platform_set_drvdata(pdev, card);
8237 snd_soc_card_set_drvdata(card, pdata);
8238
8239 ret = snd_soc_of_parse_card_name(card, "qcom,model");
8240 if (ret) {
8241 dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n",
8242 __func__, ret);
8243 goto err;
8244 }
8245
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008246 ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
8247 if (ret) {
8248 dev_err(&pdev->dev, "%s: parse audio routing failed, err:%d\n",
8249 __func__, ret);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008250 goto err;
8251 }
8252
8253 ret = msm_populate_dai_link_component_of_node(card);
8254 if (ret) {
8255 ret = -EPROBE_DEFER;
8256 goto err;
8257 }
8258
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07008259 ret = msm_init_aux_dev(pdev, card);
8260 if (ret)
8261 goto err;
8262
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008263 ret = devm_snd_soc_register_card(&pdev->dev, card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008264 if (ret == -EPROBE_DEFER) {
8265 if (codec_reg_done)
8266 ret = -EINVAL;
8267 goto err;
8268 } else if (ret) {
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008269 dev_err(&pdev->dev, "%s: snd_soc_register_card failed (%d)\n",
8270 __func__, ret);
8271 goto err;
8272 }
8273 dev_info(&pdev->dev, "%s: Sound card %s registered\n",
8274 __func__, card->name);
8275
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008276 pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node,
8277 "qcom,hph-en1-gpio", 0);
8278 if (!pdata->hph_en1_gpio_p) {
8279 dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n",
8280 __func__, "qcom,hph-en1-gpio",
8281 pdev->dev.of_node->full_name);
8282 }
8283
8284 pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node,
8285 "qcom,hph-en0-gpio", 0);
8286 if (!pdata->hph_en0_gpio_p) {
8287 dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n",
8288 __func__, "qcom,hph-en0-gpio",
8289 pdev->dev.of_node->full_name);
8290 }
8291
8292 ret = of_property_read_string(pdev->dev.of_node,
8293 "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type);
8294 if (ret) {
8295 dev_dbg(&pdev->dev, "%s: Looking up %s property in node %s failed\n",
8296 __func__, "qcom,mbhc-audio-jack-type",
8297 pdev->dev.of_node->full_name);
8298 dev_dbg(&pdev->dev, "Jack type properties set to default\n");
8299 } else {
8300 if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) {
8301 wcd_mbhc_cfg.enable_anc_mic_detect = false;
8302 dev_dbg(&pdev->dev, "This hardware has 4 pole jack");
8303 } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) {
8304 wcd_mbhc_cfg.enable_anc_mic_detect = true;
8305 dev_dbg(&pdev->dev, "This hardware has 5 pole jack");
8306 } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) {
8307 wcd_mbhc_cfg.enable_anc_mic_detect = true;
8308 dev_dbg(&pdev->dev, "This hardware has 6 pole jack");
8309 } else {
8310 wcd_mbhc_cfg.enable_anc_mic_detect = false;
8311 dev_dbg(&pdev->dev, "Unknown value, set to default\n");
8312 }
8313 }
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08008314 /*
8315 * Parse US-Euro gpio info from DT. Report no error if us-euro
8316 * entry is not found in DT file as some targets do not support
8317 * US-Euro detection
8318 */
8319 pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node,
8320 "qcom,us-euro-gpios", 0);
8321 if (!pdata->us_euro_gpio_p) {
8322 dev_dbg(&pdev->dev, "property %s not detected in node %s",
8323 "qcom,us-euro-gpios", pdev->dev.of_node->full_name);
8324 } else {
8325 dev_dbg(&pdev->dev, "%s detected\n",
8326 "qcom,us-euro-gpios");
8327 wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic;
8328 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008329
Meng Wanga60b4082019-02-25 17:02:23 +08008330 if (wcd_mbhc_cfg.enable_usbc_analog)
8331 wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic;
8332
8333 pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node,
8334 "fsa4480-i2c-handle", 0);
8335 if (!pdata->fsa_handle)
8336 dev_dbg(&pdev->dev, "property %s not detected in node %s\n",
8337 "fsa4480-i2c-handle", pdev->dev.of_node->full_name);
8338
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008339 msm_i2s_auxpcm_init(pdev);
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08008340 pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node,
8341 "qcom,cdc-dmic01-gpios",
8342 0);
8343 pdata->dmic23_gpio_p = of_parse_phandle(pdev->dev.of_node,
8344 "qcom,cdc-dmic23-gpios",
8345 0);
8346 pdata->dmic45_gpio_p = of_parse_phandle(pdev->dev.of_node,
8347 "qcom,cdc-dmic45-gpios",
8348 0);
Laxminath Kasam168173e2019-09-16 12:59:43 +05308349 if (pdata->dmic01_gpio_p)
8350 msm_cdc_pinctrl_set_wakeup_capable(pdata->dmic01_gpio_p, false);
8351 if (pdata->dmic23_gpio_p)
8352 msm_cdc_pinctrl_set_wakeup_capable(pdata->dmic23_gpio_p, false);
Sudheer Papothic51afbc2019-08-01 10:25:32 +05308353 if (pdata->dmic45_gpio_p)
8354 msm_cdc_pinctrl_set_wakeup_capable(pdata->dmic45_gpio_p, false);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008355
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08008356 pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
8357 "qcom,pri-mi2s-gpios", 0);
8358 pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
8359 "qcom,sec-mi2s-gpios", 0);
8360 pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
8361 "qcom,tert-mi2s-gpios", 0);
8362 pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
8363 "qcom,quat-mi2s-gpios", 0);
8364 pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
8365 "qcom,quin-mi2s-gpios", 0);
8366 pdata->mi2s_gpio_p[SEN_MI2S] = of_parse_phandle(pdev->dev.of_node,
8367 "qcom,sen-mi2s-gpios", 0);
Meng Wang4f5815c2020-02-13 14:10:20 +08008368 for (index = PRIM_MI2S; index < MI2S_MAX; index++) {
8369 if (pdata->mi2s_gpio_p[index])
8370 msm_cdc_pinctrl_set_wakeup_capable(pdata->mi2s_gpio_p[index], false);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08008371 atomic_set(&(pdata->mi2s_gpio_ref_count[index]), 0);
Meng Wang4f5815c2020-02-13 14:10:20 +08008372 }
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08008373
Karthikeyan Mani1a9d7502019-09-23 21:00:20 -07008374 /* Register LPASS audio hw vote */
8375 lpass_audio_hw_vote = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote");
8376 if (IS_ERR(lpass_audio_hw_vote)) {
8377 ret = PTR_ERR(lpass_audio_hw_vote);
8378 dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n",
8379 __func__, "lpass_audio_hw_vote", ret);
8380 lpass_audio_hw_vote = NULL;
8381 ret = 0;
8382 }
8383 pdata->lpass_audio_hw_vote = lpass_audio_hw_vote;
8384 pdata->core_audio_vote_count = 0;
8385
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008386 ret = msm_audio_ssr_register(&pdev->dev);
8387 if (ret)
8388 pr_err("%s: Registration with SND event FWK failed ret = %d\n",
8389 __func__, ret);
8390
8391 is_initial_boot = true;
8392
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008393 return 0;
8394err:
8395 devm_kfree(&pdev->dev, pdata);
8396 return ret;
8397}
8398
8399static int msm_asoc_machine_remove(struct platform_device *pdev)
8400{
8401 struct snd_soc_card *card = platform_get_drvdata(pdev);
8402
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008403 snd_event_master_deregister(&pdev->dev);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008404 snd_soc_unregister_card(card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07008405 msm_i2s_auxpcm_deinit();
8406
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008407 return 0;
8408}
8409
8410static struct platform_driver kona_asoc_machine_driver = {
8411 .driver = {
8412 .name = DRV_NAME,
8413 .owner = THIS_MODULE,
8414 .pm = &snd_soc_pm_ops,
8415 .of_match_table = kona_asoc_machine_of_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08008416 .suppress_bind_attrs = true,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07008417 },
8418 .probe = msm_asoc_machine_probe,
8419 .remove = msm_asoc_machine_remove,
8420};
8421module_platform_driver(kona_asoc_machine_driver);
8422
8423MODULE_DESCRIPTION("ALSA SoC msm");
8424MODULE_LICENSE("GPL v2");
8425MODULE_ALIAS("platform:" DRV_NAME);
8426MODULE_DEVICE_TABLE(of, kona_asoc_machine_of_match);