blob: d9c0eae55590cc82942d9f0ca89c6f3d76e14d05 [file] [log] [blame]
Meng Wang43bbb872018-12-10 12:32:05 +08001// SPDX-License-Identifier: GPL-2.0-only
Aditya Bavanari44eb8952018-05-09 19:01:50 +05302/*
Md Mansoor Ahmedfc755592018-11-29 11:50:59 +05303 * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304 */
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>
16#include <linux/pm_qos.h>
Vatsal Bucha6cb17a02018-08-07 11:07:04 +053017#include <linux/soc/qcom/fsa4480-i2c.h>
Aditya Bavanari44eb8952018-05-09 19:01:50 +053018#include <sound/core.h>
19#include <sound/soc.h>
20#include <sound/soc-dapm.h>
21#include <sound/pcm.h>
22#include <sound/pcm_params.h>
23#include <sound/info.h>
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +053024#include <soc/snd_event.h>
Aditya Bavanari3e19f3c2018-11-12 19:29:50 +053025#include <soc/qcom/socinfo.h>
Aditya Bavanari44eb8952018-05-09 19:01:50 +053026#include <dsp/q6afe-v2.h>
27#include <dsp/q6core.h>
28#include "device_event.h"
29#include "msm-pcm-routing-v2.h"
Meng Wang11a25cf2018-10-31 14:11:26 +080030#include <asoc/msm-cdc-pinctrl.h>
Aditya Bavanari44eb8952018-05-09 19:01:50 +053031#include "codecs/wcd934x/wcd934x.h"
Aditya Bavanari45e2e652019-01-11 20:18:55 +053032#include "codecs/wcd9335.h"
Aditya Bavanari44eb8952018-05-09 19:01:50 +053033#include "codecs/wcd934x/wcd934x-mbhc.h"
Ramprasad Katkam997da402018-08-17 20:20:06 +053034#include "codecs/wcd937x/wcd937x-mbhc.h"
Aditya Bavanari44eb8952018-05-09 19:01:50 +053035#include "codecs/wsa881x.h"
36#include "codecs/bolero/bolero-cdc.h"
37#include <dt-bindings/sound/audio-codec-port-types.h>
Aditya Bavanari0b26ab32018-08-03 23:53:01 +053038#include "codecs/bolero/wsa-macro.h"
Laxminath Kasam838f0b82018-10-23 20:20:18 +053039#include "codecs/wcd937x/wcd937x.h"
Aditya Bavanari44eb8952018-05-09 19:01:50 +053040
41#define DRV_NAME "sm6150-asoc-snd"
42
43#define __CHIPSET__ "SM6150 "
44#define MSM_DAILINK_NAME(name) (__CHIPSET__#name)
45
46#define SAMPLING_RATE_8KHZ 8000
47#define SAMPLING_RATE_11P025KHZ 11025
48#define SAMPLING_RATE_16KHZ 16000
49#define SAMPLING_RATE_22P05KHZ 22050
50#define SAMPLING_RATE_32KHZ 32000
51#define SAMPLING_RATE_44P1KHZ 44100
52#define SAMPLING_RATE_48KHZ 48000
53#define SAMPLING_RATE_88P2KHZ 88200
54#define SAMPLING_RATE_96KHZ 96000
55#define SAMPLING_RATE_176P4KHZ 176400
56#define SAMPLING_RATE_192KHZ 192000
57#define SAMPLING_RATE_352P8KHZ 352800
58#define SAMPLING_RATE_384KHZ 384000
59
60#define WCD9XXX_MBHC_DEF_BUTTONS 8
61#define WCD9XXX_MBHC_DEF_RLOADS 5
62#define CODEC_EXT_CLK_RATE 9600000
63#define ADSP_STATE_READY_TIMEOUT_MS 3000
64#define DEV_NAME_STR_LEN 32
65
66#define WSA8810_NAME_1 "wsa881x.20170211"
67#define WSA8810_NAME_2 "wsa881x.20170212"
68#define WCN_CDC_SLIM_RX_CH_MAX 2
69#define WCN_CDC_SLIM_TX_CH_MAX 3
70#define TDM_CHANNEL_MAX 8
71
72#define ADSP_STATE_READY_TIMEOUT_MS 3000
73#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */
74#define MSM_HIFI_ON 1
75
Aditya Bavanari3e19f3c2018-11-12 19:29:50 +053076#define SM6150_SOC_VERSION_1_0 0x00010000
77#define SM6150_SOC_MSM_ID 0x163
78
Aditya Bavanari44eb8952018-05-09 19:01:50 +053079enum {
80 SLIM_RX_0 = 0,
81 SLIM_RX_1,
82 SLIM_RX_2,
83 SLIM_RX_3,
84 SLIM_RX_4,
85 SLIM_RX_5,
86 SLIM_RX_6,
87 SLIM_RX_7,
88 SLIM_RX_MAX,
89};
90enum {
91 SLIM_TX_0 = 0,
92 SLIM_TX_1,
93 SLIM_TX_2,
94 SLIM_TX_3,
95 SLIM_TX_4,
96 SLIM_TX_5,
97 SLIM_TX_6,
98 SLIM_TX_7,
99 SLIM_TX_8,
100 SLIM_TX_MAX,
101};
102
103enum {
104 PRIM_MI2S = 0,
105 SEC_MI2S,
106 TERT_MI2S,
107 QUAT_MI2S,
108 QUIN_MI2S,
109 MI2S_MAX,
110};
111
112enum {
113 PRIM_AUX_PCM = 0,
114 SEC_AUX_PCM,
115 TERT_AUX_PCM,
116 QUAT_AUX_PCM,
117 QUIN_AUX_PCM,
118 AUX_PCM_MAX,
119};
120
121enum {
Aditya Bavanari353a5832018-11-22 15:10:32 +0530122 TDM_0 = 0,
123 TDM_1,
124 TDM_2,
125 TDM_3,
126 TDM_4,
127 TDM_5,
128 TDM_6,
129 TDM_7,
130 TDM_PORT_MAX,
131};
132
133enum {
134 TDM_PRI = 0,
135 TDM_SEC,
136 TDM_TERT,
137 TDM_QUAT,
138 TDM_QUIN,
139 TDM_INTERFACE_MAX,
140};
141
142struct tdm_port {
143 u32 mode;
144 u32 channel;
145};
146
147enum {
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530148 WSA_CDC_DMA_RX_0 = 0,
149 WSA_CDC_DMA_RX_1,
150 RX_CDC_DMA_RX_0,
151 RX_CDC_DMA_RX_1,
152 RX_CDC_DMA_RX_2,
153 RX_CDC_DMA_RX_3,
154 RX_CDC_DMA_RX_5,
155 CDC_DMA_RX_MAX,
156};
157
158enum {
159 WSA_CDC_DMA_TX_0 = 0,
160 WSA_CDC_DMA_TX_1,
161 WSA_CDC_DMA_TX_2,
162 TX_CDC_DMA_TX_0,
163 TX_CDC_DMA_TX_3,
164 TX_CDC_DMA_TX_4,
165 CDC_DMA_TX_MAX,
166};
167
168struct mi2s_conf {
169 struct mutex lock;
170 u32 ref_cnt;
171 u32 msm_is_mi2s_master;
Aditya Bavanari353a5832018-11-22 15:10:32 +0530172 u32 msm_is_ext_mclk;
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530173};
174
175static u32 mi2s_ebit_clk[MI2S_MAX] = {
176 Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
177 Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
178 Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
179 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_EBIT,
180 Q6AFE_LPASS_CLK_ID_QUI_MI2S_EBIT
181};
182
183struct dev_config {
184 u32 sample_rate;
185 u32 bit_format;
186 u32 channels;
187};
188
189enum {
190 DP_RX_IDX = 0,
191 EXT_DISP_RX_IDX_MAX,
192};
193
194struct msm_wsa881x_dev_info {
195 struct device_node *of_node;
196 u32 index;
197};
198
199struct aux_codec_dev_info {
200 struct device_node *of_node;
201 u32 index;
202};
203
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530204struct msm_asoc_mach_data {
205 struct snd_info_entry *codec_root;
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530206 int usbc_en2_gpio; /* used by gpio driver API */
Aditya Bavanari353a5832018-11-22 15:10:32 +0530207 struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
Aditya Bavanari45e2e652019-01-11 20:18:55 +0530208 int hph_en1_gpio;
209 int hph_en0_gpio;
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530210 struct device_node *dmic01_gpio_p; /* used by pinctrl API */
211 struct device_node *dmic23_gpio_p; /* used by pinctrl API */
212 struct device_node *us_euro_gpio_p; /* used by pinctrl API */
213 struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */
214 struct device_node *hph_en1_gpio_p; /* used by pinctrl API */
215 struct device_node *hph_en0_gpio_p; /* used by pinctrl API */
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +0530216 bool is_afe_config_done;
Vatsal Bucha6cb17a02018-08-07 11:07:04 +0530217 struct device_node *fsa_handle;
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530218};
219
220struct msm_asoc_wcd93xx_codec {
Meng Wang56a0f8f2018-09-06 18:17:30 +0800221 void* (*get_afe_config_fn)(struct snd_soc_component *component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530222 enum afe_config_type config_type);
223};
224
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530225static struct snd_soc_card snd_soc_card_sm6150_msm;
226
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530227/* TDM default config */
228static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
229 { /* PRI TDM */
230 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
231 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
232 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
233 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
234 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
235 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
236 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
237 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
238 },
239 { /* SEC TDM */
240 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
241 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
242 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
243 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
244 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
245 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
246 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
247 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
248 },
249 { /* TERT TDM */
250 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
251 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
252 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
253 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
254 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
255 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
256 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
257 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
258 },
259 { /* QUAT TDM */
260 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
261 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
262 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
263 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
264 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
265 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
266 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
267 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
268 },
269 { /* QUIN TDM */
270 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
271 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
272 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
273 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
274 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
275 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
276 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
277 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
278 }
279
280};
281
282/* TDM default config */
283static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
284 { /* PRI TDM */
285 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
286 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
287 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
288 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
289 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
290 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
291 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
292 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
293 },
294 { /* SEC TDM */
295 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
296 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
297 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
298 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
299 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
300 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
301 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
302 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
303 },
304 { /* TERT TDM */
305 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
306 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
307 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
308 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
309 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
310 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
311 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
312 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
313 },
314 { /* QUAT TDM */
315 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
316 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
317 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
318 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
319 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
320 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
321 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
322 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
323 },
324 { /* QUIN TDM */
325 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
326 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
327 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
328 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
329 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
330 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
331 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
332 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
333 }
334};
335
336
337/* Default configuration of slimbus channels */
338static struct dev_config slim_rx_cfg[] = {
339 [SLIM_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
340 [SLIM_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
341 [SLIM_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
342 [SLIM_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
343 [SLIM_RX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
344 [SLIM_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
345 [SLIM_RX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
346 [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
347};
348
349static struct dev_config slim_tx_cfg[] = {
350 [SLIM_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
351 [SLIM_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
352 [SLIM_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
353 [SLIM_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
354 [SLIM_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
355 [SLIM_TX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
356 [SLIM_TX_6] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
357 [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
358 [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
359};
360
361/* Default configuration of Codec DMA Interface Tx */
362static struct dev_config cdc_dma_rx_cfg[] = {
363 [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
364 [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
365 [RX_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
366 [RX_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
367 [RX_CDC_DMA_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
368 [RX_CDC_DMA_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
369 [RX_CDC_DMA_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
370};
371
372/* Default configuration of Codec DMA Interface Rx */
373static struct dev_config cdc_dma_tx_cfg[] = {
374 [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
375 [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
376 [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
377 [TX_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
378 [TX_CDC_DMA_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
379 [TX_CDC_DMA_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
380};
381
382/* Default configuration of external display BE */
383static struct dev_config ext_disp_rx_cfg[] = {
384 [DP_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
385};
386
387static struct dev_config usb_rx_cfg = {
388 .sample_rate = SAMPLING_RATE_48KHZ,
389 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
390 .channels = 2,
391};
392
393static struct dev_config usb_tx_cfg = {
394 .sample_rate = SAMPLING_RATE_48KHZ,
395 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
396 .channels = 1,
397};
398
399static struct dev_config proxy_rx_cfg = {
400 .sample_rate = SAMPLING_RATE_48KHZ,
401 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
402 .channels = 2,
403};
404
405/* Default configuration of MI2S channels */
406static struct dev_config mi2s_rx_cfg[] = {
407 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
408 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
409 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
410 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
411 [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
412};
413
414static struct dev_config mi2s_tx_cfg[] = {
415 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
416 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
417 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
418 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
419 [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
420};
421
422static struct dev_config aux_pcm_rx_cfg[] = {
423 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
424 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
425 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
426 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
427 [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
428};
429
430static struct dev_config aux_pcm_tx_cfg[] = {
431 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
432 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
433 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
434 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
435 [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
436};
437static int msm_vi_feed_tx_ch = 2;
438static const char *const slim_rx_ch_text[] = {"One", "Two"};
439static const char *const slim_tx_ch_text[] = {"One", "Two", "Three", "Four",
440 "Five", "Six", "Seven",
441 "Eight"};
442static const char *const vi_feed_ch_text[] = {"One", "Two"};
443static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE",
444 "S32_LE"};
445static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE",
446 "S24_3LE"};
447static char const *slim_sample_rate_text[] = {"KHZ_8", "KHZ_16",
448 "KHZ_32", "KHZ_44P1", "KHZ_48",
449 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
450 "KHZ_192", "KHZ_352P8", "KHZ_384"};
451static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16",
452 "KHZ_44P1", "KHZ_48",
453 "KHZ_88P2", "KHZ_96"};
Sharad Sangle493a1b32018-09-19 15:52:15 +0530454static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16",
455 "KHZ_44P1", "KHZ_48",
456 "KHZ_88P2", "KHZ_96"};
457static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16",
458 "KHZ_44P1", "KHZ_48",
459 "KHZ_88P2", "KHZ_96"};
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530460static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four",
461 "Five", "Six", "Seven",
462 "Eight"};
463static char const *ch_text[] = {"Two", "Three", "Four", "Five",
464 "Six", "Seven", "Eight"};
465static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
466 "KHZ_16", "KHZ_22P05",
467 "KHZ_32", "KHZ_44P1", "KHZ_48",
468 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
469 "KHZ_192", "KHZ_352P8", "KHZ_384"};
470static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96",
471 "KHZ_192", "KHZ_32", "KHZ_44P1",
472 "KHZ_88P2", "KHZ_176P4" };
473static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
474 "Five", "Six", "Seven", "Eight"};
475static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"};
476static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32",
477 "KHZ_48", "KHZ_176P4",
478 "KHZ_352P8"};
479static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"};
480static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16",
481 "KHZ_22P05", "KHZ_32", "KHZ_44P1",
482 "KHZ_48", "KHZ_96", "KHZ_192"};
483static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four",
484 "Five", "Six", "Seven",
485 "Eight"};
486static const char *const hifi_text[] = {"Off", "On"};
487static const char *const qos_text[] = {"Disable", "Enable"};
488
489static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"};
490static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four",
491 "Five", "Six", "Seven",
492 "Eight"};
Aditya Bavanari0b26ab32018-08-03 23:53:01 +0530493static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
494 "KHZ_16", "KHZ_22P05",
495 "KHZ_32", "KHZ_44P1", "KHZ_48",
496 "KHZ_88P2", "KHZ_96",
497 "KHZ_176P4", "KHZ_192",
498 "KHZ_352P8", "KHZ_384"};
499
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530500
501static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_chs, slim_rx_ch_text);
502static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_chs, slim_rx_ch_text);
503static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_chs, slim_tx_ch_text);
504static SOC_ENUM_SINGLE_EXT_DECL(slim_1_tx_chs, slim_tx_ch_text);
505static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_chs, slim_rx_ch_text);
506static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text);
507static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text);
508static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text);
509static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text);
510static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text);
511static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text);
512static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text);
513static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text);
514static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text);
515static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text);
516static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text);
517static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text);
518static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text);
519static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text);
520static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text);
521static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text);
522static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text);
523static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text);
524static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
Sharad Sangle493a1b32018-09-19 15:52:15 +0530525static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text);
526static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text);
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530527static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text);
528static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text);
529static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate,
530 ext_disp_sample_rate_text);
531static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text);
532static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text);
533static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text);
534static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text);
535static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text);
536static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text);
537static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text);
538static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text);
539static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text);
540static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text);
541static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text);
542static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text);
543static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text);
544static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text);
545static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text);
546static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text);
547static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text);
548static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text);
549static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text);
550static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text);
551static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text);
552static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text);
553static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text);
554static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text);
555static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text);
556static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text);
557static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text);
558static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text);
559static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text);
560static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text);
561static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text);
562static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text);
563static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text);
564static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text);
565static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text);
566static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text);
567static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text);
568static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text);
569static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text);
570static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text);
571static SOC_ENUM_SINGLE_EXT_DECL(hifi_function, hifi_text);
572static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
573static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
574static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
575static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
576static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_chs, cdc_dma_rx_ch_text);
577static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_chs, cdc_dma_rx_ch_text);
578static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_chs, cdc_dma_rx_ch_text);
579static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
580static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text);
581static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text);
582static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
583static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_chs, cdc_dma_tx_ch_text);
584static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_chs, cdc_dma_tx_ch_text);
585static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text);
586static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text);
587static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_format, bit_format_text);
588static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_format, bit_format_text);
589static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_format, bit_format_text);
590static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_format, bit_format_text);
591static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_format, bit_format_text);
592static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text);
593static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text);
594static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_format, bit_format_text);
595static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_format, bit_format_text);
596static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_format, bit_format_text);
597static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate,
598 cdc_dma_sample_rate_text);
599static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate,
600 cdc_dma_sample_rate_text);
601static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_sample_rate,
602 cdc_dma_sample_rate_text);
603static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_sample_rate,
604 cdc_dma_sample_rate_text);
605static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_sample_rate,
606 cdc_dma_sample_rate_text);
607static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_sample_rate,
608 cdc_dma_sample_rate_text);
609static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_sample_rate,
610 cdc_dma_sample_rate_text);
611static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate,
612 cdc_dma_sample_rate_text);
613static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate,
614 cdc_dma_sample_rate_text);
615static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate,
616 cdc_dma_sample_rate_text);
617static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_sample_rate,
618 cdc_dma_sample_rate_text);
619static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_sample_rate,
620 cdc_dma_sample_rate_text);
621static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_sample_rate,
622 cdc_dma_sample_rate_text);
623
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530624static int msm_hifi_control;
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530625static bool codec_reg_done;
626static struct snd_soc_aux_dev *msm_aux_dev;
627static struct snd_soc_codec_conf *msm_codec_conf;
628static struct msm_asoc_wcd93xx_codec msm_codec_fn;
629
630static int dmic_0_1_gpio_cnt;
631static int dmic_2_3_gpio_cnt;
632
633static void *def_wcd_mbhc_cal(void);
Meng Wang56a0f8f2018-09-06 18:17:30 +0800634static int msm_snd_enable_codec_ext_clk(struct snd_soc_component *component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530635 int enable, bool dapm);
636static int msm_wsa881x_init(struct snd_soc_component *component);
637static int msm_aux_codec_init(struct snd_soc_component *component);
638
639/*
640 * Need to report LINEIN
641 * if R/L channel impedance is larger than 5K ohm
642 */
643static struct wcd_mbhc_config wcd_mbhc_cfg = {
644 .read_fw_bin = false,
645 .calibration = NULL,
646 .detect_extn_cable = true,
647 .mono_stero_detection = false,
648 .swap_gnd_mic = NULL,
649 .hs_ext_micbias = true,
650 .key_code[0] = KEY_MEDIA,
651 .key_code[1] = KEY_VOICECOMMAND,
652 .key_code[2] = KEY_VOLUMEUP,
653 .key_code[3] = KEY_VOLUMEDOWN,
654 .key_code[4] = 0,
655 .key_code[5] = 0,
656 .key_code[6] = 0,
657 .key_code[7] = 0,
658 .linein_th = 5000,
Vatsal Bucha3c7524b2019-01-11 14:51:52 +0530659 .moisture_en = false,
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530660 .mbhc_micbias = MIC_BIAS_2,
661 .anc_micbias = MIC_BIAS_2,
662 .enable_anc_mic_detect = false,
Vatsal Bucha3c7524b2019-01-11 14:51:52 +0530663 .moisture_duty_cycle_en = true,
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530664};
665
Aditya Bavanari45e2e652019-01-11 20:18:55 +0530666static struct snd_soc_dapm_route wcd_audio_paths[] = {
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530667 {"MIC BIAS1", NULL, "MCLK TX"},
668 {"MIC BIAS2", NULL, "MCLK TX"},
669 {"MIC BIAS3", NULL, "MCLK TX"},
670 {"MIC BIAS4", NULL, "MCLK TX"},
671};
672
673static struct afe_clk_set mi2s_clk[MI2S_MAX] = {
674 {
675 AFE_API_VERSION_I2S_CONFIG,
676 Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT,
677 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
678 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
679 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
680 0,
681 },
682 {
683 AFE_API_VERSION_I2S_CONFIG,
684 Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
685 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
686 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
687 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
688 0,
689 },
690 {
691 AFE_API_VERSION_I2S_CONFIG,
692 Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT,
693 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
694 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
695 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
696 0,
697 },
698 {
699 AFE_API_VERSION_I2S_CONFIG,
700 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
701 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
702 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
703 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
704 0,
705 },
706 {
707 AFE_API_VERSION_I2S_CONFIG,
708 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT,
709 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
710 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
711 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
712 0,
713 }
714
715};
716
Aditya Bavanari353a5832018-11-22 15:10:32 +0530717static struct afe_clk_set mi2s_mclk[MI2S_MAX] = {
718 {
719 AFE_API_VERSION_I2S_CONFIG,
720 Q6AFE_LPASS_CLK_ID_MCLK_3,
721 Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
722 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
723 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
724 0,
725 },
726 {
727 AFE_API_VERSION_I2S_CONFIG,
728 Q6AFE_LPASS_CLK_ID_MCLK_2,
729 Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
730 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
731 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
732 0,
733 },
734 {
735 AFE_API_VERSION_I2S_CONFIG,
736 Q6AFE_LPASS_CLK_ID_MCLK_1,
737 Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
738 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
739 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
740 0,
741 },
742 {
743 AFE_API_VERSION_I2S_CONFIG,
744 Q6AFE_LPASS_CLK_ID_MCLK_1,
745 Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
746 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
747 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
748 0,
749 },
750 {
751 AFE_API_VERSION_I2S_CONFIG,
752 Q6AFE_LPASS_CLK_ID_QUI_MI2S_OSR,
753 Q6AFE_LPASS_OSR_CLK_9_P600_MHZ,
754 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
755 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
756 0,
757 }
758};
759
Aditya Bavanari44eb8952018-05-09 19:01:50 +0530760static struct mi2s_conf mi2s_intf_conf[MI2S_MAX];
761
762static int slim_get_sample_rate_val(int sample_rate)
763{
764 int sample_rate_val = 0;
765
766 switch (sample_rate) {
767 case SAMPLING_RATE_8KHZ:
768 sample_rate_val = 0;
769 break;
770 case SAMPLING_RATE_16KHZ:
771 sample_rate_val = 1;
772 break;
773 case SAMPLING_RATE_32KHZ:
774 sample_rate_val = 2;
775 break;
776 case SAMPLING_RATE_44P1KHZ:
777 sample_rate_val = 3;
778 break;
779 case SAMPLING_RATE_48KHZ:
780 sample_rate_val = 4;
781 break;
782 case SAMPLING_RATE_88P2KHZ:
783 sample_rate_val = 5;
784 break;
785 case SAMPLING_RATE_96KHZ:
786 sample_rate_val = 6;
787 break;
788 case SAMPLING_RATE_176P4KHZ:
789 sample_rate_val = 7;
790 break;
791 case SAMPLING_RATE_192KHZ:
792 sample_rate_val = 8;
793 break;
794 case SAMPLING_RATE_352P8KHZ:
795 sample_rate_val = 9;
796 break;
797 case SAMPLING_RATE_384KHZ:
798 sample_rate_val = 10;
799 break;
800 default:
801 sample_rate_val = 4;
802 break;
803 }
804 return sample_rate_val;
805}
806
807static int slim_get_sample_rate(int value)
808{
809 int sample_rate = 0;
810
811 switch (value) {
812 case 0:
813 sample_rate = SAMPLING_RATE_8KHZ;
814 break;
815 case 1:
816 sample_rate = SAMPLING_RATE_16KHZ;
817 break;
818 case 2:
819 sample_rate = SAMPLING_RATE_32KHZ;
820 break;
821 case 3:
822 sample_rate = SAMPLING_RATE_44P1KHZ;
823 break;
824 case 4:
825 sample_rate = SAMPLING_RATE_48KHZ;
826 break;
827 case 5:
828 sample_rate = SAMPLING_RATE_88P2KHZ;
829 break;
830 case 6:
831 sample_rate = SAMPLING_RATE_96KHZ;
832 break;
833 case 7:
834 sample_rate = SAMPLING_RATE_176P4KHZ;
835 break;
836 case 8:
837 sample_rate = SAMPLING_RATE_192KHZ;
838 break;
839 case 9:
840 sample_rate = SAMPLING_RATE_352P8KHZ;
841 break;
842 case 10:
843 sample_rate = SAMPLING_RATE_384KHZ;
844 break;
845 default:
846 sample_rate = SAMPLING_RATE_48KHZ;
847 break;
848 }
849 return sample_rate;
850}
851
852static int slim_get_bit_format_val(int bit_format)
853{
854 int val = 0;
855
856 switch (bit_format) {
857 case SNDRV_PCM_FORMAT_S32_LE:
858 val = 3;
859 break;
860 case SNDRV_PCM_FORMAT_S24_3LE:
861 val = 2;
862 break;
863 case SNDRV_PCM_FORMAT_S24_LE:
864 val = 1;
865 break;
866 case SNDRV_PCM_FORMAT_S16_LE:
867 default:
868 val = 0;
869 break;
870 }
871 return val;
872}
873
874static int slim_get_bit_format(int val)
875{
876 int bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
877
878 switch (val) {
879 case 0:
880 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
881 break;
882 case 1:
883 bit_fmt = SNDRV_PCM_FORMAT_S24_LE;
884 break;
885 case 2:
886 bit_fmt = SNDRV_PCM_FORMAT_S24_3LE;
887 break;
888 case 3:
889 bit_fmt = SNDRV_PCM_FORMAT_S32_LE;
890 break;
891 default:
892 bit_fmt = SNDRV_PCM_FORMAT_S16_LE;
893 break;
894 }
895 return bit_fmt;
896}
897
898static int slim_get_port_idx(struct snd_kcontrol *kcontrol)
899{
900 int port_id = 0;
901
902 if (strnstr(kcontrol->id.name, "SLIM_0_RX", sizeof("SLIM_0_RX"))) {
903 port_id = SLIM_RX_0;
904 } else if (strnstr(kcontrol->id.name,
905 "SLIM_2_RX", sizeof("SLIM_2_RX"))) {
906 port_id = SLIM_RX_2;
907 } else if (strnstr(kcontrol->id.name,
908 "SLIM_5_RX", sizeof("SLIM_5_RX"))) {
909 port_id = SLIM_RX_5;
910 } else if (strnstr(kcontrol->id.name,
911 "SLIM_6_RX", sizeof("SLIM_6_RX"))) {
912 port_id = SLIM_RX_6;
913 } else if (strnstr(kcontrol->id.name,
914 "SLIM_0_TX", sizeof("SLIM_0_TX"))) {
915 port_id = SLIM_TX_0;
916 } else if (strnstr(kcontrol->id.name,
917 "SLIM_1_TX", sizeof("SLIM_1_TX"))) {
918 port_id = SLIM_TX_1;
919 } else {
920 pr_err("%s: unsupported channel: %s\n",
921 __func__, kcontrol->id.name);
922 return -EINVAL;
923 }
924
925 return port_id;
926}
927
928static int slim_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
929 struct snd_ctl_elem_value *ucontrol)
930{
931 int ch_num = slim_get_port_idx(kcontrol);
932
933 if (ch_num < 0)
934 return ch_num;
935
936 ucontrol->value.enumerated.item[0] =
937 slim_get_sample_rate_val(slim_rx_cfg[ch_num].sample_rate);
938
939 pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__,
940 ch_num, slim_rx_cfg[ch_num].sample_rate,
941 ucontrol->value.enumerated.item[0]);
942
943 return 0;
944}
945
946static int slim_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
947 struct snd_ctl_elem_value *ucontrol)
948{
949 int ch_num = slim_get_port_idx(kcontrol);
950
951 if (ch_num < 0)
952 return ch_num;
953
954 slim_rx_cfg[ch_num].sample_rate =
955 slim_get_sample_rate(ucontrol->value.enumerated.item[0]);
956
957 pr_debug("%s: slim[%d]_rx_sample_rate = %d, item = %d\n", __func__,
958 ch_num, slim_rx_cfg[ch_num].sample_rate,
959 ucontrol->value.enumerated.item[0]);
960
961 return 0;
962}
963
964static int slim_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
965 struct snd_ctl_elem_value *ucontrol)
966{
967 int ch_num = slim_get_port_idx(kcontrol);
968
969 if (ch_num < 0)
970 return ch_num;
971
972 ucontrol->value.enumerated.item[0] =
973 slim_get_sample_rate_val(slim_tx_cfg[ch_num].sample_rate);
974
975 pr_debug("%s: slim[%d]_tx_sample_rate = %d, item = %d\n", __func__,
976 ch_num, slim_tx_cfg[ch_num].sample_rate,
977 ucontrol->value.enumerated.item[0]);
978
979 return 0;
980}
981
982static int slim_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
983 struct snd_ctl_elem_value *ucontrol)
984{
985 int sample_rate = 0;
986 int ch_num = slim_get_port_idx(kcontrol);
987
988 if (ch_num < 0)
989 return ch_num;
990
991 sample_rate = slim_get_sample_rate(ucontrol->value.enumerated.item[0]);
992 if (sample_rate == SAMPLING_RATE_44P1KHZ) {
993 pr_err("%s: Unsupported sample rate %d: for Tx path\n",
994 __func__, sample_rate);
995 return -EINVAL;
996 }
997 slim_tx_cfg[ch_num].sample_rate = sample_rate;
998
999 pr_debug("%s: slim[%d]_tx_sample_rate = %d, value = %d\n", __func__,
1000 ch_num, slim_tx_cfg[ch_num].sample_rate,
1001 ucontrol->value.enumerated.item[0]);
1002
1003 return 0;
1004}
1005
1006static int slim_rx_bit_format_get(struct snd_kcontrol *kcontrol,
1007 struct snd_ctl_elem_value *ucontrol)
1008{
1009 int ch_num = slim_get_port_idx(kcontrol);
1010
1011 if (ch_num < 0)
1012 return ch_num;
1013
1014 ucontrol->value.enumerated.item[0] =
1015 slim_get_bit_format_val(slim_rx_cfg[ch_num].bit_format);
1016
1017 pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n",
1018 __func__, ch_num, slim_rx_cfg[ch_num].bit_format,
1019 ucontrol->value.enumerated.item[0]);
1020
1021 return 0;
1022}
1023
1024static int slim_rx_bit_format_put(struct snd_kcontrol *kcontrol,
1025 struct snd_ctl_elem_value *ucontrol)
1026{
1027 int ch_num = slim_get_port_idx(kcontrol);
1028
1029 if (ch_num < 0)
1030 return ch_num;
1031
1032 slim_rx_cfg[ch_num].bit_format =
1033 slim_get_bit_format(ucontrol->value.enumerated.item[0]);
1034
1035 pr_debug("%s: slim[%d]_rx_bit_format = %d, ucontrol value = %d\n",
1036 __func__, ch_num, slim_rx_cfg[ch_num].bit_format,
1037 ucontrol->value.enumerated.item[0]);
1038
1039 return 0;
1040}
1041
1042static int slim_tx_bit_format_get(struct snd_kcontrol *kcontrol,
1043 struct snd_ctl_elem_value *ucontrol)
1044{
1045 int ch_num = slim_get_port_idx(kcontrol);
1046
1047 if (ch_num < 0)
1048 return ch_num;
1049
1050 ucontrol->value.enumerated.item[0] =
1051 slim_get_bit_format_val(slim_tx_cfg[ch_num].bit_format);
1052
1053 pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n",
1054 __func__, ch_num, slim_tx_cfg[ch_num].bit_format,
1055 ucontrol->value.enumerated.item[0]);
1056
1057 return 0;
1058}
1059
1060static int slim_tx_bit_format_put(struct snd_kcontrol *kcontrol,
1061 struct snd_ctl_elem_value *ucontrol)
1062{
1063 int ch_num = slim_get_port_idx(kcontrol);
1064
1065 if (ch_num < 0)
1066 return ch_num;
1067
1068 slim_tx_cfg[ch_num].bit_format =
1069 slim_get_bit_format(ucontrol->value.enumerated.item[0]);
1070
1071 pr_debug("%s: slim[%d]_tx_bit_format = %d, ucontrol value = %d\n",
1072 __func__, ch_num, slim_tx_cfg[ch_num].bit_format,
1073 ucontrol->value.enumerated.item[0]);
1074
1075 return 0;
1076}
1077
1078static int slim_rx_ch_get(struct snd_kcontrol *kcontrol,
1079 struct snd_ctl_elem_value *ucontrol)
1080{
1081 int ch_num = slim_get_port_idx(kcontrol);
1082
1083 if (ch_num < 0)
1084 return ch_num;
1085
1086 pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__,
1087 ch_num, slim_rx_cfg[ch_num].channels);
1088 ucontrol->value.enumerated.item[0] = slim_rx_cfg[ch_num].channels - 1;
1089
1090 return 0;
1091}
1092
1093static int slim_rx_ch_put(struct snd_kcontrol *kcontrol,
1094 struct snd_ctl_elem_value *ucontrol)
1095{
1096 int ch_num = slim_get_port_idx(kcontrol);
1097
1098 if (ch_num < 0)
1099 return ch_num;
1100
1101 slim_rx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1;
1102 pr_debug("%s: msm_slim_[%d]_rx_ch = %d\n", __func__,
1103 ch_num, slim_rx_cfg[ch_num].channels);
1104
1105 return 1;
1106}
1107
1108static int slim_tx_ch_get(struct snd_kcontrol *kcontrol,
1109 struct snd_ctl_elem_value *ucontrol)
1110{
1111 int ch_num = slim_get_port_idx(kcontrol);
1112
1113 if (ch_num < 0)
1114 return ch_num;
1115
1116 pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__,
1117 ch_num, slim_tx_cfg[ch_num].channels);
1118 ucontrol->value.enumerated.item[0] = slim_tx_cfg[ch_num].channels - 1;
1119
1120 return 0;
1121}
1122
1123static int slim_tx_ch_put(struct snd_kcontrol *kcontrol,
1124 struct snd_ctl_elem_value *ucontrol)
1125{
1126 int ch_num = slim_get_port_idx(kcontrol);
1127
1128 if (ch_num < 0)
1129 return ch_num;
1130
1131 slim_tx_cfg[ch_num].channels = ucontrol->value.enumerated.item[0] + 1;
1132 pr_debug("%s: msm_slim_[%d]_tx_ch = %d\n", __func__,
1133 ch_num, slim_tx_cfg[ch_num].channels);
1134
1135 return 1;
1136}
1137
1138static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
1139 struct snd_ctl_elem_value *ucontrol)
1140{
1141 ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1;
1142 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
1143 ucontrol->value.integer.value[0]);
1144 return 0;
1145}
1146
1147static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
1148 struct snd_ctl_elem_value *ucontrol)
1149{
1150 msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1;
1151
1152 pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch);
1153 return 1;
1154}
1155
1156static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol,
1157 struct snd_ctl_elem_value *ucontrol)
1158{
1159 /*
1160 * Slimbus_7_Rx/Tx sample rate values should always be in sync (same)
1161 * when used for BT_SCO use case. Return either Rx or Tx sample rate
1162 * value.
1163 */
1164 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
1165 case SAMPLING_RATE_96KHZ:
1166 ucontrol->value.integer.value[0] = 5;
1167 break;
1168 case SAMPLING_RATE_88P2KHZ:
1169 ucontrol->value.integer.value[0] = 4;
1170 break;
1171 case SAMPLING_RATE_48KHZ:
1172 ucontrol->value.integer.value[0] = 3;
1173 break;
1174 case SAMPLING_RATE_44P1KHZ:
1175 ucontrol->value.integer.value[0] = 2;
1176 break;
1177 case SAMPLING_RATE_16KHZ:
1178 ucontrol->value.integer.value[0] = 1;
1179 break;
1180 case SAMPLING_RATE_8KHZ:
1181 default:
1182 ucontrol->value.integer.value[0] = 0;
1183 break;
1184 }
1185 pr_debug("%s: sample rate = %d\n", __func__,
1186 slim_rx_cfg[SLIM_RX_7].sample_rate);
1187
1188 return 0;
1189}
1190
1191static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol,
1192 struct snd_ctl_elem_value *ucontrol)
1193{
1194 switch (ucontrol->value.integer.value[0]) {
1195 case 1:
1196 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
1197 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
1198 break;
1199 case 2:
1200 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
1201 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
1202 break;
1203 case 3:
1204 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
1205 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
1206 break;
1207 case 4:
1208 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
1209 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
1210 break;
1211 case 5:
1212 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
1213 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
1214 break;
1215 case 0:
1216 default:
1217 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
1218 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
1219 break;
1220 }
1221 pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n",
1222 __func__,
1223 slim_rx_cfg[SLIM_RX_7].sample_rate,
1224 slim_tx_cfg[SLIM_TX_7].sample_rate,
1225 ucontrol->value.enumerated.item[0]);
1226
1227 return 0;
1228}
Sharad Sangle493a1b32018-09-19 15:52:15 +05301229static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol,
1230 struct snd_ctl_elem_value *ucontrol)
1231{
1232 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
1233 case SAMPLING_RATE_96KHZ:
1234 ucontrol->value.integer.value[0] = 5;
1235 break;
1236 case SAMPLING_RATE_88P2KHZ:
1237 ucontrol->value.integer.value[0] = 4;
1238 break;
1239 case SAMPLING_RATE_48KHZ:
1240 ucontrol->value.integer.value[0] = 3;
1241 break;
1242 case SAMPLING_RATE_44P1KHZ:
1243 ucontrol->value.integer.value[0] = 2;
1244 break;
1245 case SAMPLING_RATE_16KHZ:
1246 ucontrol->value.integer.value[0] = 1;
1247 break;
1248 case SAMPLING_RATE_8KHZ:
1249 default:
1250 ucontrol->value.integer.value[0] = 0;
1251 break;
1252 }
1253 pr_debug("%s: sample rate rx = %d", __func__,
1254 slim_rx_cfg[SLIM_RX_7].sample_rate);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301255
Sharad Sangle493a1b32018-09-19 15:52:15 +05301256 return 0;
1257}
1258
1259static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol,
1260 struct snd_ctl_elem_value *ucontrol)
1261{
1262 switch (ucontrol->value.integer.value[0]) {
1263 case 1:
1264 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
1265 break;
1266 case 2:
1267 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
1268 break;
1269 case 3:
1270 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
1271 break;
1272 case 4:
1273 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
1274 break;
1275 case 5:
1276 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
1277 break;
1278 case 0:
1279 default:
1280 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
1281 break;
1282 }
1283 pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n",
1284 __func__,
1285 slim_rx_cfg[SLIM_RX_7].sample_rate,
1286 ucontrol->value.enumerated.item[0]);
1287
1288 return 0;
1289}
1290
1291static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol,
1292 struct snd_ctl_elem_value *ucontrol)
1293{
1294 switch (slim_tx_cfg[SLIM_TX_7].sample_rate) {
1295 case SAMPLING_RATE_96KHZ:
1296 ucontrol->value.integer.value[0] = 5;
1297 break;
1298 case SAMPLING_RATE_88P2KHZ:
1299 ucontrol->value.integer.value[0] = 4;
1300 break;
1301 case SAMPLING_RATE_48KHZ:
1302 ucontrol->value.integer.value[0] = 3;
1303 break;
1304 case SAMPLING_RATE_44P1KHZ:
1305 ucontrol->value.integer.value[0] = 2;
1306 break;
1307 case SAMPLING_RATE_16KHZ:
1308 ucontrol->value.integer.value[0] = 1;
1309 break;
1310 case SAMPLING_RATE_8KHZ:
1311 default:
1312 ucontrol->value.integer.value[0] = 0;
1313 break;
1314 }
1315 pr_debug("%s: sample rate tx = %d", __func__,
1316 slim_tx_cfg[SLIM_TX_7].sample_rate);
1317
1318 return 0;
1319}
1320
1321static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol,
1322 struct snd_ctl_elem_value *ucontrol)
1323{
1324 switch (ucontrol->value.integer.value[0]) {
1325 case 1:
1326 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
1327 break;
1328 case 2:
1329 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
1330 break;
1331 case 3:
1332 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
1333 break;
1334 case 4:
1335 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
1336 break;
1337 case 5:
1338 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
1339 break;
1340 case 0:
1341 default:
1342 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
1343 break;
1344 }
1345 pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n",
1346 __func__,
1347 slim_tx_cfg[SLIM_TX_7].sample_rate,
1348 ucontrol->value.enumerated.item[0]);
1349
1350 return 0;
1351}
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301352static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol)
1353{
1354 int idx = 0;
1355
1356 if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0",
1357 sizeof("WSA_CDC_DMA_RX_0")))
1358 idx = WSA_CDC_DMA_RX_0;
1359 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1",
1360 sizeof("WSA_CDC_DMA_RX_0")))
1361 idx = WSA_CDC_DMA_RX_1;
1362 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_0",
1363 sizeof("RX_CDC_DMA_RX_0")))
1364 idx = RX_CDC_DMA_RX_0;
1365 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_1",
1366 sizeof("RX_CDC_DMA_RX_1")))
1367 idx = RX_CDC_DMA_RX_1;
1368 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_2",
1369 sizeof("RX_CDC_DMA_RX_2")))
1370 idx = RX_CDC_DMA_RX_2;
1371 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_3",
1372 sizeof("RX_CDC_DMA_RX_3")))
1373 idx = RX_CDC_DMA_RX_3;
1374 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_5",
1375 sizeof("RX_CDC_DMA_RX_5")))
1376 idx = RX_CDC_DMA_RX_5;
1377 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0",
1378 sizeof("WSA_CDC_DMA_TX_0")))
1379 idx = WSA_CDC_DMA_TX_0;
1380 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1",
1381 sizeof("WSA_CDC_DMA_TX_1")))
1382 idx = WSA_CDC_DMA_TX_1;
1383 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2",
1384 sizeof("WSA_CDC_DMA_TX_2")))
1385 idx = WSA_CDC_DMA_TX_2;
1386 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_0",
1387 sizeof("TX_CDC_DMA_TX_0")))
1388 idx = TX_CDC_DMA_TX_0;
1389 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_3",
1390 sizeof("TX_CDC_DMA_TX_3")))
1391 idx = TX_CDC_DMA_TX_3;
1392 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_4",
1393 sizeof("TX_CDC_DMA_TX_4")))
1394 idx = TX_CDC_DMA_TX_4;
1395 else {
1396 pr_err("%s: unsupported channel: %s\n",
1397 __func__, kcontrol->id.name);
1398 return -EINVAL;
1399 }
1400
1401 return idx;
1402}
1403
1404static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol,
1405 struct snd_ctl_elem_value *ucontrol)
1406{
1407 int ch_num = cdc_dma_get_port_idx(kcontrol);
1408
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301409 if (ch_num < 0) {
1410 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301411 return ch_num;
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301412 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301413
1414 pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__,
1415 cdc_dma_rx_cfg[ch_num].channels - 1);
1416 ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1;
1417 return 0;
1418}
1419
1420static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol,
1421 struct snd_ctl_elem_value *ucontrol)
1422{
1423 int ch_num = cdc_dma_get_port_idx(kcontrol);
1424
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301425 if (ch_num < 0) {
1426 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301427 return ch_num;
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301428 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301429
1430 cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1;
1431
1432 pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__,
1433 cdc_dma_rx_cfg[ch_num].channels);
1434 return 1;
1435}
1436
1437static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol,
1438 struct snd_ctl_elem_value *ucontrol)
1439{
1440 int ch_num = cdc_dma_get_port_idx(kcontrol);
1441
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301442 if (ch_num < 0) {
1443 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1444 return ch_num;
1445 }
1446
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301447 switch (cdc_dma_rx_cfg[ch_num].bit_format) {
1448 case SNDRV_PCM_FORMAT_S32_LE:
1449 ucontrol->value.integer.value[0] = 3;
1450 break;
1451 case SNDRV_PCM_FORMAT_S24_3LE:
1452 ucontrol->value.integer.value[0] = 2;
1453 break;
1454 case SNDRV_PCM_FORMAT_S24_LE:
1455 ucontrol->value.integer.value[0] = 1;
1456 break;
1457 case SNDRV_PCM_FORMAT_S16_LE:
1458 default:
1459 ucontrol->value.integer.value[0] = 0;
1460 break;
1461 }
1462
1463 pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n",
1464 __func__, cdc_dma_rx_cfg[ch_num].bit_format,
1465 ucontrol->value.integer.value[0]);
1466 return 0;
1467}
1468
1469static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol,
1470 struct snd_ctl_elem_value *ucontrol)
1471{
1472 int rc = 0;
1473 int ch_num = cdc_dma_get_port_idx(kcontrol);
1474
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301475 if (ch_num < 0) {
1476 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1477 return ch_num;
1478 }
1479
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301480 switch (ucontrol->value.integer.value[0]) {
1481 case 3:
1482 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE;
1483 break;
1484 case 2:
1485 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1486 break;
1487 case 1:
1488 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE;
1489 break;
1490 case 0:
1491 default:
1492 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE;
1493 break;
1494 }
1495 pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n",
1496 __func__, cdc_dma_rx_cfg[ch_num].bit_format,
1497 ucontrol->value.integer.value[0]);
1498
1499 return rc;
1500}
1501
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301502
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301503static int cdc_dma_get_sample_rate_val(int sample_rate)
1504{
1505 int sample_rate_val = 0;
1506
1507 switch (sample_rate) {
1508 case SAMPLING_RATE_8KHZ:
1509 sample_rate_val = 0;
1510 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301511 case SAMPLING_RATE_11P025KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301512 sample_rate_val = 1;
1513 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301514 case SAMPLING_RATE_16KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301515 sample_rate_val = 2;
1516 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301517 case SAMPLING_RATE_22P05KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301518 sample_rate_val = 3;
1519 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301520 case SAMPLING_RATE_32KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301521 sample_rate_val = 4;
1522 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301523 case SAMPLING_RATE_44P1KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301524 sample_rate_val = 5;
1525 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301526 case SAMPLING_RATE_48KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301527 sample_rate_val = 6;
1528 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301529 case SAMPLING_RATE_88P2KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301530 sample_rate_val = 7;
1531 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301532 case SAMPLING_RATE_96KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301533 sample_rate_val = 8;
1534 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301535 case SAMPLING_RATE_176P4KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301536 sample_rate_val = 9;
1537 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301538 case SAMPLING_RATE_192KHZ:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301539 sample_rate_val = 10;
1540 break;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301541 case SAMPLING_RATE_352P8KHZ:
1542 sample_rate_val = 11;
1543 break;
1544 case SAMPLING_RATE_384KHZ:
1545 sample_rate_val = 12;
1546 break;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301547 default:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301548 sample_rate_val = 6;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301549 break;
1550 }
1551 return sample_rate_val;
1552}
1553
1554static int cdc_dma_get_sample_rate(int value)
1555{
1556 int sample_rate = 0;
1557
1558 switch (value) {
1559 case 0:
1560 sample_rate = SAMPLING_RATE_8KHZ;
1561 break;
1562 case 1:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301563 sample_rate = SAMPLING_RATE_11P025KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301564 break;
1565 case 2:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301566 sample_rate = SAMPLING_RATE_16KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301567 break;
1568 case 3:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301569 sample_rate = SAMPLING_RATE_22P05KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301570 break;
1571 case 4:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301572 sample_rate = SAMPLING_RATE_32KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301573 break;
1574 case 5:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301575 sample_rate = SAMPLING_RATE_44P1KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301576 break;
1577 case 6:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301578 sample_rate = SAMPLING_RATE_48KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301579 break;
1580 case 7:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301581 sample_rate = SAMPLING_RATE_88P2KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301582 break;
1583 case 8:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301584 sample_rate = SAMPLING_RATE_96KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301585 break;
1586 case 9:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301587 sample_rate = SAMPLING_RATE_176P4KHZ;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301588 break;
1589 case 10:
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05301590 sample_rate = SAMPLING_RATE_192KHZ;
1591 break;
1592 case 11:
1593 sample_rate = SAMPLING_RATE_352P8KHZ;
1594 break;
1595 case 12:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301596 sample_rate = SAMPLING_RATE_384KHZ;
1597 break;
1598 default:
1599 sample_rate = SAMPLING_RATE_48KHZ;
1600 break;
1601 }
1602 return sample_rate;
1603}
1604
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301605static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1606 struct snd_ctl_elem_value *ucontrol)
1607{
1608 int ch_num = cdc_dma_get_port_idx(kcontrol);
1609
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301610 if (ch_num < 0) {
1611 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301612 return ch_num;
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301613 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301614
1615 ucontrol->value.enumerated.item[0] =
1616 cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate);
1617
1618 pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__,
1619 cdc_dma_rx_cfg[ch_num].sample_rate);
1620 return 0;
1621}
1622
1623static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1624 struct snd_ctl_elem_value *ucontrol)
1625{
1626 int ch_num = cdc_dma_get_port_idx(kcontrol);
1627
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301628 if (ch_num < 0) {
1629 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301630 return ch_num;
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301631 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301632
1633 cdc_dma_rx_cfg[ch_num].sample_rate =
1634 cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]);
1635
1636
1637 pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n",
1638 __func__, ucontrol->value.enumerated.item[0],
1639 cdc_dma_rx_cfg[ch_num].sample_rate);
1640 return 0;
1641}
1642
1643static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol,
1644 struct snd_ctl_elem_value *ucontrol)
1645{
1646 int ch_num = cdc_dma_get_port_idx(kcontrol);
1647
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301648 if (ch_num < 0) {
1649 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1650 return ch_num;
1651 }
1652
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301653 pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__,
1654 cdc_dma_tx_cfg[ch_num].channels);
1655 ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1;
1656 return 0;
1657}
1658
1659static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol,
1660 struct snd_ctl_elem_value *ucontrol)
1661{
1662 int ch_num = cdc_dma_get_port_idx(kcontrol);
1663
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301664 if (ch_num < 0) {
1665 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1666 return ch_num;
1667 }
1668
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301669 cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1;
1670
1671 pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__,
1672 cdc_dma_tx_cfg[ch_num].channels);
1673 return 1;
1674}
1675
1676static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1677 struct snd_ctl_elem_value *ucontrol)
1678{
1679 int sample_rate_val;
1680 int ch_num = cdc_dma_get_port_idx(kcontrol);
1681
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301682 if (ch_num < 0) {
1683 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1684 return ch_num;
1685 }
1686
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301687 switch (cdc_dma_tx_cfg[ch_num].sample_rate) {
1688 case SAMPLING_RATE_384KHZ:
1689 sample_rate_val = 12;
1690 break;
1691 case SAMPLING_RATE_352P8KHZ:
1692 sample_rate_val = 11;
1693 break;
1694 case SAMPLING_RATE_192KHZ:
1695 sample_rate_val = 10;
1696 break;
1697 case SAMPLING_RATE_176P4KHZ:
1698 sample_rate_val = 9;
1699 break;
1700 case SAMPLING_RATE_96KHZ:
1701 sample_rate_val = 8;
1702 break;
1703 case SAMPLING_RATE_88P2KHZ:
1704 sample_rate_val = 7;
1705 break;
1706 case SAMPLING_RATE_48KHZ:
1707 sample_rate_val = 6;
1708 break;
1709 case SAMPLING_RATE_44P1KHZ:
1710 sample_rate_val = 5;
1711 break;
1712 case SAMPLING_RATE_32KHZ:
1713 sample_rate_val = 4;
1714 break;
1715 case SAMPLING_RATE_22P05KHZ:
1716 sample_rate_val = 3;
1717 break;
1718 case SAMPLING_RATE_16KHZ:
1719 sample_rate_val = 2;
1720 break;
1721 case SAMPLING_RATE_11P025KHZ:
1722 sample_rate_val = 1;
1723 break;
1724 case SAMPLING_RATE_8KHZ:
1725 sample_rate_val = 0;
1726 break;
1727 default:
1728 sample_rate_val = 6;
1729 break;
1730 }
1731
1732 ucontrol->value.integer.value[0] = sample_rate_val;
1733 pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__,
1734 cdc_dma_tx_cfg[ch_num].sample_rate);
1735 return 0;
1736}
1737
1738static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1739 struct snd_ctl_elem_value *ucontrol)
1740{
1741 int ch_num = cdc_dma_get_port_idx(kcontrol);
1742
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301743 if (ch_num < 0) {
1744 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1745 return ch_num;
1746 }
1747
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301748 switch (ucontrol->value.integer.value[0]) {
1749 case 12:
1750 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ;
1751 break;
1752 case 11:
1753 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ;
1754 break;
1755 case 10:
1756 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ;
1757 break;
1758 case 9:
1759 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ;
1760 break;
1761 case 8:
1762 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ;
1763 break;
1764 case 7:
1765 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ;
1766 break;
1767 case 6:
1768 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ;
1769 break;
1770 case 5:
1771 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ;
1772 break;
1773 case 4:
1774 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ;
1775 break;
1776 case 3:
1777 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ;
1778 break;
1779 case 2:
1780 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ;
1781 break;
1782 case 1:
1783 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ;
1784 break;
1785 case 0:
1786 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ;
1787 break;
1788 default:
1789 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ;
1790 break;
1791 }
1792
1793 pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n",
1794 __func__, ucontrol->value.integer.value[0],
1795 cdc_dma_tx_cfg[ch_num].sample_rate);
1796 return 0;
1797}
1798
1799static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol,
1800 struct snd_ctl_elem_value *ucontrol)
1801{
1802 int ch_num = cdc_dma_get_port_idx(kcontrol);
1803
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301804 if (ch_num < 0) {
1805 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1806 return ch_num;
1807 }
1808
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301809 switch (cdc_dma_tx_cfg[ch_num].bit_format) {
1810 case SNDRV_PCM_FORMAT_S32_LE:
1811 ucontrol->value.integer.value[0] = 3;
1812 break;
1813 case SNDRV_PCM_FORMAT_S24_3LE:
1814 ucontrol->value.integer.value[0] = 2;
1815 break;
1816 case SNDRV_PCM_FORMAT_S24_LE:
1817 ucontrol->value.integer.value[0] = 1;
1818 break;
1819 case SNDRV_PCM_FORMAT_S16_LE:
1820 default:
1821 ucontrol->value.integer.value[0] = 0;
1822 break;
1823 }
1824
1825 pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n",
1826 __func__, cdc_dma_tx_cfg[ch_num].bit_format,
1827 ucontrol->value.integer.value[0]);
1828 return 0;
1829}
1830
1831static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol,
1832 struct snd_ctl_elem_value *ucontrol)
1833{
1834 int rc = 0;
1835 int ch_num = cdc_dma_get_port_idx(kcontrol);
1836
Tanya Dixitd85e6f32018-09-14 16:06:20 +05301837 if (ch_num < 0) {
1838 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
1839 return ch_num;
1840 }
1841
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301842 switch (ucontrol->value.integer.value[0]) {
1843 case 3:
1844 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE;
1845 break;
1846 case 2:
1847 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1848 break;
1849 case 1:
1850 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE;
1851 break;
1852 case 0:
1853 default:
1854 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE;
1855 break;
1856 }
1857 pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n",
1858 __func__, cdc_dma_tx_cfg[ch_num].bit_format,
1859 ucontrol->value.integer.value[0]);
1860
1861 return rc;
1862}
1863
Aditya Bavanari44eb8952018-05-09 19:01:50 +05301864static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol,
1865 struct snd_ctl_elem_value *ucontrol)
1866{
1867 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__,
1868 usb_rx_cfg.channels);
1869 ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1;
1870 return 0;
1871}
1872
1873static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol,
1874 struct snd_ctl_elem_value *ucontrol)
1875{
1876 usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1877
1878 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels);
1879 return 1;
1880}
1881
1882static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1883 struct snd_ctl_elem_value *ucontrol)
1884{
1885 int sample_rate_val;
1886
1887 switch (usb_rx_cfg.sample_rate) {
1888 case SAMPLING_RATE_384KHZ:
1889 sample_rate_val = 12;
1890 break;
1891 case SAMPLING_RATE_352P8KHZ:
1892 sample_rate_val = 11;
1893 break;
1894 case SAMPLING_RATE_192KHZ:
1895 sample_rate_val = 10;
1896 break;
1897 case SAMPLING_RATE_176P4KHZ:
1898 sample_rate_val = 9;
1899 break;
1900 case SAMPLING_RATE_96KHZ:
1901 sample_rate_val = 8;
1902 break;
1903 case SAMPLING_RATE_88P2KHZ:
1904 sample_rate_val = 7;
1905 break;
1906 case SAMPLING_RATE_48KHZ:
1907 sample_rate_val = 6;
1908 break;
1909 case SAMPLING_RATE_44P1KHZ:
1910 sample_rate_val = 5;
1911 break;
1912 case SAMPLING_RATE_32KHZ:
1913 sample_rate_val = 4;
1914 break;
1915 case SAMPLING_RATE_22P05KHZ:
1916 sample_rate_val = 3;
1917 break;
1918 case SAMPLING_RATE_16KHZ:
1919 sample_rate_val = 2;
1920 break;
1921 case SAMPLING_RATE_11P025KHZ:
1922 sample_rate_val = 1;
1923 break;
1924 case SAMPLING_RATE_8KHZ:
1925 default:
1926 sample_rate_val = 0;
1927 break;
1928 }
1929
1930 ucontrol->value.integer.value[0] = sample_rate_val;
1931 pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__,
1932 usb_rx_cfg.sample_rate);
1933 return 0;
1934}
1935
1936static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1937 struct snd_ctl_elem_value *ucontrol)
1938{
1939 switch (ucontrol->value.integer.value[0]) {
1940 case 12:
1941 usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
1942 break;
1943 case 11:
1944 usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
1945 break;
1946 case 10:
1947 usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
1948 break;
1949 case 9:
1950 usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
1951 break;
1952 case 8:
1953 usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
1954 break;
1955 case 7:
1956 usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
1957 break;
1958 case 6:
1959 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1960 break;
1961 case 5:
1962 usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
1963 break;
1964 case 4:
1965 usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
1966 break;
1967 case 3:
1968 usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
1969 break;
1970 case 2:
1971 usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
1972 break;
1973 case 1:
1974 usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
1975 break;
1976 case 0:
1977 usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
1978 break;
1979 default:
1980 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
1981 break;
1982 }
1983
1984 pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n",
1985 __func__, ucontrol->value.integer.value[0],
1986 usb_rx_cfg.sample_rate);
1987 return 0;
1988}
1989
1990static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol,
1991 struct snd_ctl_elem_value *ucontrol)
1992{
1993 switch (usb_rx_cfg.bit_format) {
1994 case SNDRV_PCM_FORMAT_S32_LE:
1995 ucontrol->value.integer.value[0] = 3;
1996 break;
1997 case SNDRV_PCM_FORMAT_S24_3LE:
1998 ucontrol->value.integer.value[0] = 2;
1999 break;
2000 case SNDRV_PCM_FORMAT_S24_LE:
2001 ucontrol->value.integer.value[0] = 1;
2002 break;
2003 case SNDRV_PCM_FORMAT_S16_LE:
2004 default:
2005 ucontrol->value.integer.value[0] = 0;
2006 break;
2007 }
2008
2009 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
2010 __func__, usb_rx_cfg.bit_format,
2011 ucontrol->value.integer.value[0]);
2012 return 0;
2013}
2014
2015static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol,
2016 struct snd_ctl_elem_value *ucontrol)
2017{
2018 int rc = 0;
2019
2020 switch (ucontrol->value.integer.value[0]) {
2021 case 3:
2022 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
2023 break;
2024 case 2:
2025 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
2026 break;
2027 case 1:
2028 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
2029 break;
2030 case 0:
2031 default:
2032 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
2033 break;
2034 }
2035 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
2036 __func__, usb_rx_cfg.bit_format,
2037 ucontrol->value.integer.value[0]);
2038
2039 return rc;
2040}
2041
2042static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol,
2043 struct snd_ctl_elem_value *ucontrol)
2044{
2045 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__,
2046 usb_tx_cfg.channels);
2047 ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1;
2048 return 0;
2049}
2050
2051static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol,
2052 struct snd_ctl_elem_value *ucontrol)
2053{
2054 usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1;
2055
2056 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels);
2057 return 1;
2058}
2059
2060static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2061 struct snd_ctl_elem_value *ucontrol)
2062{
2063 int sample_rate_val;
2064
2065 switch (usb_tx_cfg.sample_rate) {
2066 case SAMPLING_RATE_384KHZ:
2067 sample_rate_val = 12;
2068 break;
2069 case SAMPLING_RATE_352P8KHZ:
2070 sample_rate_val = 11;
2071 break;
2072 case SAMPLING_RATE_192KHZ:
2073 sample_rate_val = 10;
2074 break;
2075 case SAMPLING_RATE_176P4KHZ:
2076 sample_rate_val = 9;
2077 break;
2078 case SAMPLING_RATE_96KHZ:
2079 sample_rate_val = 8;
2080 break;
2081 case SAMPLING_RATE_88P2KHZ:
2082 sample_rate_val = 7;
2083 break;
2084 case SAMPLING_RATE_48KHZ:
2085 sample_rate_val = 6;
2086 break;
2087 case SAMPLING_RATE_44P1KHZ:
2088 sample_rate_val = 5;
2089 break;
2090 case SAMPLING_RATE_32KHZ:
2091 sample_rate_val = 4;
2092 break;
2093 case SAMPLING_RATE_22P05KHZ:
2094 sample_rate_val = 3;
2095 break;
2096 case SAMPLING_RATE_16KHZ:
2097 sample_rate_val = 2;
2098 break;
2099 case SAMPLING_RATE_11P025KHZ:
2100 sample_rate_val = 1;
2101 break;
2102 case SAMPLING_RATE_8KHZ:
2103 sample_rate_val = 0;
2104 break;
2105 default:
2106 sample_rate_val = 6;
2107 break;
2108 }
2109
2110 ucontrol->value.integer.value[0] = sample_rate_val;
2111 pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__,
2112 usb_tx_cfg.sample_rate);
2113 return 0;
2114}
2115
2116static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2117 struct snd_ctl_elem_value *ucontrol)
2118{
2119 switch (ucontrol->value.integer.value[0]) {
2120 case 12:
2121 usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
2122 break;
2123 case 11:
2124 usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
2125 break;
2126 case 10:
2127 usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
2128 break;
2129 case 9:
2130 usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
2131 break;
2132 case 8:
2133 usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
2134 break;
2135 case 7:
2136 usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
2137 break;
2138 case 6:
2139 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
2140 break;
2141 case 5:
2142 usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
2143 break;
2144 case 4:
2145 usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
2146 break;
2147 case 3:
2148 usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
2149 break;
2150 case 2:
2151 usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
2152 break;
2153 case 1:
2154 usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
2155 break;
2156 case 0:
2157 usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
2158 break;
2159 default:
2160 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
2161 break;
2162 }
2163
2164 pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n",
2165 __func__, ucontrol->value.integer.value[0],
2166 usb_tx_cfg.sample_rate);
2167 return 0;
2168}
2169
2170static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol,
2171 struct snd_ctl_elem_value *ucontrol)
2172{
2173 switch (usb_tx_cfg.bit_format) {
2174 case SNDRV_PCM_FORMAT_S32_LE:
2175 ucontrol->value.integer.value[0] = 3;
2176 break;
2177 case SNDRV_PCM_FORMAT_S24_3LE:
2178 ucontrol->value.integer.value[0] = 2;
2179 break;
2180 case SNDRV_PCM_FORMAT_S24_LE:
2181 ucontrol->value.integer.value[0] = 1;
2182 break;
2183 case SNDRV_PCM_FORMAT_S16_LE:
2184 default:
2185 ucontrol->value.integer.value[0] = 0;
2186 break;
2187 }
2188
2189 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
2190 __func__, usb_tx_cfg.bit_format,
2191 ucontrol->value.integer.value[0]);
2192 return 0;
2193}
2194
2195static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol,
2196 struct snd_ctl_elem_value *ucontrol)
2197{
2198 int rc = 0;
2199
2200 switch (ucontrol->value.integer.value[0]) {
2201 case 3:
2202 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
2203 break;
2204 case 2:
2205 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
2206 break;
2207 case 1:
2208 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
2209 break;
2210 case 0:
2211 default:
2212 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
2213 break;
2214 }
2215 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
2216 __func__, usb_tx_cfg.bit_format,
2217 ucontrol->value.integer.value[0]);
2218
2219 return rc;
2220}
2221
2222static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol)
2223{
2224 int idx;
2225
2226 if (strnstr(kcontrol->id.name, "Display Port RX",
2227 sizeof("Display Port RX"))) {
2228 idx = DP_RX_IDX;
2229 } else {
2230 pr_err("%s: unsupported BE: %s\n",
2231 __func__, kcontrol->id.name);
2232 idx = -EINVAL;
2233 }
2234
2235 return idx;
2236}
2237
2238static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol,
2239 struct snd_ctl_elem_value *ucontrol)
2240{
2241 int idx = ext_disp_get_port_idx(kcontrol);
2242
2243 if (idx < 0)
2244 return idx;
2245
2246 switch (ext_disp_rx_cfg[idx].bit_format) {
2247 case SNDRV_PCM_FORMAT_S24_3LE:
2248 ucontrol->value.integer.value[0] = 2;
2249 break;
2250 case SNDRV_PCM_FORMAT_S24_LE:
2251 ucontrol->value.integer.value[0] = 1;
2252 break;
2253 case SNDRV_PCM_FORMAT_S16_LE:
2254 default:
2255 ucontrol->value.integer.value[0] = 0;
2256 break;
2257 }
2258
2259 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
2260 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
2261 ucontrol->value.integer.value[0]);
2262 return 0;
2263}
2264
2265static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol,
2266 struct snd_ctl_elem_value *ucontrol)
2267{
2268 int idx = ext_disp_get_port_idx(kcontrol);
2269
2270 if (idx < 0)
2271 return idx;
2272
2273 switch (ucontrol->value.integer.value[0]) {
2274 case 2:
2275 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
2276 break;
2277 case 1:
2278 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE;
2279 break;
2280 case 0:
2281 default:
2282 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE;
2283 break;
2284 }
2285 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
2286 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
2287 ucontrol->value.integer.value[0]);
2288
2289 return 0;
2290}
2291
2292static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol,
2293 struct snd_ctl_elem_value *ucontrol)
2294{
2295 int idx = ext_disp_get_port_idx(kcontrol);
2296
2297 if (idx < 0)
2298 return idx;
2299
2300 ucontrol->value.integer.value[0] =
2301 ext_disp_rx_cfg[idx].channels - 2;
2302
2303 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
2304 idx, ext_disp_rx_cfg[idx].channels);
2305
2306 return 0;
2307}
2308
2309static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol,
2310 struct snd_ctl_elem_value *ucontrol)
2311{
2312 int idx = ext_disp_get_port_idx(kcontrol);
2313
2314 if (idx < 0)
2315 return idx;
2316
2317 ext_disp_rx_cfg[idx].channels =
2318 ucontrol->value.integer.value[0] + 2;
2319
2320 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
2321 idx, ext_disp_rx_cfg[idx].channels);
2322 return 1;
2323}
2324
2325static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2326 struct snd_ctl_elem_value *ucontrol)
2327{
2328 int sample_rate_val;
2329 int idx = ext_disp_get_port_idx(kcontrol);
2330
2331 if (idx < 0)
2332 return idx;
2333
2334 switch (ext_disp_rx_cfg[idx].sample_rate) {
2335 case SAMPLING_RATE_176P4KHZ:
2336 sample_rate_val = 6;
2337 break;
2338
2339 case SAMPLING_RATE_88P2KHZ:
2340 sample_rate_val = 5;
2341 break;
2342
2343 case SAMPLING_RATE_44P1KHZ:
2344 sample_rate_val = 4;
2345 break;
2346
2347 case SAMPLING_RATE_32KHZ:
2348 sample_rate_val = 3;
2349 break;
2350
2351 case SAMPLING_RATE_192KHZ:
2352 sample_rate_val = 2;
2353 break;
2354
2355 case SAMPLING_RATE_96KHZ:
2356 sample_rate_val = 1;
2357 break;
2358
2359 case SAMPLING_RATE_48KHZ:
2360 default:
2361 sample_rate_val = 0;
2362 break;
2363 }
2364
2365 ucontrol->value.integer.value[0] = sample_rate_val;
2366 pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__,
2367 idx, ext_disp_rx_cfg[idx].sample_rate);
2368
2369 return 0;
2370}
2371
2372static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2373 struct snd_ctl_elem_value *ucontrol)
2374{
2375 int idx = ext_disp_get_port_idx(kcontrol);
2376
2377 if (idx < 0)
2378 return idx;
2379
2380 switch (ucontrol->value.integer.value[0]) {
2381 case 6:
2382 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ;
2383 break;
2384 case 5:
2385 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ;
2386 break;
2387 case 4:
2388 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ;
2389 break;
2390 case 3:
2391 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ;
2392 break;
2393 case 2:
2394 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ;
2395 break;
2396 case 1:
2397 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ;
2398 break;
2399 case 0:
2400 default:
2401 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ;
2402 break;
2403 }
2404
2405 pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n",
2406 __func__, ucontrol->value.integer.value[0], idx,
2407 ext_disp_rx_cfg[idx].sample_rate);
2408 return 0;
2409}
2410
2411static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol,
2412 struct snd_ctl_elem_value *ucontrol)
2413{
2414 pr_debug("%s: proxy_rx channels = %d\n",
2415 __func__, proxy_rx_cfg.channels);
2416 ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2;
2417
2418 return 0;
2419}
2420
2421static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol,
2422 struct snd_ctl_elem_value *ucontrol)
2423{
2424 proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2;
2425 pr_debug("%s: proxy_rx channels = %d\n",
2426 __func__, proxy_rx_cfg.channels);
2427
2428 return 1;
2429}
2430
2431static int tdm_get_sample_rate(int value)
2432{
2433 int sample_rate = 0;
2434
2435 switch (value) {
2436 case 0:
2437 sample_rate = SAMPLING_RATE_8KHZ;
2438 break;
2439 case 1:
2440 sample_rate = SAMPLING_RATE_16KHZ;
2441 break;
2442 case 2:
2443 sample_rate = SAMPLING_RATE_32KHZ;
2444 break;
2445 case 3:
2446 sample_rate = SAMPLING_RATE_48KHZ;
2447 break;
2448 case 4:
2449 sample_rate = SAMPLING_RATE_176P4KHZ;
2450 break;
2451 case 5:
2452 sample_rate = SAMPLING_RATE_352P8KHZ;
2453 break;
2454 default:
2455 sample_rate = SAMPLING_RATE_48KHZ;
2456 break;
2457 }
2458 return sample_rate;
2459}
2460
2461static int aux_pcm_get_sample_rate(int value)
2462{
2463 int sample_rate;
2464
2465 switch (value) {
2466 case 1:
2467 sample_rate = SAMPLING_RATE_16KHZ;
2468 break;
2469 case 0:
2470 default:
2471 sample_rate = SAMPLING_RATE_8KHZ;
2472 break;
2473 }
2474 return sample_rate;
2475}
2476
2477static int tdm_get_sample_rate_val(int sample_rate)
2478{
2479 int sample_rate_val = 0;
2480
2481 switch (sample_rate) {
2482 case SAMPLING_RATE_8KHZ:
2483 sample_rate_val = 0;
2484 break;
2485 case SAMPLING_RATE_16KHZ:
2486 sample_rate_val = 1;
2487 break;
2488 case SAMPLING_RATE_32KHZ:
2489 sample_rate_val = 2;
2490 break;
2491 case SAMPLING_RATE_48KHZ:
2492 sample_rate_val = 3;
2493 break;
2494 case SAMPLING_RATE_176P4KHZ:
2495 sample_rate_val = 4;
2496 break;
2497 case SAMPLING_RATE_352P8KHZ:
2498 sample_rate_val = 5;
2499 break;
2500 default:
2501 sample_rate_val = 3;
2502 break;
2503 }
2504 return sample_rate_val;
2505}
2506
2507static int aux_pcm_get_sample_rate_val(int sample_rate)
2508{
2509 int sample_rate_val;
2510
2511 switch (sample_rate) {
2512 case SAMPLING_RATE_16KHZ:
2513 sample_rate_val = 1;
2514 break;
2515 case SAMPLING_RATE_8KHZ:
2516 default:
2517 sample_rate_val = 0;
2518 break;
2519 }
2520 return sample_rate_val;
2521}
2522
2523static int tdm_get_port_idx(struct snd_kcontrol *kcontrol,
2524 struct tdm_port *port)
2525{
2526 if (port) {
2527 if (strnstr(kcontrol->id.name, "PRI",
2528 sizeof(kcontrol->id.name))) {
2529 port->mode = TDM_PRI;
2530 } else if (strnstr(kcontrol->id.name, "SEC",
2531 sizeof(kcontrol->id.name))) {
2532 port->mode = TDM_SEC;
2533 } else if (strnstr(kcontrol->id.name, "TERT",
2534 sizeof(kcontrol->id.name))) {
2535 port->mode = TDM_TERT;
2536 } else if (strnstr(kcontrol->id.name, "QUAT",
2537 sizeof(kcontrol->id.name))) {
2538 port->mode = TDM_QUAT;
2539 } else if (strnstr(kcontrol->id.name, "QUIN",
2540 sizeof(kcontrol->id.name))) {
2541 port->mode = TDM_QUIN;
2542 } else {
2543 pr_err("%s: unsupported mode in: %s\n",
2544 __func__, kcontrol->id.name);
2545 return -EINVAL;
2546 }
2547
2548 if (strnstr(kcontrol->id.name, "RX_0",
2549 sizeof(kcontrol->id.name)) ||
2550 strnstr(kcontrol->id.name, "TX_0",
2551 sizeof(kcontrol->id.name))) {
2552 port->channel = TDM_0;
2553 } else if (strnstr(kcontrol->id.name, "RX_1",
2554 sizeof(kcontrol->id.name)) ||
2555 strnstr(kcontrol->id.name, "TX_1",
2556 sizeof(kcontrol->id.name))) {
2557 port->channel = TDM_1;
2558 } else if (strnstr(kcontrol->id.name, "RX_2",
2559 sizeof(kcontrol->id.name)) ||
2560 strnstr(kcontrol->id.name, "TX_2",
2561 sizeof(kcontrol->id.name))) {
2562 port->channel = TDM_2;
2563 } else if (strnstr(kcontrol->id.name, "RX_3",
2564 sizeof(kcontrol->id.name)) ||
2565 strnstr(kcontrol->id.name, "TX_3",
2566 sizeof(kcontrol->id.name))) {
2567 port->channel = TDM_3;
2568 } else if (strnstr(kcontrol->id.name, "RX_4",
2569 sizeof(kcontrol->id.name)) ||
2570 strnstr(kcontrol->id.name, "TX_4",
2571 sizeof(kcontrol->id.name))) {
2572 port->channel = TDM_4;
2573 } else if (strnstr(kcontrol->id.name, "RX_5",
2574 sizeof(kcontrol->id.name)) ||
2575 strnstr(kcontrol->id.name, "TX_5",
2576 sizeof(kcontrol->id.name))) {
2577 port->channel = TDM_5;
2578 } else if (strnstr(kcontrol->id.name, "RX_6",
2579 sizeof(kcontrol->id.name)) ||
2580 strnstr(kcontrol->id.name, "TX_6",
2581 sizeof(kcontrol->id.name))) {
2582 port->channel = TDM_6;
2583 } else if (strnstr(kcontrol->id.name, "RX_7",
2584 sizeof(kcontrol->id.name)) ||
2585 strnstr(kcontrol->id.name, "TX_7",
2586 sizeof(kcontrol->id.name))) {
2587 port->channel = TDM_7;
2588 } else {
2589 pr_err("%s: unsupported channel in: %s\n",
2590 __func__, kcontrol->id.name);
2591 return -EINVAL;
2592 }
2593 } else {
2594 return -EINVAL;
2595 }
2596 return 0;
2597}
2598
2599static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2600 struct snd_ctl_elem_value *ucontrol)
2601{
2602 struct tdm_port port;
2603 int ret = tdm_get_port_idx(kcontrol, &port);
2604
2605 if (ret) {
2606 pr_err("%s: unsupported control: %s\n",
2607 __func__, kcontrol->id.name);
2608 } else {
2609 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
2610 tdm_rx_cfg[port.mode][port.channel].sample_rate);
2611
2612 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
2613 tdm_rx_cfg[port.mode][port.channel].sample_rate,
2614 ucontrol->value.enumerated.item[0]);
2615 }
2616 return ret;
2617}
2618
2619static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2620 struct snd_ctl_elem_value *ucontrol)
2621{
2622 struct tdm_port port;
2623 int ret = tdm_get_port_idx(kcontrol, &port);
2624
2625 if (ret) {
2626 pr_err("%s: unsupported control: %s\n",
2627 __func__, kcontrol->id.name);
2628 } else {
2629 tdm_rx_cfg[port.mode][port.channel].sample_rate =
2630 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2631
2632 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
2633 tdm_rx_cfg[port.mode][port.channel].sample_rate,
2634 ucontrol->value.enumerated.item[0]);
2635 }
2636 return ret;
2637}
2638
2639static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2640 struct snd_ctl_elem_value *ucontrol)
2641{
2642 struct tdm_port port;
2643 int ret = tdm_get_port_idx(kcontrol, &port);
2644
2645 if (ret) {
2646 pr_err("%s: unsupported control: %s\n",
2647 __func__, kcontrol->id.name);
2648 } else {
2649 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
2650 tdm_tx_cfg[port.mode][port.channel].sample_rate);
2651
2652 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
2653 tdm_tx_cfg[port.mode][port.channel].sample_rate,
2654 ucontrol->value.enumerated.item[0]);
2655 }
2656 return ret;
2657}
2658
2659static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2660 struct snd_ctl_elem_value *ucontrol)
2661{
2662 struct tdm_port port;
2663 int ret = tdm_get_port_idx(kcontrol, &port);
2664
2665 if (ret) {
2666 pr_err("%s: unsupported control: %s\n",
2667 __func__, kcontrol->id.name);
2668 } else {
2669 tdm_tx_cfg[port.mode][port.channel].sample_rate =
2670 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2671
2672 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
2673 tdm_tx_cfg[port.mode][port.channel].sample_rate,
2674 ucontrol->value.enumerated.item[0]);
2675 }
2676 return ret;
2677}
2678
2679static int tdm_get_format(int value)
2680{
2681 int format = 0;
2682
2683 switch (value) {
2684 case 0:
2685 format = SNDRV_PCM_FORMAT_S16_LE;
2686 break;
2687 case 1:
2688 format = SNDRV_PCM_FORMAT_S24_LE;
2689 break;
2690 case 2:
2691 format = SNDRV_PCM_FORMAT_S32_LE;
2692 break;
2693 default:
2694 format = SNDRV_PCM_FORMAT_S16_LE;
2695 break;
2696 }
2697 return format;
2698}
2699
2700static int tdm_get_format_val(int format)
2701{
2702 int value = 0;
2703
2704 switch (format) {
2705 case SNDRV_PCM_FORMAT_S16_LE:
2706 value = 0;
2707 break;
2708 case SNDRV_PCM_FORMAT_S24_LE:
2709 value = 1;
2710 break;
2711 case SNDRV_PCM_FORMAT_S32_LE:
2712 value = 2;
2713 break;
2714 default:
2715 value = 0;
2716 break;
2717 }
2718 return value;
2719}
2720
2721static int tdm_rx_format_get(struct snd_kcontrol *kcontrol,
2722 struct snd_ctl_elem_value *ucontrol)
2723{
2724 struct tdm_port port;
2725 int ret = tdm_get_port_idx(kcontrol, &port);
2726
2727 if (ret) {
2728 pr_err("%s: unsupported control: %s\n",
2729 __func__, kcontrol->id.name);
2730 } else {
2731 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
2732 tdm_rx_cfg[port.mode][port.channel].bit_format);
2733
2734 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
2735 tdm_rx_cfg[port.mode][port.channel].bit_format,
2736 ucontrol->value.enumerated.item[0]);
2737 }
2738 return ret;
2739}
2740
2741static int tdm_rx_format_put(struct snd_kcontrol *kcontrol,
2742 struct snd_ctl_elem_value *ucontrol)
2743{
2744 struct tdm_port port;
2745 int ret = tdm_get_port_idx(kcontrol, &port);
2746
2747 if (ret) {
2748 pr_err("%s: unsupported control: %s\n",
2749 __func__, kcontrol->id.name);
2750 } else {
2751 tdm_rx_cfg[port.mode][port.channel].bit_format =
2752 tdm_get_format(ucontrol->value.enumerated.item[0]);
2753
2754 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
2755 tdm_rx_cfg[port.mode][port.channel].bit_format,
2756 ucontrol->value.enumerated.item[0]);
2757 }
2758 return ret;
2759}
2760
2761static int tdm_tx_format_get(struct snd_kcontrol *kcontrol,
2762 struct snd_ctl_elem_value *ucontrol)
2763{
2764 struct tdm_port port;
2765 int ret = tdm_get_port_idx(kcontrol, &port);
2766
2767 if (ret) {
2768 pr_err("%s: unsupported control: %s\n",
2769 __func__, kcontrol->id.name);
2770 } else {
2771 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
2772 tdm_tx_cfg[port.mode][port.channel].bit_format);
2773
2774 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
2775 tdm_tx_cfg[port.mode][port.channel].bit_format,
2776 ucontrol->value.enumerated.item[0]);
2777 }
2778 return ret;
2779}
2780
2781static int tdm_tx_format_put(struct snd_kcontrol *kcontrol,
2782 struct snd_ctl_elem_value *ucontrol)
2783{
2784 struct tdm_port port;
2785 int ret = tdm_get_port_idx(kcontrol, &port);
2786
2787 if (ret) {
2788 pr_err("%s: unsupported control: %s\n",
2789 __func__, kcontrol->id.name);
2790 } else {
2791 tdm_tx_cfg[port.mode][port.channel].bit_format =
2792 tdm_get_format(ucontrol->value.enumerated.item[0]);
2793
2794 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
2795 tdm_tx_cfg[port.mode][port.channel].bit_format,
2796 ucontrol->value.enumerated.item[0]);
2797 }
2798 return ret;
2799}
2800
2801static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol,
2802 struct snd_ctl_elem_value *ucontrol)
2803{
2804 struct tdm_port port;
2805 int ret = tdm_get_port_idx(kcontrol, &port);
2806
2807 if (ret) {
2808 pr_err("%s: unsupported control: %s\n",
2809 __func__, kcontrol->id.name);
2810 } else {
2811
2812 ucontrol->value.enumerated.item[0] =
2813 tdm_rx_cfg[port.mode][port.channel].channels - 1;
2814
2815 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
2816 tdm_rx_cfg[port.mode][port.channel].channels - 1,
2817 ucontrol->value.enumerated.item[0]);
2818 }
2819 return ret;
2820}
2821
2822static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol,
2823 struct snd_ctl_elem_value *ucontrol)
2824{
2825 struct tdm_port port;
2826 int ret = tdm_get_port_idx(kcontrol, &port);
2827
2828 if (ret) {
2829 pr_err("%s: unsupported control: %s\n",
2830 __func__, kcontrol->id.name);
2831 } else {
2832 tdm_rx_cfg[port.mode][port.channel].channels =
2833 ucontrol->value.enumerated.item[0] + 1;
2834
2835 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
2836 tdm_rx_cfg[port.mode][port.channel].channels,
2837 ucontrol->value.enumerated.item[0] + 1);
2838 }
2839 return ret;
2840}
2841
2842static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol,
2843 struct snd_ctl_elem_value *ucontrol)
2844{
2845 struct tdm_port port;
2846 int ret = tdm_get_port_idx(kcontrol, &port);
2847
2848 if (ret) {
2849 pr_err("%s: unsupported control: %s\n",
2850 __func__, kcontrol->id.name);
2851 } else {
2852 ucontrol->value.enumerated.item[0] =
2853 tdm_tx_cfg[port.mode][port.channel].channels - 1;
2854
2855 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
2856 tdm_tx_cfg[port.mode][port.channel].channels - 1,
2857 ucontrol->value.enumerated.item[0]);
2858 }
2859 return ret;
2860}
2861
2862static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol,
2863 struct snd_ctl_elem_value *ucontrol)
2864{
2865 struct tdm_port port;
2866 int ret = tdm_get_port_idx(kcontrol, &port);
2867
2868 if (ret) {
2869 pr_err("%s: unsupported control: %s\n",
2870 __func__, kcontrol->id.name);
2871 } else {
2872 tdm_tx_cfg[port.mode][port.channel].channels =
2873 ucontrol->value.enumerated.item[0] + 1;
2874
2875 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
2876 tdm_tx_cfg[port.mode][port.channel].channels,
2877 ucontrol->value.enumerated.item[0] + 1);
2878 }
2879 return ret;
2880}
2881
2882static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol)
2883{
2884 int idx;
2885
2886 if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM",
2887 sizeof("PRIM_AUX_PCM"))) {
2888 idx = PRIM_AUX_PCM;
2889 } else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM",
2890 sizeof("SEC_AUX_PCM"))) {
2891 idx = SEC_AUX_PCM;
2892 } else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM",
2893 sizeof("TERT_AUX_PCM"))) {
2894 idx = TERT_AUX_PCM;
2895 } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM",
2896 sizeof("QUAT_AUX_PCM"))) {
2897 idx = QUAT_AUX_PCM;
2898 } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM",
2899 sizeof("QUIN_AUX_PCM"))) {
2900 idx = QUIN_AUX_PCM;
2901 } else {
2902 pr_err("%s: unsupported port: %s\n",
2903 __func__, kcontrol->id.name);
2904 idx = -EINVAL;
2905 }
2906
2907 return idx;
2908}
2909
2910static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2911 struct snd_ctl_elem_value *ucontrol)
2912{
2913 int idx = aux_pcm_get_port_idx(kcontrol);
2914
2915 if (idx < 0)
2916 return idx;
2917
2918 aux_pcm_rx_cfg[idx].sample_rate =
2919 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2920
2921 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2922 idx, aux_pcm_rx_cfg[idx].sample_rate,
2923 ucontrol->value.enumerated.item[0]);
2924
2925 return 0;
2926}
2927
2928static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2929 struct snd_ctl_elem_value *ucontrol)
2930{
2931 int idx = aux_pcm_get_port_idx(kcontrol);
2932
2933 if (idx < 0)
2934 return idx;
2935
2936 ucontrol->value.enumerated.item[0] =
2937 aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate);
2938
2939 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2940 idx, aux_pcm_rx_cfg[idx].sample_rate,
2941 ucontrol->value.enumerated.item[0]);
2942
2943 return 0;
2944}
2945
2946static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2947 struct snd_ctl_elem_value *ucontrol)
2948{
2949 int idx = aux_pcm_get_port_idx(kcontrol);
2950
2951 if (idx < 0)
2952 return idx;
2953
2954 aux_pcm_tx_cfg[idx].sample_rate =
2955 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
2956
2957 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2958 idx, aux_pcm_tx_cfg[idx].sample_rate,
2959 ucontrol->value.enumerated.item[0]);
2960
2961 return 0;
2962}
2963
2964static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2965 struct snd_ctl_elem_value *ucontrol)
2966{
2967 int idx = aux_pcm_get_port_idx(kcontrol);
2968
2969 if (idx < 0)
2970 return idx;
2971
2972 ucontrol->value.enumerated.item[0] =
2973 aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate);
2974
2975 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2976 idx, aux_pcm_tx_cfg[idx].sample_rate,
2977 ucontrol->value.enumerated.item[0]);
2978
2979 return 0;
2980}
2981
2982static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol)
2983{
2984 int idx;
2985
2986 if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX",
2987 sizeof("PRIM_MI2S_RX"))) {
2988 idx = PRIM_MI2S;
2989 } else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX",
2990 sizeof("SEC_MI2S_RX"))) {
2991 idx = SEC_MI2S;
2992 } else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX",
2993 sizeof("TERT_MI2S_RX"))) {
2994 idx = TERT_MI2S;
2995 } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX",
2996 sizeof("QUAT_MI2S_RX"))) {
2997 idx = QUAT_MI2S;
2998 } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX",
2999 sizeof("QUIN_MI2S_RX"))) {
3000 idx = QUIN_MI2S;
3001 } else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX",
3002 sizeof("PRIM_MI2S_TX"))) {
3003 idx = PRIM_MI2S;
3004 } else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX",
3005 sizeof("SEC_MI2S_TX"))) {
3006 idx = SEC_MI2S;
3007 } else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX",
3008 sizeof("TERT_MI2S_TX"))) {
3009 idx = TERT_MI2S;
3010 } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX",
3011 sizeof("QUAT_MI2S_TX"))) {
3012 idx = QUAT_MI2S;
3013 } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX",
3014 sizeof("QUIN_MI2S_TX"))) {
3015 idx = QUIN_MI2S;
3016 } else {
3017 pr_err("%s: unsupported channel: %s\n",
3018 __func__, kcontrol->id.name);
3019 idx = -EINVAL;
3020 }
3021
3022 return idx;
3023}
3024
3025static int mi2s_get_sample_rate_val(int sample_rate)
3026{
3027 int sample_rate_val;
3028
3029 switch (sample_rate) {
3030 case SAMPLING_RATE_8KHZ:
3031 sample_rate_val = 0;
3032 break;
3033 case SAMPLING_RATE_11P025KHZ:
3034 sample_rate_val = 1;
3035 break;
3036 case SAMPLING_RATE_16KHZ:
3037 sample_rate_val = 2;
3038 break;
3039 case SAMPLING_RATE_22P05KHZ:
3040 sample_rate_val = 3;
3041 break;
3042 case SAMPLING_RATE_32KHZ:
3043 sample_rate_val = 4;
3044 break;
3045 case SAMPLING_RATE_44P1KHZ:
3046 sample_rate_val = 5;
3047 break;
3048 case SAMPLING_RATE_48KHZ:
3049 sample_rate_val = 6;
3050 break;
3051 case SAMPLING_RATE_96KHZ:
3052 sample_rate_val = 7;
3053 break;
3054 case SAMPLING_RATE_192KHZ:
3055 sample_rate_val = 8;
3056 break;
3057 default:
3058 sample_rate_val = 6;
3059 break;
3060 }
3061 return sample_rate_val;
3062}
3063
3064static int mi2s_get_sample_rate(int value)
3065{
3066 int sample_rate;
3067
3068 switch (value) {
3069 case 0:
3070 sample_rate = SAMPLING_RATE_8KHZ;
3071 break;
3072 case 1:
3073 sample_rate = SAMPLING_RATE_11P025KHZ;
3074 break;
3075 case 2:
3076 sample_rate = SAMPLING_RATE_16KHZ;
3077 break;
3078 case 3:
3079 sample_rate = SAMPLING_RATE_22P05KHZ;
3080 break;
3081 case 4:
3082 sample_rate = SAMPLING_RATE_32KHZ;
3083 break;
3084 case 5:
3085 sample_rate = SAMPLING_RATE_44P1KHZ;
3086 break;
3087 case 6:
3088 sample_rate = SAMPLING_RATE_48KHZ;
3089 break;
3090 case 7:
3091 sample_rate = SAMPLING_RATE_96KHZ;
3092 break;
3093 case 8:
3094 sample_rate = SAMPLING_RATE_192KHZ;
3095 break;
3096 default:
3097 sample_rate = SAMPLING_RATE_48KHZ;
3098 break;
3099 }
3100 return sample_rate;
3101}
3102
3103static int mi2s_auxpcm_get_format(int value)
3104{
3105 int format;
3106
3107 switch (value) {
3108 case 0:
3109 format = SNDRV_PCM_FORMAT_S16_LE;
3110 break;
3111 case 1:
3112 format = SNDRV_PCM_FORMAT_S24_LE;
3113 break;
3114 case 2:
3115 format = SNDRV_PCM_FORMAT_S24_3LE;
3116 break;
3117 case 3:
3118 format = SNDRV_PCM_FORMAT_S32_LE;
3119 break;
3120 default:
3121 format = SNDRV_PCM_FORMAT_S16_LE;
3122 break;
3123 }
3124 return format;
3125}
3126
3127static int mi2s_auxpcm_get_format_value(int format)
3128{
3129 int value;
3130
3131 switch (format) {
3132 case SNDRV_PCM_FORMAT_S16_LE:
3133 value = 0;
3134 break;
3135 case SNDRV_PCM_FORMAT_S24_LE:
3136 value = 1;
3137 break;
3138 case SNDRV_PCM_FORMAT_S24_3LE:
3139 value = 2;
3140 break;
3141 case SNDRV_PCM_FORMAT_S32_LE:
3142 value = 3;
3143 break;
3144 default:
3145 value = 0;
3146 break;
3147 }
3148 return value;
3149}
3150
3151static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
3152 struct snd_ctl_elem_value *ucontrol)
3153{
3154 int idx = mi2s_get_port_idx(kcontrol);
3155
3156 if (idx < 0)
3157 return idx;
3158
3159 mi2s_rx_cfg[idx].sample_rate =
3160 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
3161
3162 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
3163 idx, mi2s_rx_cfg[idx].sample_rate,
3164 ucontrol->value.enumerated.item[0]);
3165
3166 return 0;
3167}
3168
3169static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
3170 struct snd_ctl_elem_value *ucontrol)
3171{
3172 int idx = mi2s_get_port_idx(kcontrol);
3173
3174 if (idx < 0)
3175 return idx;
3176
3177 ucontrol->value.enumerated.item[0] =
3178 mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate);
3179
3180 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
3181 idx, mi2s_rx_cfg[idx].sample_rate,
3182 ucontrol->value.enumerated.item[0]);
3183
3184 return 0;
3185}
3186
3187static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
3188 struct snd_ctl_elem_value *ucontrol)
3189{
3190 int idx = mi2s_get_port_idx(kcontrol);
3191
3192 if (idx < 0)
3193 return idx;
3194
3195 mi2s_tx_cfg[idx].sample_rate =
3196 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
3197
3198 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
3199 idx, mi2s_tx_cfg[idx].sample_rate,
3200 ucontrol->value.enumerated.item[0]);
3201
3202 return 0;
3203}
3204
3205static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
3206 struct snd_ctl_elem_value *ucontrol)
3207{
3208 int idx = mi2s_get_port_idx(kcontrol);
3209
3210 if (idx < 0)
3211 return idx;
3212
3213 ucontrol->value.enumerated.item[0] =
3214 mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate);
3215
3216 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
3217 idx, mi2s_tx_cfg[idx].sample_rate,
3218 ucontrol->value.enumerated.item[0]);
3219
3220 return 0;
3221}
3222
3223static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol,
3224 struct snd_ctl_elem_value *ucontrol)
3225{
3226 int idx = mi2s_get_port_idx(kcontrol);
3227
3228 if (idx < 0)
3229 return idx;
3230
3231 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
3232 idx, mi2s_rx_cfg[idx].channels);
3233 ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1;
3234
3235 return 0;
3236}
3237
3238static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol,
3239 struct snd_ctl_elem_value *ucontrol)
3240{
3241 int idx = mi2s_get_port_idx(kcontrol);
3242
3243 if (idx < 0)
3244 return idx;
3245
3246 mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
3247 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
3248 idx, mi2s_rx_cfg[idx].channels);
3249
3250 return 1;
3251}
3252
3253static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol,
3254 struct snd_ctl_elem_value *ucontrol)
3255{
3256 int idx = mi2s_get_port_idx(kcontrol);
3257
3258 if (idx < 0)
3259 return idx;
3260
3261 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
3262 idx, mi2s_tx_cfg[idx].channels);
3263 ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1;
3264
3265 return 0;
3266}
3267
3268static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol,
3269 struct snd_ctl_elem_value *ucontrol)
3270{
3271 int idx = mi2s_get_port_idx(kcontrol);
3272
3273 if (idx < 0)
3274 return idx;
3275
3276 mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
3277 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
3278 idx, mi2s_tx_cfg[idx].channels);
3279
3280 return 1;
3281}
3282
3283static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol,
3284 struct snd_ctl_elem_value *ucontrol)
3285{
3286 int idx = mi2s_get_port_idx(kcontrol);
3287
3288 if (idx < 0)
3289 return idx;
3290
3291 ucontrol->value.enumerated.item[0] =
3292 mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format);
3293
3294 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
3295 idx, mi2s_rx_cfg[idx].bit_format,
3296 ucontrol->value.enumerated.item[0]);
3297
3298 return 0;
3299}
3300
3301static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol,
3302 struct snd_ctl_elem_value *ucontrol)
3303{
3304 int idx = mi2s_get_port_idx(kcontrol);
3305
3306 if (idx < 0)
3307 return idx;
3308
3309 mi2s_rx_cfg[idx].bit_format =
3310 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
3311
3312 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
3313 idx, mi2s_rx_cfg[idx].bit_format,
3314 ucontrol->value.enumerated.item[0]);
3315
3316 return 0;
3317}
3318
3319static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol,
3320 struct snd_ctl_elem_value *ucontrol)
3321{
3322 int idx = mi2s_get_port_idx(kcontrol);
3323
3324 if (idx < 0)
3325 return idx;
3326
3327 ucontrol->value.enumerated.item[0] =
3328 mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format);
3329
3330 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
3331 idx, mi2s_tx_cfg[idx].bit_format,
3332 ucontrol->value.enumerated.item[0]);
3333
3334 return 0;
3335}
3336
3337static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol,
3338 struct snd_ctl_elem_value *ucontrol)
3339{
3340 int idx = mi2s_get_port_idx(kcontrol);
3341
3342 if (idx < 0)
3343 return idx;
3344
3345 mi2s_tx_cfg[idx].bit_format =
3346 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
3347
3348 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
3349 idx, mi2s_tx_cfg[idx].bit_format,
3350 ucontrol->value.enumerated.item[0]);
3351
3352 return 0;
3353}
3354
3355static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol,
3356 struct snd_ctl_elem_value *ucontrol)
3357{
3358 int idx = aux_pcm_get_port_idx(kcontrol);
3359
3360 if (idx < 0)
3361 return idx;
3362
3363 ucontrol->value.enumerated.item[0] =
3364 mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format);
3365
3366 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
3367 idx, aux_pcm_rx_cfg[idx].bit_format,
3368 ucontrol->value.enumerated.item[0]);
3369
3370 return 0;
3371}
3372
3373static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol,
3374 struct snd_ctl_elem_value *ucontrol)
3375{
3376 int idx = aux_pcm_get_port_idx(kcontrol);
3377
3378 if (idx < 0)
3379 return idx;
3380
3381 aux_pcm_rx_cfg[idx].bit_format =
3382 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
3383
3384 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
3385 idx, aux_pcm_rx_cfg[idx].bit_format,
3386 ucontrol->value.enumerated.item[0]);
3387
3388 return 0;
3389}
3390
3391static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol,
3392 struct snd_ctl_elem_value *ucontrol)
3393{
3394 int idx = aux_pcm_get_port_idx(kcontrol);
3395
3396 if (idx < 0)
3397 return idx;
3398
3399 ucontrol->value.enumerated.item[0] =
3400 mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format);
3401
3402 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
3403 idx, aux_pcm_tx_cfg[idx].bit_format,
3404 ucontrol->value.enumerated.item[0]);
3405
3406 return 0;
3407}
3408
3409static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol,
3410 struct snd_ctl_elem_value *ucontrol)
3411{
3412 int idx = aux_pcm_get_port_idx(kcontrol);
3413
3414 if (idx < 0)
3415 return idx;
3416
3417 aux_pcm_tx_cfg[idx].bit_format =
3418 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
3419
3420 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
3421 idx, aux_pcm_tx_cfg[idx].bit_format,
3422 ucontrol->value.enumerated.item[0]);
3423
3424 return 0;
3425}
3426
Meng Wang56a0f8f2018-09-06 18:17:30 +08003427static int msm_hifi_ctrl(struct snd_soc_component *component)
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303428{
Meng Wang56a0f8f2018-09-06 18:17:30 +08003429 struct snd_soc_dapm_context *dapm =
3430 snd_soc_component_get_dapm(component);
3431 struct snd_soc_card *card = component->card;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303432 struct msm_asoc_mach_data *pdata =
3433 snd_soc_card_get_drvdata(card);
3434
Meng Wang56a0f8f2018-09-06 18:17:30 +08003435 dev_dbg(component->dev, "%s: msm_hifi_control = %d\n", __func__,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303436 msm_hifi_control);
3437
3438 if (!pdata || !pdata->hph_en1_gpio_p) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08003439 dev_err(component->dev, "%s: hph_en1_gpio is invalid\n",
3440 __func__);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303441 return -EINVAL;
3442 }
3443 if (msm_hifi_control == MSM_HIFI_ON) {
3444 msm_cdc_pinctrl_select_active_state(pdata->hph_en1_gpio_p);
3445 /* 5msec delay needed as per HW requirement */
3446 usleep_range(5000, 5010);
3447 } else {
3448 msm_cdc_pinctrl_select_sleep_state(pdata->hph_en1_gpio_p);
3449 }
3450 snd_soc_dapm_sync(dapm);
3451
3452 return 0;
3453}
3454
3455static int msm_hifi_get(struct snd_kcontrol *kcontrol,
3456 struct snd_ctl_elem_value *ucontrol)
3457{
3458 pr_debug("%s: msm_hifi_control = %d\n",
3459 __func__, msm_hifi_control);
3460 ucontrol->value.integer.value[0] = msm_hifi_control;
3461
3462 return 0;
3463}
3464
3465static int msm_hifi_put(struct snd_kcontrol *kcontrol,
3466 struct snd_ctl_elem_value *ucontrol)
3467{
Meng Wang56a0f8f2018-09-06 18:17:30 +08003468 struct snd_soc_component *component =
3469 snd_soc_kcontrol_component(kcontrol);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303470
Meng Wang56a0f8f2018-09-06 18:17:30 +08003471 dev_dbg(component->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303472 __func__, ucontrol->value.integer.value[0]);
3473
3474 msm_hifi_control = ucontrol->value.integer.value[0];
Meng Wang56a0f8f2018-09-06 18:17:30 +08003475 msm_hifi_ctrl(component);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303476
3477 return 0;
3478}
3479
3480static const struct snd_kcontrol_new msm_int_snd_controls[] = {
3481 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs,
3482 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3483 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs,
3484 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3485 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Channels", rx_cdc_dma_rx_0_chs,
3486 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3487 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Channels", rx_cdc_dma_rx_1_chs,
3488 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3489 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Channels", rx_cdc_dma_rx_2_chs,
3490 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3491 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Channels", rx_cdc_dma_rx_3_chs,
3492 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3493 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Channels", rx_cdc_dma_rx_5_chs,
3494 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3495 SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs,
3496 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3497 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs,
3498 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3499 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs,
3500 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3501 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Channels", tx_cdc_dma_tx_0_chs,
3502 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3503 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Channels", tx_cdc_dma_tx_3_chs,
3504 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3505 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Channels", tx_cdc_dma_tx_4_chs,
3506 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3507 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format,
3508 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3509 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format,
3510 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3511 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc_dma_rx_0_format,
3512 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3513 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc_dma_rx_1_format,
3514 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3515 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc_dma_rx_2_format,
3516 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3517 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc_dma_rx_3_format,
3518 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3519 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc_dma_rx_5_format,
3520 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3521 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format,
3522 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3523 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format,
3524 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3525 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Format", tx_cdc_dma_tx_0_format,
3526 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3527 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Format", tx_cdc_dma_tx_3_format,
3528 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3529 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Format", tx_cdc_dma_tx_4_format,
3530 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3531 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate",
3532 wsa_cdc_dma_rx_0_sample_rate,
3533 cdc_dma_rx_sample_rate_get,
3534 cdc_dma_rx_sample_rate_put),
3535 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate",
3536 wsa_cdc_dma_rx_1_sample_rate,
3537 cdc_dma_rx_sample_rate_get,
3538 cdc_dma_rx_sample_rate_put),
3539 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate",
3540 rx_cdc_dma_rx_0_sample_rate,
3541 cdc_dma_rx_sample_rate_get,
3542 cdc_dma_rx_sample_rate_put),
3543 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate",
3544 rx_cdc_dma_rx_1_sample_rate,
3545 cdc_dma_rx_sample_rate_get,
3546 cdc_dma_rx_sample_rate_put),
3547 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate",
3548 rx_cdc_dma_rx_2_sample_rate,
3549 cdc_dma_rx_sample_rate_get,
3550 cdc_dma_rx_sample_rate_put),
3551 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate",
3552 rx_cdc_dma_rx_3_sample_rate,
3553 cdc_dma_rx_sample_rate_get,
3554 cdc_dma_rx_sample_rate_put),
3555 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate",
3556 rx_cdc_dma_rx_5_sample_rate,
3557 cdc_dma_rx_sample_rate_get,
3558 cdc_dma_rx_sample_rate_put),
3559 SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate",
3560 wsa_cdc_dma_tx_0_sample_rate,
3561 cdc_dma_tx_sample_rate_get,
3562 cdc_dma_tx_sample_rate_put),
3563 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate",
3564 wsa_cdc_dma_tx_1_sample_rate,
3565 cdc_dma_tx_sample_rate_get,
3566 cdc_dma_tx_sample_rate_put),
3567 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate",
3568 wsa_cdc_dma_tx_2_sample_rate,
3569 cdc_dma_tx_sample_rate_get,
3570 cdc_dma_tx_sample_rate_put),
3571 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 SampleRate",
3572 tx_cdc_dma_tx_0_sample_rate,
3573 cdc_dma_tx_sample_rate_get,
3574 cdc_dma_tx_sample_rate_put),
3575 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate",
3576 tx_cdc_dma_tx_3_sample_rate,
3577 cdc_dma_tx_sample_rate_get,
3578 cdc_dma_tx_sample_rate_put),
3579 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate",
3580 tx_cdc_dma_tx_4_sample_rate,
3581 cdc_dma_tx_sample_rate_get,
3582 cdc_dma_tx_sample_rate_put),
3583};
3584
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303585static const struct snd_kcontrol_new msm_ext_snd_controls[] = {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303586 SOC_ENUM_EXT("SLIM_0_RX Channels", slim_0_rx_chs,
3587 slim_rx_ch_get, slim_rx_ch_put),
3588 SOC_ENUM_EXT("SLIM_2_RX Channels", slim_2_rx_chs,
3589 slim_rx_ch_get, slim_rx_ch_put),
3590 SOC_ENUM_EXT("SLIM_0_TX Channels", slim_0_tx_chs,
3591 slim_tx_ch_get, slim_tx_ch_put),
3592 SOC_ENUM_EXT("SLIM_1_TX Channels", slim_1_tx_chs,
3593 slim_tx_ch_get, slim_tx_ch_put),
3594 SOC_ENUM_EXT("SLIM_5_RX Channels", slim_5_rx_chs,
3595 slim_rx_ch_get, slim_rx_ch_put),
3596 SOC_ENUM_EXT("SLIM_6_RX Channels", slim_6_rx_chs,
3597 slim_rx_ch_get, slim_rx_ch_put),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303598 SOC_ENUM_EXT("SLIM_0_RX Format", slim_0_rx_format,
3599 slim_rx_bit_format_get, slim_rx_bit_format_put),
3600 SOC_ENUM_EXT("SLIM_5_RX Format", slim_5_rx_format,
3601 slim_rx_bit_format_get, slim_rx_bit_format_put),
3602 SOC_ENUM_EXT("SLIM_6_RX Format", slim_6_rx_format,
3603 slim_rx_bit_format_get, slim_rx_bit_format_put),
3604 SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format,
3605 slim_tx_bit_format_get, slim_tx_bit_format_put),
3606 SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate,
3607 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3608 SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate,
3609 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3610 SOC_ENUM_EXT("SLIM_0_TX SampleRate", slim_0_tx_sample_rate,
3611 slim_tx_sample_rate_get, slim_tx_sample_rate_put),
3612 SOC_ENUM_EXT("SLIM_5_RX SampleRate", slim_5_rx_sample_rate,
3613 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3614 SOC_ENUM_EXT("SLIM_6_RX SampleRate", slim_6_rx_sample_rate,
3615 slim_rx_sample_rate_get, slim_rx_sample_rate_put),
3616};
3617
3618static const struct snd_kcontrol_new msm_common_snd_controls[] = {
3619 SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
3620 usb_audio_rx_ch_get, usb_audio_rx_ch_put),
3621 SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
3622 usb_audio_tx_ch_get, usb_audio_tx_ch_put),
3623 SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
3624 ext_disp_rx_ch_get, ext_disp_rx_ch_put),
3625 SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs,
3626 proxy_rx_ch_get, proxy_rx_ch_put),
3627 SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
3628 usb_audio_rx_format_get, usb_audio_rx_format_put),
3629 SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
3630 usb_audio_tx_format_get, usb_audio_tx_format_put),
3631 SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
3632 ext_disp_rx_format_get, ext_disp_rx_format_put),
3633 SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate,
3634 usb_audio_rx_sample_rate_get,
3635 usb_audio_rx_sample_rate_put),
3636 SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate,
3637 usb_audio_tx_sample_rate_get,
3638 usb_audio_tx_sample_rate_put),
3639 SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate,
3640 ext_disp_rx_sample_rate_get,
3641 ext_disp_rx_sample_rate_put),
3642 SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3643 tdm_rx_sample_rate_get,
3644 tdm_rx_sample_rate_put),
3645 SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3646 tdm_tx_sample_rate_get,
3647 tdm_tx_sample_rate_put),
3648 SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format,
3649 tdm_rx_format_get,
3650 tdm_rx_format_put),
3651 SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format,
3652 tdm_tx_format_get,
3653 tdm_tx_format_put),
3654 SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs,
3655 tdm_rx_ch_get,
3656 tdm_rx_ch_put),
3657 SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs,
3658 tdm_tx_ch_get,
3659 tdm_tx_ch_put),
3660 SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3661 tdm_rx_sample_rate_get,
3662 tdm_rx_sample_rate_put),
3663 SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3664 tdm_tx_sample_rate_get,
3665 tdm_tx_sample_rate_put),
3666 SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format,
3667 tdm_rx_format_get,
3668 tdm_rx_format_put),
3669 SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format,
3670 tdm_tx_format_get,
3671 tdm_tx_format_put),
3672 SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs,
3673 tdm_rx_ch_get,
3674 tdm_rx_ch_put),
3675 SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs,
3676 tdm_tx_ch_get,
3677 tdm_tx_ch_put),
3678 SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3679 tdm_rx_sample_rate_get,
3680 tdm_rx_sample_rate_put),
3681 SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3682 tdm_tx_sample_rate_get,
3683 tdm_tx_sample_rate_put),
3684 SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format,
3685 tdm_rx_format_get,
3686 tdm_rx_format_put),
3687 SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format,
3688 tdm_tx_format_get,
3689 tdm_tx_format_put),
3690 SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs,
3691 tdm_rx_ch_get,
3692 tdm_rx_ch_put),
3693 SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs,
3694 tdm_tx_ch_get,
3695 tdm_tx_ch_put),
3696 SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3697 tdm_rx_sample_rate_get,
3698 tdm_rx_sample_rate_put),
3699 SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3700 tdm_tx_sample_rate_get,
3701 tdm_tx_sample_rate_put),
3702 SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format,
3703 tdm_rx_format_get,
3704 tdm_rx_format_put),
3705 SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format,
3706 tdm_tx_format_get,
3707 tdm_tx_format_put),
3708 SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs,
3709 tdm_rx_ch_get,
3710 tdm_rx_ch_put),
3711 SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs,
3712 tdm_tx_ch_get,
3713 tdm_tx_ch_put),
3714 SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3715 tdm_rx_sample_rate_get,
3716 tdm_rx_sample_rate_put),
3717 SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3718 tdm_tx_sample_rate_get,
3719 tdm_tx_sample_rate_put),
3720 SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format,
3721 tdm_rx_format_get,
3722 tdm_rx_format_put),
3723 SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format,
3724 tdm_tx_format_get,
3725 tdm_tx_format_put),
3726 SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs,
3727 tdm_rx_ch_get,
3728 tdm_rx_ch_put),
3729 SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs,
3730 tdm_tx_ch_get,
3731 tdm_tx_ch_put),
3732 SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
3733 aux_pcm_rx_sample_rate_get,
3734 aux_pcm_rx_sample_rate_put),
3735 SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate,
3736 aux_pcm_rx_sample_rate_get,
3737 aux_pcm_rx_sample_rate_put),
3738 SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
3739 aux_pcm_rx_sample_rate_get,
3740 aux_pcm_rx_sample_rate_put),
3741 SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
3742 aux_pcm_rx_sample_rate_get,
3743 aux_pcm_rx_sample_rate_put),
3744 SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate,
3745 aux_pcm_rx_sample_rate_get,
3746 aux_pcm_rx_sample_rate_put),
3747 SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
3748 aux_pcm_tx_sample_rate_get,
3749 aux_pcm_tx_sample_rate_put),
3750 SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate,
3751 aux_pcm_tx_sample_rate_get,
3752 aux_pcm_tx_sample_rate_put),
3753 SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
3754 aux_pcm_tx_sample_rate_get,
3755 aux_pcm_tx_sample_rate_put),
3756 SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
3757 aux_pcm_tx_sample_rate_get,
3758 aux_pcm_tx_sample_rate_put),
3759 SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate,
3760 aux_pcm_tx_sample_rate_get,
3761 aux_pcm_tx_sample_rate_put),
3762 SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
3763 mi2s_rx_sample_rate_get,
3764 mi2s_rx_sample_rate_put),
3765 SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate,
3766 mi2s_rx_sample_rate_get,
3767 mi2s_rx_sample_rate_put),
3768 SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
3769 mi2s_rx_sample_rate_get,
3770 mi2s_rx_sample_rate_put),
3771 SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
3772 mi2s_rx_sample_rate_get,
3773 mi2s_rx_sample_rate_put),
3774 SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate,
3775 mi2s_rx_sample_rate_get,
3776 mi2s_rx_sample_rate_put),
3777 SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
3778 mi2s_tx_sample_rate_get,
3779 mi2s_tx_sample_rate_put),
3780 SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate,
3781 mi2s_tx_sample_rate_get,
3782 mi2s_tx_sample_rate_put),
3783 SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
3784 mi2s_tx_sample_rate_get,
3785 mi2s_tx_sample_rate_put),
3786 SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
3787 mi2s_tx_sample_rate_get,
3788 mi2s_tx_sample_rate_put),
3789 SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate,
3790 mi2s_tx_sample_rate_get,
3791 mi2s_tx_sample_rate_put),
3792 SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs,
3793 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3794 SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs,
3795 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3796 SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs,
3797 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3798 SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs,
3799 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3800 SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs,
3801 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3802 SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs,
3803 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3804 SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs,
3805 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3806 SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs,
3807 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3808 SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs,
3809 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3810 SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs,
3811 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3812 SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
3813 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3814 SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
3815 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3816 SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
3817 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3818 SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
3819 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3820 SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
3821 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3822 SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
3823 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3824 SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
3825 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3826 SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
3827 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3828 SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format,
3829 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3830 SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format,
3831 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3832 SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
3833 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3834 SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
3835 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3836 SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format,
3837 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3838 SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format,
3839 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3840 SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format,
3841 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3842 SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format,
3843 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3844 SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format,
3845 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3846 SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format,
3847 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3848 SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format,
3849 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3850 SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
3851 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3852 SOC_ENUM_EXT("HiFi Function", hifi_function, msm_hifi_get,
3853 msm_hifi_put),
3854 SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
3855 msm_bt_sample_rate_get,
3856 msm_bt_sample_rate_put),
Sharad Sangle493a1b32018-09-19 15:52:15 +05303857 SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
3858 msm_bt_sample_rate_rx_get,
3859 msm_bt_sample_rate_rx_put),
3860 SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
3861 msm_bt_sample_rate_tx_get,
3862 msm_bt_sample_rate_tx_put),
Vatsal Bucha89262e62018-08-31 11:57:09 +05303863 SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs,
3864 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303865};
3866
Meng Wang56a0f8f2018-09-06 18:17:30 +08003867static int msm_snd_enable_codec_ext_clk(struct snd_soc_component *component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303868 int enable, bool dapm)
3869{
3870 int ret = 0;
3871
Meng Wang56a0f8f2018-09-06 18:17:30 +08003872 if (!strcmp(component->name, "tavil_codec")) {
3873 ret = tavil_cdc_mclk_enable(component, enable);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303874 } else if (!strcmp(dev_name(component->dev), "tasha_codec")) {
3875 ret = tasha_cdc_mclk_enable(component, enable, dapm);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303876 } else {
Meng Wang56a0f8f2018-09-06 18:17:30 +08003877 dev_err(component->dev, "%s: unknown codec to enable ext clk\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303878 __func__);
3879 ret = -EINVAL;
3880 }
3881 return ret;
3882}
3883
Meng Wang56a0f8f2018-09-06 18:17:30 +08003884static int msm_snd_enable_codec_ext_tx_clk(struct snd_soc_component *component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303885 int enable, bool dapm)
3886{
3887 int ret = 0;
3888
Meng Wang56a0f8f2018-09-06 18:17:30 +08003889 if (!strcmp(component->name, "tavil_codec")) {
3890 ret = tavil_cdc_mclk_tx_enable(component, enable);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303891 } else if (!strcmp(dev_name(component->dev), "tasha_codec")) {
3892 ret = tasha_cdc_mclk_tx_enable(component, enable, dapm);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303893 } else {
Meng Wang56a0f8f2018-09-06 18:17:30 +08003894 dev_err(component->dev, "%s: unknown codec to enable TX ext clk\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303895 __func__);
3896 ret = -EINVAL;
3897 }
3898
3899 return ret;
3900}
3901
3902static int msm_mclk_tx_event(struct snd_soc_dapm_widget *w,
3903 struct snd_kcontrol *kcontrol, int event)
3904{
Meng Wang56a0f8f2018-09-06 18:17:30 +08003905 struct snd_soc_component *component =
3906 snd_soc_dapm_to_component(w->dapm);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303907
3908 pr_debug("%s: event = %d\n", __func__, event);
3909
3910 switch (event) {
3911 case SND_SOC_DAPM_PRE_PMU:
Meng Wang56a0f8f2018-09-06 18:17:30 +08003912 return msm_snd_enable_codec_ext_tx_clk(component, 1, true);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303913 case SND_SOC_DAPM_POST_PMD:
Meng Wang56a0f8f2018-09-06 18:17:30 +08003914 return msm_snd_enable_codec_ext_tx_clk(component, 0, true);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303915 }
3916 return 0;
3917}
3918
3919static int msm_mclk_event(struct snd_soc_dapm_widget *w,
3920 struct snd_kcontrol *kcontrol, int event)
3921{
Meng Wang56a0f8f2018-09-06 18:17:30 +08003922 struct snd_soc_component *component =
3923 snd_soc_dapm_to_component(w->dapm);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303924
3925 pr_debug("%s: event = %d\n", __func__, event);
3926
3927 switch (event) {
3928 case SND_SOC_DAPM_PRE_PMU:
Meng Wang56a0f8f2018-09-06 18:17:30 +08003929 return msm_snd_enable_codec_ext_clk(component, 1, true);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303930 case SND_SOC_DAPM_POST_PMD:
Meng Wang56a0f8f2018-09-06 18:17:30 +08003931 return msm_snd_enable_codec_ext_clk(component, 0, true);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303932 }
3933 return 0;
3934}
3935
3936static int msm_hifi_ctrl_event(struct snd_soc_dapm_widget *w,
3937 struct snd_kcontrol *k, int event)
3938{
Meng Wang56a0f8f2018-09-06 18:17:30 +08003939 struct snd_soc_component *component =
3940 snd_soc_dapm_to_component(w->dapm);
3941 struct snd_soc_card *card = component->card;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303942 struct msm_asoc_mach_data *pdata =
3943 snd_soc_card_get_drvdata(card);
3944
Meng Wang56a0f8f2018-09-06 18:17:30 +08003945 dev_dbg(component->dev, "%s: msm_hifi_control = %d\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303946 __func__, msm_hifi_control);
3947
3948 if (!pdata || !pdata->hph_en0_gpio_p) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08003949 dev_err(component->dev, "%s: hph_en0_gpio is invalid\n",
3950 __func__);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303951 return -EINVAL;
3952 }
3953
3954 if (msm_hifi_control != MSM_HIFI_ON) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08003955 dev_dbg(component->dev, "%s: HiFi mixer control is not set\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303956 __func__);
3957 return 0;
3958 }
3959
3960 switch (event) {
3961 case SND_SOC_DAPM_POST_PMU:
3962 msm_cdc_pinctrl_select_active_state(pdata->hph_en0_gpio_p);
3963 break;
3964 case SND_SOC_DAPM_PRE_PMD:
3965 msm_cdc_pinctrl_select_sleep_state(pdata->hph_en0_gpio_p);
3966 break;
3967 }
3968
3969 return 0;
3970}
3971
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303972static const struct snd_soc_dapm_widget msm_ext_dapm_widgets[] = {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303973
3974 SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0,
3975 msm_mclk_event,
3976 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3977
3978 SND_SOC_DAPM_SUPPLY("MCLK TX", SND_SOC_NOPM, 0, 0,
3979 msm_mclk_tx_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
3980
3981 SND_SOC_DAPM_SPK("Lineout_1 amp", NULL),
3982 SND_SOC_DAPM_SPK("Lineout_2 amp", NULL),
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303983 SND_SOC_DAPM_SPK("Lineout_3 amp", NULL),
3984 SND_SOC_DAPM_SPK("Lineout_4 amp", NULL),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303985 SND_SOC_DAPM_SPK("hifi amp", msm_hifi_ctrl_event),
3986 SND_SOC_DAPM_MIC("Handset Mic", NULL),
3987 SND_SOC_DAPM_MIC("Headset Mic", NULL),
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303988 SND_SOC_DAPM_MIC("Secondary Mic", NULL),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303989 SND_SOC_DAPM_MIC("ANCRight Headset Mic", NULL),
3990 SND_SOC_DAPM_MIC("ANCLeft Headset Mic", NULL),
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303991 SND_SOC_DAPM_MIC("Analog Mic4", NULL),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303992 SND_SOC_DAPM_MIC("Analog Mic5", NULL),
Aditya Bavanari45e2e652019-01-11 20:18:55 +05303993 SND_SOC_DAPM_MIC("Analog Mic6", NULL),
3994 SND_SOC_DAPM_MIC("Analog Mic7", NULL),
3995 SND_SOC_DAPM_MIC("Analog Mic8", NULL),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05303996
3997 SND_SOC_DAPM_MIC("Digital Mic0", NULL),
3998 SND_SOC_DAPM_MIC("Digital Mic1", NULL),
3999 SND_SOC_DAPM_MIC("Digital Mic2", NULL),
4000 SND_SOC_DAPM_MIC("Digital Mic3", NULL),
4001 SND_SOC_DAPM_MIC("Digital Mic4", NULL),
4002 SND_SOC_DAPM_MIC("Digital Mic5", NULL),
Aditya Bavanari45e2e652019-01-11 20:18:55 +05304003 SND_SOC_DAPM_MIC("Digital Mic6", NULL),
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304004};
4005
4006static int msm_dmic_event(struct snd_soc_dapm_widget *w,
4007 struct snd_kcontrol *kcontrol, int event)
4008{
4009 struct msm_asoc_mach_data *pdata = NULL;
Meng Wang56a0f8f2018-09-06 18:17:30 +08004010 struct snd_soc_component *component =
4011 snd_soc_dapm_to_component(w->dapm);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304012 int ret = 0;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05304013 u32 dmic_idx;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304014 int *dmic_gpio_cnt;
4015 struct device_node *dmic_gpio;
4016 char *wname;
4017
4018 wname = strpbrk(w->name, "0123");
4019 if (!wname) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08004020 dev_err(component->dev, "%s: widget not found\n", __func__);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304021 return -EINVAL;
4022 }
4023
4024 ret = kstrtouint(wname, 10, &dmic_idx);
4025 if (ret < 0) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08004026 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304027 __func__);
4028 return -EINVAL;
4029 }
4030
Meng Wang56a0f8f2018-09-06 18:17:30 +08004031 pdata = snd_soc_card_get_drvdata(component->card);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304032
4033 switch (dmic_idx) {
4034 case 0:
4035 case 1:
4036 dmic_gpio_cnt = &dmic_0_1_gpio_cnt;
4037 dmic_gpio = pdata->dmic01_gpio_p;
4038 break;
4039 case 2:
4040 case 3:
4041 dmic_gpio_cnt = &dmic_2_3_gpio_cnt;
4042 dmic_gpio = pdata->dmic23_gpio_p;
4043 break;
4044 default:
Meng Wang56a0f8f2018-09-06 18:17:30 +08004045 dev_err(component->dev, "%s: Invalid DMIC Selection\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304046 __func__);
4047 return -EINVAL;
4048 }
4049
Meng Wang56a0f8f2018-09-06 18:17:30 +08004050 dev_dbg(component->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304051 __func__, event, dmic_idx, *dmic_gpio_cnt);
4052
4053 switch (event) {
4054 case SND_SOC_DAPM_PRE_PMU:
4055 (*dmic_gpio_cnt)++;
4056 if (*dmic_gpio_cnt == 1) {
4057 ret = msm_cdc_pinctrl_select_active_state(
4058 dmic_gpio);
4059 if (ret < 0) {
4060 pr_err("%s: gpio set cannot be activated %sd",
4061 __func__, "dmic_gpio");
4062 return ret;
4063 }
4064 }
4065
4066 break;
4067 case SND_SOC_DAPM_POST_PMD:
4068 (*dmic_gpio_cnt)--;
4069 if (*dmic_gpio_cnt == 0) {
4070 ret = msm_cdc_pinctrl_select_sleep_state(
4071 dmic_gpio);
4072 if (ret < 0) {
4073 pr_err("%s: gpio set cannot be de-activated %sd",
4074 __func__, "dmic_gpio");
4075 return ret;
4076 }
4077 }
4078 break;
4079 default:
4080 pr_err("%s: invalid DAPM event %d\n", __func__, event);
4081 return -EINVAL;
4082 }
4083 return 0;
4084}
4085
4086static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = {
4087 SND_SOC_DAPM_MIC("Analog Mic1", NULL),
4088 SND_SOC_DAPM_MIC("Analog Mic2", NULL),
4089 SND_SOC_DAPM_MIC("Analog Mic3", NULL),
4090 SND_SOC_DAPM_MIC("Analog Mic4", NULL),
4091 SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event),
4092 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
4093 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
4094 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
4095};
4096
4097static inline int param_is_mask(int p)
4098{
4099 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
4100 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
4101}
4102
4103static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p,
4104 int n)
4105{
4106 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
4107}
4108
4109static void param_set_mask(struct snd_pcm_hw_params *p, int n,
4110 unsigned int bit)
4111{
4112 if (bit >= SNDRV_MASK_MAX)
4113 return;
4114 if (param_is_mask(n)) {
4115 struct snd_mask *m = param_to_mask(p, n);
4116
4117 m->bits[0] = 0;
4118 m->bits[1] = 0;
4119 m->bits[bit >> 5] |= (1 << (bit & 31));
4120 }
4121}
4122
4123static int msm_slim_get_ch_from_beid(int32_t be_id)
4124{
4125 int ch_id = 0;
4126
4127 switch (be_id) {
4128 case MSM_BACKEND_DAI_SLIMBUS_0_RX:
4129 ch_id = SLIM_RX_0;
4130 break;
4131 case MSM_BACKEND_DAI_SLIMBUS_1_RX:
4132 ch_id = SLIM_RX_1;
4133 break;
4134 case MSM_BACKEND_DAI_SLIMBUS_2_RX:
4135 ch_id = SLIM_RX_2;
4136 break;
4137 case MSM_BACKEND_DAI_SLIMBUS_3_RX:
4138 ch_id = SLIM_RX_3;
4139 break;
4140 case MSM_BACKEND_DAI_SLIMBUS_4_RX:
4141 ch_id = SLIM_RX_4;
4142 break;
4143 case MSM_BACKEND_DAI_SLIMBUS_6_RX:
4144 ch_id = SLIM_RX_6;
4145 break;
4146 case MSM_BACKEND_DAI_SLIMBUS_0_TX:
4147 ch_id = SLIM_TX_0;
4148 break;
4149 case MSM_BACKEND_DAI_SLIMBUS_3_TX:
4150 ch_id = SLIM_TX_3;
4151 break;
4152 default:
4153 ch_id = SLIM_RX_0;
4154 break;
4155 }
4156
4157 return ch_id;
4158}
4159
4160static int msm_cdc_dma_get_idx_from_beid(int32_t be_id)
4161{
4162 int idx = 0;
4163
4164 switch (be_id) {
4165 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
4166 idx = WSA_CDC_DMA_RX_0;
4167 break;
4168 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
4169 idx = WSA_CDC_DMA_TX_0;
4170 break;
4171 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
4172 idx = WSA_CDC_DMA_RX_1;
4173 break;
4174 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
4175 idx = WSA_CDC_DMA_TX_1;
4176 break;
4177 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
4178 idx = WSA_CDC_DMA_TX_2;
4179 break;
4180 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
4181 idx = RX_CDC_DMA_RX_0;
4182 break;
4183 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
4184 idx = RX_CDC_DMA_RX_1;
4185 break;
4186 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
4187 idx = RX_CDC_DMA_RX_2;
4188 break;
4189 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
4190 idx = RX_CDC_DMA_RX_3;
4191 break;
4192 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5:
4193 idx = RX_CDC_DMA_RX_5;
4194 break;
4195 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
4196 idx = TX_CDC_DMA_TX_0;
4197 break;
4198 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
4199 idx = TX_CDC_DMA_TX_3;
4200 break;
4201 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
4202 idx = TX_CDC_DMA_TX_4;
4203 break;
4204 default:
4205 idx = RX_CDC_DMA_RX_0;
4206 break;
4207 }
4208
4209 return idx;
4210}
4211
4212static int msm_ext_disp_get_idx_from_beid(int32_t be_id)
4213{
4214 int idx = -EINVAL;
4215
4216 switch (be_id) {
4217 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
4218 idx = DP_RX_IDX;
4219 break;
4220 default:
4221 pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id);
4222 idx = -EINVAL;
4223 break;
4224 }
4225
4226 return idx;
4227}
4228
4229static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
4230 struct snd_pcm_hw_params *params)
4231{
4232 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4233 struct snd_interval *rate = hw_param_interval(params,
4234 SNDRV_PCM_HW_PARAM_RATE);
4235 struct snd_interval *channels = hw_param_interval(params,
4236 SNDRV_PCM_HW_PARAM_CHANNELS);
Meng Wang56a0f8f2018-09-06 18:17:30 +08004237 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4238
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304239 int rc = 0;
4240 int idx;
4241 void *config = NULL;
Meng Wang56a0f8f2018-09-06 18:17:30 +08004242 struct snd_soc_component *component = NULL;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304243
4244 pr_debug("%s: format = %d, rate = %d\n",
4245 __func__, params_format(params), params_rate(params));
4246
4247 switch (dai_link->id) {
4248 case MSM_BACKEND_DAI_SLIMBUS_0_RX:
4249 case MSM_BACKEND_DAI_SLIMBUS_1_RX:
4250 case MSM_BACKEND_DAI_SLIMBUS_2_RX:
4251 case MSM_BACKEND_DAI_SLIMBUS_3_RX:
4252 case MSM_BACKEND_DAI_SLIMBUS_4_RX:
4253 case MSM_BACKEND_DAI_SLIMBUS_6_RX:
4254 idx = msm_slim_get_ch_from_beid(dai_link->id);
4255 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4256 slim_rx_cfg[idx].bit_format);
4257 rate->min = rate->max = slim_rx_cfg[idx].sample_rate;
4258 channels->min = channels->max = slim_rx_cfg[idx].channels;
4259 break;
4260
4261 case MSM_BACKEND_DAI_SLIMBUS_0_TX:
4262 case MSM_BACKEND_DAI_SLIMBUS_3_TX:
4263 idx = msm_slim_get_ch_from_beid(dai_link->id);
4264 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4265 slim_tx_cfg[idx].bit_format);
4266 rate->min = rate->max = slim_tx_cfg[idx].sample_rate;
4267 channels->min = channels->max = slim_tx_cfg[idx].channels;
4268 break;
4269
4270 case MSM_BACKEND_DAI_SLIMBUS_1_TX:
4271 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4272 slim_tx_cfg[1].bit_format);
4273 rate->min = rate->max = slim_tx_cfg[1].sample_rate;
4274 channels->min = channels->max = slim_tx_cfg[1].channels;
4275 break;
4276
4277 case MSM_BACKEND_DAI_SLIMBUS_4_TX:
4278 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4279 SNDRV_PCM_FORMAT_S32_LE);
4280 rate->min = rate->max = SAMPLING_RATE_8KHZ;
4281 channels->min = channels->max = msm_vi_feed_tx_ch;
4282 break;
4283
4284 case MSM_BACKEND_DAI_SLIMBUS_5_RX:
4285 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4286 slim_rx_cfg[5].bit_format);
4287 rate->min = rate->max = slim_rx_cfg[5].sample_rate;
4288 channels->min = channels->max = slim_rx_cfg[5].channels;
4289 break;
4290
4291 case MSM_BACKEND_DAI_SLIMBUS_5_TX:
Meng Wang56a0f8f2018-09-06 18:17:30 +08004292 component = snd_soc_rtdcom_lookup(rtd, "tavil_codec");
4293 if (!component) {
4294 pr_err("%s: component is NULL\n", __func__);
4295 rc = -EINVAL;
4296 goto done;
4297 }
4298
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304299 rate->min = rate->max = SAMPLING_RATE_16KHZ;
4300 channels->min = channels->max = 1;
4301
Meng Wang56a0f8f2018-09-06 18:17:30 +08004302 config = msm_codec_fn.get_afe_config_fn(component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304303 AFE_SLIMBUS_SLAVE_PORT_CONFIG);
4304 if (config) {
4305 rc = afe_set_config(AFE_SLIMBUS_SLAVE_PORT_CONFIG,
4306 config, SLIMBUS_5_TX);
4307 if (rc)
4308 pr_err("%s: Failed to set slimbus slave port config %d\n",
4309 __func__, rc);
4310 }
4311 break;
4312
4313 case MSM_BACKEND_DAI_SLIMBUS_7_RX:
4314 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4315 slim_rx_cfg[SLIM_RX_7].bit_format);
4316 rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate;
4317 channels->min = channels->max =
4318 slim_rx_cfg[SLIM_RX_7].channels;
4319 break;
4320
4321 case MSM_BACKEND_DAI_SLIMBUS_7_TX:
4322 rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate;
4323 channels->min = channels->max =
4324 slim_tx_cfg[SLIM_TX_7].channels;
4325 break;
4326
4327 case MSM_BACKEND_DAI_SLIMBUS_8_TX:
4328 rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate;
4329 channels->min = channels->max =
4330 slim_tx_cfg[SLIM_TX_8].channels;
4331 break;
4332
4333 case MSM_BACKEND_DAI_USB_RX:
4334 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4335 usb_rx_cfg.bit_format);
4336 rate->min = rate->max = usb_rx_cfg.sample_rate;
4337 channels->min = channels->max = usb_rx_cfg.channels;
4338 break;
4339
4340 case MSM_BACKEND_DAI_USB_TX:
4341 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4342 usb_tx_cfg.bit_format);
4343 rate->min = rate->max = usb_tx_cfg.sample_rate;
4344 channels->min = channels->max = usb_tx_cfg.channels;
4345 break;
4346
4347 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
4348 idx = msm_ext_disp_get_idx_from_beid(dai_link->id);
4349 if (idx < 0) {
4350 pr_err("%s: Incorrect ext disp idx %d\n",
4351 __func__, idx);
4352 rc = idx;
4353 goto done;
4354 }
4355
4356 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4357 ext_disp_rx_cfg[idx].bit_format);
4358 rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate;
4359 channels->min = channels->max = ext_disp_rx_cfg[idx].channels;
4360 break;
4361
4362 case MSM_BACKEND_DAI_AFE_PCM_RX:
4363 channels->min = channels->max = proxy_rx_cfg.channels;
4364 rate->min = rate->max = SAMPLING_RATE_48KHZ;
4365 break;
4366
4367 case MSM_BACKEND_DAI_PRI_TDM_RX_0:
4368 channels->min = channels->max =
4369 tdm_rx_cfg[TDM_PRI][TDM_0].channels;
4370 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4371 tdm_rx_cfg[TDM_PRI][TDM_0].bit_format);
4372 rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate;
4373 break;
4374
4375 case MSM_BACKEND_DAI_PRI_TDM_TX_0:
4376 channels->min = channels->max =
4377 tdm_tx_cfg[TDM_PRI][TDM_0].channels;
4378 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4379 tdm_tx_cfg[TDM_PRI][TDM_0].bit_format);
4380 rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate;
4381 break;
4382
4383 case MSM_BACKEND_DAI_SEC_TDM_RX_0:
4384 channels->min = channels->max =
4385 tdm_rx_cfg[TDM_SEC][TDM_0].channels;
4386 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4387 tdm_rx_cfg[TDM_SEC][TDM_0].bit_format);
4388 rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate;
4389 break;
4390
4391 case MSM_BACKEND_DAI_SEC_TDM_TX_0:
4392 channels->min = channels->max =
4393 tdm_tx_cfg[TDM_SEC][TDM_0].channels;
4394 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4395 tdm_tx_cfg[TDM_SEC][TDM_0].bit_format);
4396 rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate;
4397 break;
4398
4399 case MSM_BACKEND_DAI_TERT_TDM_RX_0:
4400 channels->min = channels->max =
4401 tdm_rx_cfg[TDM_TERT][TDM_0].channels;
4402 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4403 tdm_rx_cfg[TDM_TERT][TDM_0].bit_format);
4404 rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate;
4405 break;
4406
4407 case MSM_BACKEND_DAI_TERT_TDM_TX_0:
4408 channels->min = channels->max =
4409 tdm_tx_cfg[TDM_TERT][TDM_0].channels;
4410 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4411 tdm_tx_cfg[TDM_TERT][TDM_0].bit_format);
4412 rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate;
4413 break;
4414
4415 case MSM_BACKEND_DAI_QUAT_TDM_RX_0:
4416 channels->min = channels->max =
4417 tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
4418 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4419 tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format);
4420 rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate;
4421 break;
4422
4423 case MSM_BACKEND_DAI_QUAT_TDM_TX_0:
4424 channels->min = channels->max =
4425 tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
4426 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4427 tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format);
4428 rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate;
4429 break;
4430
4431 case MSM_BACKEND_DAI_QUIN_TDM_RX_0:
4432 channels->min = channels->max =
4433 tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
4434 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4435 tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format);
4436 rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate;
4437 break;
4438
4439 case MSM_BACKEND_DAI_QUIN_TDM_TX_0:
4440 channels->min = channels->max =
4441 tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
4442 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4443 tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format);
4444 rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate;
4445 break;
4446
4447
4448 case MSM_BACKEND_DAI_AUXPCM_RX:
4449 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4450 aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format);
4451 rate->min = rate->max =
4452 aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate;
4453 channels->min = channels->max =
4454 aux_pcm_rx_cfg[PRIM_AUX_PCM].channels;
4455 break;
4456
4457 case MSM_BACKEND_DAI_AUXPCM_TX:
4458 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4459 aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format);
4460 rate->min = rate->max =
4461 aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate;
4462 channels->min = channels->max =
4463 aux_pcm_tx_cfg[PRIM_AUX_PCM].channels;
4464 break;
4465
4466 case MSM_BACKEND_DAI_SEC_AUXPCM_RX:
4467 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4468 aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format);
4469 rate->min = rate->max =
4470 aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate;
4471 channels->min = channels->max =
4472 aux_pcm_rx_cfg[SEC_AUX_PCM].channels;
4473 break;
4474
4475 case MSM_BACKEND_DAI_SEC_AUXPCM_TX:
4476 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4477 aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format);
4478 rate->min = rate->max =
4479 aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate;
4480 channels->min = channels->max =
4481 aux_pcm_tx_cfg[SEC_AUX_PCM].channels;
4482 break;
4483
4484 case MSM_BACKEND_DAI_TERT_AUXPCM_RX:
4485 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4486 aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format);
4487 rate->min = rate->max =
4488 aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate;
4489 channels->min = channels->max =
4490 aux_pcm_rx_cfg[TERT_AUX_PCM].channels;
4491 break;
4492
4493 case MSM_BACKEND_DAI_TERT_AUXPCM_TX:
4494 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4495 aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format);
4496 rate->min = rate->max =
4497 aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate;
4498 channels->min = channels->max =
4499 aux_pcm_tx_cfg[TERT_AUX_PCM].channels;
4500 break;
4501
4502 case MSM_BACKEND_DAI_QUAT_AUXPCM_RX:
4503 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4504 aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format);
4505 rate->min = rate->max =
4506 aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate;
4507 channels->min = channels->max =
4508 aux_pcm_rx_cfg[QUAT_AUX_PCM].channels;
4509 break;
4510
4511 case MSM_BACKEND_DAI_QUAT_AUXPCM_TX:
4512 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4513 aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format);
4514 rate->min = rate->max =
4515 aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate;
4516 channels->min = channels->max =
4517 aux_pcm_tx_cfg[QUAT_AUX_PCM].channels;
4518 break;
4519
4520 case MSM_BACKEND_DAI_QUIN_AUXPCM_RX:
4521 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4522 aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format);
4523 rate->min = rate->max =
4524 aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate;
4525 channels->min = channels->max =
4526 aux_pcm_rx_cfg[QUIN_AUX_PCM].channels;
4527 break;
4528
4529 case MSM_BACKEND_DAI_QUIN_AUXPCM_TX:
4530 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4531 aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format);
4532 rate->min = rate->max =
4533 aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate;
4534 channels->min = channels->max =
4535 aux_pcm_tx_cfg[QUIN_AUX_PCM].channels;
4536 break;
4537
4538 case MSM_BACKEND_DAI_PRI_MI2S_RX:
4539 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4540 mi2s_rx_cfg[PRIM_MI2S].bit_format);
4541 rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate;
4542 channels->min = channels->max =
4543 mi2s_rx_cfg[PRIM_MI2S].channels;
4544 break;
4545
4546 case MSM_BACKEND_DAI_PRI_MI2S_TX:
4547 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4548 mi2s_tx_cfg[PRIM_MI2S].bit_format);
4549 rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate;
4550 channels->min = channels->max =
4551 mi2s_tx_cfg[PRIM_MI2S].channels;
4552 break;
4553
4554 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
4555 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4556 mi2s_rx_cfg[SEC_MI2S].bit_format);
4557 rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate;
4558 channels->min = channels->max =
4559 mi2s_rx_cfg[SEC_MI2S].channels;
4560 break;
4561
4562 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
4563 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4564 mi2s_tx_cfg[SEC_MI2S].bit_format);
4565 rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate;
4566 channels->min = channels->max =
4567 mi2s_tx_cfg[SEC_MI2S].channels;
4568 break;
4569
4570 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
4571 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4572 mi2s_rx_cfg[TERT_MI2S].bit_format);
4573 rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate;
4574 channels->min = channels->max =
4575 mi2s_rx_cfg[TERT_MI2S].channels;
4576 break;
4577
4578 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
4579 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4580 mi2s_tx_cfg[TERT_MI2S].bit_format);
4581 rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate;
4582 channels->min = channels->max =
4583 mi2s_tx_cfg[TERT_MI2S].channels;
4584 break;
4585
4586 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
4587 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4588 mi2s_rx_cfg[QUAT_MI2S].bit_format);
4589 rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate;
4590 channels->min = channels->max =
4591 mi2s_rx_cfg[QUAT_MI2S].channels;
4592 break;
4593
4594 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
4595 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4596 mi2s_tx_cfg[QUAT_MI2S].bit_format);
4597 rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate;
4598 channels->min = channels->max =
4599 mi2s_tx_cfg[QUAT_MI2S].channels;
4600 break;
4601
4602 case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
4603 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4604 mi2s_rx_cfg[QUIN_MI2S].bit_format);
4605 rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate;
4606 channels->min = channels->max =
4607 mi2s_rx_cfg[QUIN_MI2S].channels;
4608 break;
4609
4610 case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
4611 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4612 mi2s_tx_cfg[QUIN_MI2S].bit_format);
4613 rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate;
4614 channels->min = channels->max =
4615 mi2s_tx_cfg[QUIN_MI2S].channels;
4616 break;
4617
4618 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
4619 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
4620 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
4621 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
4622 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
4623 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4624 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4625 cdc_dma_rx_cfg[idx].bit_format);
4626 rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate;
4627 channels->min = channels->max = cdc_dma_rx_cfg[idx].channels;
4628 break;
4629
4630 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
4631 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
4632 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05304633 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
4634 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304635 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4636 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4637 cdc_dma_tx_cfg[idx].bit_format);
4638 rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate;
4639 channels->min = channels->max = cdc_dma_tx_cfg[idx].channels;
4640 break;
4641
4642 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
4643 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4644 SNDRV_PCM_FORMAT_S32_LE);
4645 rate->min = rate->max = SAMPLING_RATE_8KHZ;
4646 channels->min = channels->max = msm_vi_feed_tx_ch;
4647 break;
4648
4649 default:
4650 rate->min = rate->max = SAMPLING_RATE_48KHZ;
4651 break;
4652 }
4653
4654done:
4655 return rc;
4656}
4657
Meng Wang56a0f8f2018-09-06 18:17:30 +08004658static bool msm_usbc_swap_gnd_mic(struct snd_soc_component *component,
4659 bool active)
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304660{
Meng Wang56a0f8f2018-09-06 18:17:30 +08004661 struct snd_soc_card *card = component->card;
Vatsal Bucha6cb17a02018-08-07 11:07:04 +05304662 struct msm_asoc_mach_data *pdata =
4663 snd_soc_card_get_drvdata(card);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304664
Vatsal Bucha6cb17a02018-08-07 11:07:04 +05304665 if (!pdata->fsa_handle)
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304666 return false;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304667
Vatsal Bucha6cb17a02018-08-07 11:07:04 +05304668 return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304669}
4670
Meng Wang56a0f8f2018-09-06 18:17:30 +08004671static bool msm_swap_gnd_mic(struct snd_soc_component *component, bool active)
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304672{
4673 int value = 0;
4674 bool ret = false;
4675 struct snd_soc_card *card;
4676 struct msm_asoc_mach_data *pdata;
4677
Meng Wang56a0f8f2018-09-06 18:17:30 +08004678 if (!component) {
4679 pr_err("%s component is NULL\n", __func__);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304680 return false;
4681 }
Meng Wang56a0f8f2018-09-06 18:17:30 +08004682 card = component->card;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304683 pdata = snd_soc_card_get_drvdata(card);
4684
4685 if (!pdata)
4686 return false;
4687
4688 if (wcd_mbhc_cfg.enable_usbc_analog)
Meng Wang56a0f8f2018-09-06 18:17:30 +08004689 return msm_usbc_swap_gnd_mic(component, active);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304690
4691 /* if usbc is not defined, swap using us_euro_gpio_p */
4692 if (pdata->us_euro_gpio_p) {
4693 value = msm_cdc_pinctrl_get_state(
4694 pdata->us_euro_gpio_p);
4695 if (value)
4696 msm_cdc_pinctrl_select_sleep_state(
4697 pdata->us_euro_gpio_p);
4698 else
4699 msm_cdc_pinctrl_select_active_state(
4700 pdata->us_euro_gpio_p);
Meng Wang56a0f8f2018-09-06 18:17:30 +08004701 dev_dbg(component->dev, "%s: swap select switch %d to %d\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304702 __func__, value, !value);
4703 ret = true;
4704 }
4705 return ret;
4706}
4707
Meng Wang56a0f8f2018-09-06 18:17:30 +08004708static int msm_afe_set_config(struct snd_soc_component *component)
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304709{
4710 int ret = 0;
4711 void *config_data = NULL;
4712
4713 if (!msm_codec_fn.get_afe_config_fn) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08004714 dev_err(component->dev, "%s: codec get afe config not init'ed\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304715 __func__);
4716 return -EINVAL;
4717 }
4718
Meng Wang56a0f8f2018-09-06 18:17:30 +08004719 config_data = msm_codec_fn.get_afe_config_fn(component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304720 AFE_CDC_REGISTERS_CONFIG);
4721 if (config_data) {
4722 ret = afe_set_config(AFE_CDC_REGISTERS_CONFIG, config_data, 0);
4723 if (ret) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08004724 dev_err(component->dev,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304725 "%s: Failed to set codec registers config %d\n",
4726 __func__, ret);
4727 return ret;
4728 }
4729 }
4730
Meng Wang56a0f8f2018-09-06 18:17:30 +08004731 config_data = msm_codec_fn.get_afe_config_fn(component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304732 AFE_CDC_REGISTER_PAGE_CONFIG);
4733 if (config_data) {
4734 ret = afe_set_config(AFE_CDC_REGISTER_PAGE_CONFIG, config_data,
4735 0);
4736 if (ret)
Meng Wang56a0f8f2018-09-06 18:17:30 +08004737 dev_err(component->dev,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304738 "%s: Failed to set cdc register page config\n",
4739 __func__);
4740 }
4741
Meng Wang56a0f8f2018-09-06 18:17:30 +08004742 config_data = msm_codec_fn.get_afe_config_fn(component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304743 AFE_SLIMBUS_SLAVE_CONFIG);
4744 if (config_data) {
4745 ret = afe_set_config(AFE_SLIMBUS_SLAVE_CONFIG, config_data, 0);
4746 if (ret) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08004747 dev_err(component->dev,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304748 "%s: Failed to set slimbus slave config %d\n",
4749 __func__, ret);
4750 return ret;
4751 }
4752 }
4753
4754 return 0;
4755}
4756
4757static void msm_afe_clear_config(void)
4758{
4759 afe_clear_config(AFE_CDC_REGISTERS_CONFIG);
4760 afe_clear_config(AFE_SLIMBUS_SLAVE_CONFIG);
4761}
4762
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304763static int msm_audrx_tavil_init(struct snd_soc_pcm_runtime *rtd)
4764{
4765 int ret = 0;
4766 void *config_data;
Meng Wang56a0f8f2018-09-06 18:17:30 +08004767 struct snd_soc_component *component = NULL;
4768 struct snd_soc_dapm_context *dapm;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304769 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4770 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4771 struct snd_soc_component *aux_comp;
Meng Wang56a0f8f2018-09-06 18:17:30 +08004772 struct snd_card *card = rtd->card->snd_card;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304773 struct snd_info_entry *entry;
4774 struct msm_asoc_mach_data *pdata =
4775 snd_soc_card_get_drvdata(rtd->card);
4776
4777 /*
4778 * Codec SLIMBUS configuration
4779 * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8
4780 * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13
4781 * TX14, TX15, TX16
4782 */
4783 unsigned int rx_ch[WCD934X_RX_MAX] = {144, 145, 146, 147, 148, 149,
4784 150, 151};
4785 unsigned int tx_ch[WCD934X_TX_MAX] = {128, 129, 130, 131, 132, 133,
4786 134, 135, 136, 137, 138, 139,
4787 140, 141, 142, 143};
4788
4789 pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev));
4790
4791 rtd->pmdown_time = 0;
4792
Meng Wang56a0f8f2018-09-06 18:17:30 +08004793 component = snd_soc_rtdcom_lookup(rtd, "tavil_codec");
4794 if (!component) {
4795 pr_err("%s: component is NULL\n", __func__);
4796 return -EINVAL;
4797 }
4798 dapm = snd_soc_component_get_dapm(component);
4799
Aditya Bavanari45e2e652019-01-11 20:18:55 +05304800 ret = snd_soc_add_component_controls(component, msm_ext_snd_controls,
4801 ARRAY_SIZE(msm_ext_snd_controls));
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304802 if (ret < 0) {
4803 pr_err("%s: add_codec_controls failed, err %d\n",
4804 __func__, ret);
4805 return ret;
4806 }
4807
Meng Wang56a0f8f2018-09-06 18:17:30 +08004808 ret = snd_soc_add_component_controls(component, msm_common_snd_controls,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304809 ARRAY_SIZE(msm_common_snd_controls));
4810 if (ret < 0) {
4811 pr_err("%s: add_codec_controls failed, err %d\n",
4812 __func__, ret);
4813 return ret;
4814 }
4815
Aditya Bavanari45e2e652019-01-11 20:18:55 +05304816 snd_soc_dapm_new_controls(dapm, msm_ext_dapm_widgets,
4817 ARRAY_SIZE(msm_ext_dapm_widgets));
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304818
Aditya Bavanari45e2e652019-01-11 20:18:55 +05304819 snd_soc_dapm_add_routes(dapm, wcd_audio_paths,
4820 ARRAY_SIZE(wcd_audio_paths));
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304821
4822 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
4823 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
4824 snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic");
4825 snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic");
4826 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
4827 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
4828 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
4829 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
4830 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
4831 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
4832 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5");
4833 snd_soc_dapm_ignore_suspend(dapm, "MADINPUT");
4834 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT");
4835 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT1");
4836 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_OUT2");
4837 snd_soc_dapm_ignore_suspend(dapm, "EAR");
4838 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1");
4839 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2");
4840 snd_soc_dapm_ignore_suspend(dapm, "ANC EAR");
4841 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
4842 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
4843 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
4844 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
4845 snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI");
4846 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT");
4847 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL");
4848 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR");
4849
4850 snd_soc_dapm_sync(dapm);
4851
4852 snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
4853 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
4854
4855 msm_codec_fn.get_afe_config_fn = tavil_get_afe_config;
4856
Meng Wang56a0f8f2018-09-06 18:17:30 +08004857 ret = msm_afe_set_config(component);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304858 if (ret) {
4859 pr_err("%s: Failed to set AFE config %d\n", __func__, ret);
4860 goto err;
4861 }
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05304862 pdata->is_afe_config_done = true;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304863
Meng Wang56a0f8f2018-09-06 18:17:30 +08004864 config_data = msm_codec_fn.get_afe_config_fn(component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304865 AFE_AANC_VERSION);
4866 if (config_data) {
4867 ret = afe_set_config(AFE_AANC_VERSION, config_data, 0);
4868 if (ret) {
4869 pr_err("%s: Failed to set aanc version %d\n",
4870 __func__, ret);
4871 goto err;
4872 }
4873 }
4874
4875 /*
4876 * Send speaker configuration only for WSA8810.
4877 * Default configuration is for WSA8815.
4878 */
4879 pr_debug("%s: Number of aux devices: %d\n",
4880 __func__, rtd->card->num_aux_devs);
4881 if (rtd->card->num_aux_devs &&
4882 !list_empty(&rtd->card->aux_comp_list)) {
4883 aux_comp = list_first_entry(&rtd->card->aux_comp_list,
4884 struct snd_soc_component, card_aux_list);
4885 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
4886 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08004887 tavil_set_spkr_mode(component, WCD934X_SPKR_MODE_1);
4888 tavil_set_spkr_gain_offset(component,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304889 WCD934X_RX_GAIN_OFFSET_M1P5_DB);
4890 }
4891 }
4892
4893 card = rtd->card->snd_card;
Aditya Bavanari5b2d30f2019-01-28 20:17:32 +05304894 if (!pdata->codec_root) {
4895 entry = snd_info_create_subdir(card->module, "codecs",
4896 card->proc_root);
4897 if (!entry) {
4898 pr_debug("%s: Cannot create codecs module entry\n",
4899 __func__);
4900 ret = 0;
4901 goto err;
4902 }
4903 pdata->codec_root = entry;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304904 }
Meng Wang56a0f8f2018-09-06 18:17:30 +08004905 tavil_codec_info_create_codec_entry(pdata->codec_root, component);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05304906
4907 codec_reg_done = true;
4908 return 0;
4909err:
4910 return ret;
4911}
4912
Aditya Bavanari45e2e652019-01-11 20:18:55 +05304913static int msm_audrx_tasha_init(struct snd_soc_pcm_runtime *rtd)
4914{
4915 int ret = 0;
4916 void *config_data;
4917 struct snd_soc_component *component = NULL;
4918 struct snd_soc_dapm_context *dapm;
4919 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4920 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4921 struct snd_soc_component *aux_comp;
4922 struct snd_card *card;
4923 struct snd_info_entry *entry;
4924 struct msm_asoc_mach_data *pdata =
4925 snd_soc_card_get_drvdata(rtd->card);
4926
4927 /* Codec SLIMBUS configuration
4928 * RX1, RX2, RX3, RX4, RX5, RX6, RX7, RX8, RX9, RX10, RX11, RX12, RX13
4929 * TX1, TX2, TX3, TX4, TX5, TX6, TX7, TX8, TX9, TX10, TX11, TX12, TX13
4930 * TX14, TX15, TX16
4931 */
4932 unsigned int rx_ch[TASHA_RX_MAX] = {144, 145, 146, 147, 148, 149, 150,
4933 151, 152, 153, 154, 155, 156};
4934 unsigned int tx_ch[TASHA_TX_MAX] = {128, 129, 130, 131, 132, 133,
4935 134, 135, 136, 137, 138, 139,
4936 140, 141, 142, 143};
4937
4938 pr_info("%s: dev_name:%s\n", __func__, dev_name(cpu_dai->dev));
4939
4940 rtd->pmdown_time = 0;
4941
4942 component = snd_soc_rtdcom_lookup(rtd, "tasha_codec");
4943 if (!component) {
4944 pr_err("%s: component is NULL\n", __func__);
4945 return -EINVAL;
4946 }
4947
4948 dapm = snd_soc_component_get_dapm(component);
4949
4950 ret = snd_soc_add_component_controls(component, msm_ext_snd_controls,
4951 ARRAY_SIZE(msm_ext_snd_controls));
4952 if (ret < 0) {
4953 pr_err("%s: add_component_controls failed, err %d\n",
4954 __func__, ret);
4955 return ret;
4956 }
4957
4958 ret = snd_soc_add_component_controls(component, msm_common_snd_controls,
4959 ARRAY_SIZE(msm_common_snd_controls));
4960 if (ret < 0) {
4961 pr_err("%s: add_component_controls failed, err %d\n",
4962 __func__, ret);
4963 return ret;
4964 }
4965
4966 snd_soc_dapm_new_controls(dapm, msm_ext_dapm_widgets,
4967 ARRAY_SIZE(msm_ext_dapm_widgets));
4968
4969 snd_soc_dapm_add_routes(dapm, wcd_audio_paths,
4970 ARRAY_SIZE(wcd_audio_paths));
4971
4972 snd_soc_dapm_enable_pin(dapm, "Lineout_1 amp");
4973 snd_soc_dapm_enable_pin(dapm, "Lineout_2 amp");
4974 snd_soc_dapm_enable_pin(dapm, "Lineout_3 amp");
4975 snd_soc_dapm_enable_pin(dapm, "Lineout_4 amp");
4976
4977 snd_soc_dapm_ignore_suspend(dapm, "MADINPUT");
4978 snd_soc_dapm_ignore_suspend(dapm, "MAD_CPE_INPUT");
4979 snd_soc_dapm_ignore_suspend(dapm, "Handset Mic");
4980 snd_soc_dapm_ignore_suspend(dapm, "Headset Mic");
4981 snd_soc_dapm_ignore_suspend(dapm, "Secondary Mic");
4982 snd_soc_dapm_ignore_suspend(dapm, "Lineout_1 amp");
4983 snd_soc_dapm_ignore_suspend(dapm, "Lineout_2 amp");
4984 snd_soc_dapm_ignore_suspend(dapm, "Lineout_3 amp");
4985 snd_soc_dapm_ignore_suspend(dapm, "Lineout_4 amp");
4986 snd_soc_dapm_ignore_suspend(dapm, "ANCRight Headset Mic");
4987 snd_soc_dapm_ignore_suspend(dapm, "ANCLeft Headset Mic");
4988 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
4989 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
4990 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
4991 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
4992 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
4993 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
4994 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4");
4995 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic6");
4996 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic7");
4997 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic8");
4998
4999 snd_soc_dapm_ignore_suspend(dapm, "EAR");
5000 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT1");
5001 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT2");
5002 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
5003 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
5004 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
5005 snd_soc_dapm_ignore_suspend(dapm, "AMIC4");
5006 snd_soc_dapm_ignore_suspend(dapm, "AMIC5");
5007 snd_soc_dapm_ignore_suspend(dapm, "DMIC0");
5008 snd_soc_dapm_ignore_suspend(dapm, "DMIC1");
5009 snd_soc_dapm_ignore_suspend(dapm, "DMIC2");
5010 snd_soc_dapm_ignore_suspend(dapm, "DMIC3");
5011 snd_soc_dapm_ignore_suspend(dapm, "DMIC4");
5012 snd_soc_dapm_ignore_suspend(dapm, "DMIC5");
5013 snd_soc_dapm_ignore_suspend(dapm, "ANC EAR");
5014 snd_soc_dapm_ignore_suspend(dapm, "SPK1 OUT");
5015 snd_soc_dapm_ignore_suspend(dapm, "SPK2 OUT");
5016 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
5017 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
5018 snd_soc_dapm_ignore_suspend(dapm, "AIF4 VI");
5019 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT");
5020
5021 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT3");
5022 snd_soc_dapm_ignore_suspend(dapm, "LINEOUT4");
5023 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHL");
5024 snd_soc_dapm_ignore_suspend(dapm, "ANC HPHR");
5025 snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT1");
5026 snd_soc_dapm_ignore_suspend(dapm, "ANC LINEOUT2");
5027
5028 snd_soc_dapm_sync(dapm);
5029
5030 snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
5031 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
5032
5033 msm_codec_fn.get_afe_config_fn = tasha_get_afe_config;
5034
5035 ret = msm_afe_set_config(component);
5036 if (ret) {
5037 pr_err("%s: Failed to set AFE config %d\n", __func__, ret);
5038 goto err;
5039 }
5040 pdata->is_afe_config_done = true;
5041
5042 config_data = msm_codec_fn.get_afe_config_fn(component,
5043 AFE_AANC_VERSION);
5044 if (config_data) {
5045 ret = afe_set_config(AFE_AANC_VERSION, config_data, 0);
5046 if (ret) {
5047 pr_err("%s: Failed to set aanc version %d\n",
5048 __func__, ret);
5049 goto err;
5050 }
5051 }
5052
5053 /*
5054 * Send speaker configuration only for WSA8810.
5055 * Default configuration is for WSA8815.
5056 */
5057 pr_debug("%s: Number of aux devices: %d\n",
5058 __func__, rtd->card->num_aux_devs);
5059 if (rtd->card->num_aux_devs &&
5060 !list_empty(&rtd->card->aux_comp_list)) {
5061 aux_comp = list_first_entry(&rtd->card->aux_comp_list,
5062 struct snd_soc_component, card_aux_list);
5063 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
5064 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
5065 tasha_set_spkr_mode(component, SPKR_MODE_1);
5066 tasha_set_spkr_gain_offset(component,
5067 RX_GAIN_OFFSET_M1P5_DB);
5068 }
5069 }
5070
5071 card = rtd->card->snd_card;
Aditya Bavanari5b2d30f2019-01-28 20:17:32 +05305072 if (!pdata->codec_root) {
5073 entry = snd_info_create_subdir(card->module, "codecs",
5074 card->proc_root);
5075 if (!entry) {
5076 pr_debug("%s: Cannot create codecs module entry\n",
5077 __func__);
5078 ret = 0;
5079 goto err;
5080 }
5081 pdata->codec_root = entry;
Aditya Bavanari45e2e652019-01-11 20:18:55 +05305082 }
Aditya Bavanari45e2e652019-01-11 20:18:55 +05305083 tasha_codec_info_create_codec_entry(pdata->codec_root, component);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05305084
5085 codec_reg_done = true;
5086 return 0;
5087err:
5088 return ret;
5089}
5090
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305091static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
5092{
5093 int ret = 0;
Meng Wang56a0f8f2018-09-06 18:17:30 +08005094 struct snd_soc_component *component;
5095 struct snd_soc_dapm_context *dapm;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305096 struct snd_card *card;
5097 struct snd_info_entry *entry;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05305098 struct snd_soc_component *aux_comp;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305099 struct msm_asoc_mach_data *pdata =
5100 snd_soc_card_get_drvdata(rtd->card);
Meng Wang56a0f8f2018-09-06 18:17:30 +08005101 struct snd_soc_dai *codec_dai = rtd->codec_dai;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305102
Meng Wang56a0f8f2018-09-06 18:17:30 +08005103 component = snd_soc_rtdcom_lookup(rtd, "bolero_codec");
5104 if (!component) {
5105 pr_err("%s: component is NULL\n", __func__);
5106 return -EINVAL;
5107 }
5108 dapm = snd_soc_component_get_dapm(component);
5109
5110 ret = snd_soc_add_component_controls(component, msm_int_snd_controls,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305111 ARRAY_SIZE(msm_int_snd_controls));
5112 if (ret < 0) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08005113 pr_err("%s: add_component_controls failed: %d\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305114 __func__, ret);
5115 return ret;
5116 }
Meng Wang56a0f8f2018-09-06 18:17:30 +08005117 ret = snd_soc_add_component_controls(component, msm_common_snd_controls,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305118 ARRAY_SIZE(msm_common_snd_controls));
5119 if (ret < 0) {
5120 pr_err("%s: add common snd controls failed: %d\n",
5121 __func__, ret);
5122 return ret;
5123 }
5124
5125 snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
5126 ARRAY_SIZE(msm_int_dapm_widgets));
5127
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05305128 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305129 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
5130 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
5131 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305132
5133 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1");
5134 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2");
5135 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3");
5136 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4");
5137
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05305138 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT");
5139 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT");
5140 snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI");
5141 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA");
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305142
5143 snd_soc_dapm_sync(dapm);
5144
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05305145 /*
5146 * Send speaker configuration only for WSA8810.
5147 * Default configuration is for WSA8815.
5148 */
Meng Wang56a0f8f2018-09-06 18:17:30 +08005149 dev_dbg(component->dev, "%s: Number of aux devices: %d\n",
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05305150 __func__, rtd->card->num_aux_devs);
5151 if (rtd->card->num_aux_devs &&
Aditya Bavanari353a5832018-11-22 15:10:32 +05305152 !list_empty(&rtd->card->aux_comp_list)) {
Laxminath Kasam85af5ca2019-03-11 14:33:22 +05305153 list_for_each_entry(aux_comp, &rtd->card->aux_comp_list,
5154 card_aux_list) {
5155 if (!strcmp(aux_comp->name, WSA8810_NAME_1) ||
5156 !strcmp(aux_comp->name, WSA8810_NAME_2)) {
5157 wsa_macro_set_spkr_mode(component,
5158 WSA_MACRO_SPKR_MODE_1);
5159 wsa_macro_set_spkr_gain_offset(component,
5160 WSA_MACRO_GAIN_OFFSET_M1P5_DB);
5161 break;
5162 }
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05305163 }
5164 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305165 card = rtd->card->snd_card;
Aditya Bavanari4ae32fc2018-08-13 13:08:34 +05305166 if (!pdata->codec_root) {
5167 entry = snd_info_create_subdir(card->module, "codecs",
5168 card->proc_root);
5169 if (!entry) {
5170 pr_debug("%s: Cannot create codecs module entry\n",
5171 __func__);
5172 ret = 0;
5173 goto err;
5174 }
5175 pdata->codec_root = entry;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305176 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305177 bolero_info_create_codec_entry(pdata->codec_root, codec);
Aditya Bavanari3e19f3c2018-11-12 19:29:50 +05305178 /*
5179 * SM6150 MSM 1.0 doesn't have hardware wake up interrupt line
5180 * from AOSS to APSS. So, it uses SW workaround and listens to
5181 * interrupt from AFE over IPC.
5182 * Check for MSM version and MSM ID and register wake irq
5183 * accordingly to provide compatibility to all chipsets.
5184 */
5185 if (socinfo_get_id() == SM6150_SOC_MSM_ID &&
5186 socinfo_get_version() == SM6150_SOC_VERSION_1_0)
Meng Wang56a0f8f2018-09-06 18:17:30 +08005187 bolero_register_wake_irq(component, true);
Aditya Bavanari3e19f3c2018-11-12 19:29:50 +05305188 else
Meng Wang56a0f8f2018-09-06 18:17:30 +08005189 bolero_register_wake_irq(component, false);
Aditya Bavanari3e19f3c2018-11-12 19:29:50 +05305190
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305191 codec_reg_done = true;
5192 return 0;
5193err:
5194 return ret;
5195}
5196
5197static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
5198{
5199 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
5200 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160, 161};
5201 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5202
5203 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
5204 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
5205}
5206
5207static void *def_wcd_mbhc_cal(void)
5208{
5209 void *wcd_mbhc_cal;
5210 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
5211 u16 *btn_high;
5212
5213 wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
5214 WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
5215 if (!wcd_mbhc_cal)
5216 return NULL;
5217
5218#define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->X) = (Y))
5219 S(v_hs_max, 1600);
5220#undef S
5221#define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->X) = (Y))
5222 S(num_btn, WCD_MBHC_DEF_BUTTONS);
5223#undef S
5224
5225 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal);
5226 btn_high = ((void *)&btn_cfg->_v_btn_low) +
5227 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
5228
5229 btn_high[0] = 75;
5230 btn_high[1] = 150;
5231 btn_high[2] = 237;
5232 btn_high[3] = 500;
5233 btn_high[4] = 500;
5234 btn_high[5] = 500;
5235 btn_high[6] = 500;
5236 btn_high[7] = 500;
5237
5238 return wcd_mbhc_cal;
5239}
5240
5241static int msm_snd_hw_params(struct snd_pcm_substream *substream,
5242 struct snd_pcm_hw_params *params)
5243{
5244 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5245 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5246 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5247 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5248
5249 int ret = 0;
5250 u32 rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
5251 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
5252 u32 user_set_tx_ch = 0;
5253 u32 rx_ch_count;
5254
5255 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5256 ret = snd_soc_dai_get_channel_map(codec_dai,
5257 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5258 if (ret < 0) {
5259 pr_err("%s: failed to get codec chan map, err:%d\n",
5260 __func__, ret);
5261 goto err;
5262 }
5263 if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_5_RX) {
5264 pr_debug("%s: rx_5_ch=%d\n", __func__,
5265 slim_rx_cfg[5].channels);
5266 rx_ch_count = slim_rx_cfg[5].channels;
5267 } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_2_RX) {
5268 pr_debug("%s: rx_2_ch=%d\n", __func__,
5269 slim_rx_cfg[2].channels);
5270 rx_ch_count = slim_rx_cfg[2].channels;
5271 } else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_6_RX) {
5272 pr_debug("%s: rx_6_ch=%d\n", __func__,
5273 slim_rx_cfg[6].channels);
5274 rx_ch_count = slim_rx_cfg[6].channels;
5275 } else {
5276 pr_debug("%s: rx_0_ch=%d\n", __func__,
5277 slim_rx_cfg[0].channels);
5278 rx_ch_count = slim_rx_cfg[0].channels;
5279 }
5280 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
5281 rx_ch_count, rx_ch);
5282 if (ret < 0) {
5283 pr_err("%s: failed to set cpu chan map, err:%d\n",
5284 __func__, ret);
5285 goto err;
5286 }
5287 } else {
5288
5289 pr_debug("%s: %s_tx_dai_id_%d_ch=%d\n", __func__,
5290 codec_dai->name, codec_dai->id, user_set_tx_ch);
5291 ret = snd_soc_dai_get_channel_map(codec_dai,
5292 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5293 if (ret < 0) {
5294 pr_err("%s: failed to get tx codec chan map, err:%d\n",
5295 __func__, ret);
5296 goto err;
5297 }
5298 /* For <codec>_tx1 case */
5299 if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_0_TX)
5300 user_set_tx_ch = slim_tx_cfg[0].channels;
5301 /* For <codec>_tx3 case */
5302 else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_1_TX)
5303 user_set_tx_ch = slim_tx_cfg[1].channels;
5304 else if (dai_link->id == MSM_BACKEND_DAI_SLIMBUS_4_TX)
5305 user_set_tx_ch = msm_vi_feed_tx_ch;
5306 else
5307 user_set_tx_ch = tx_ch_cnt;
5308
5309 pr_debug("%s: msm_slim_0_tx_ch(%d) user_set_tx_ch(%d) tx_ch_cnt(%d), BE id (%d)\n",
5310 __func__, slim_tx_cfg[0].channels, user_set_tx_ch,
5311 tx_ch_cnt, dai_link->id);
5312
5313 ret = snd_soc_dai_set_channel_map(cpu_dai,
5314 user_set_tx_ch, tx_ch, 0, 0);
5315 if (ret < 0)
5316 pr_err("%s: failed to set tx cpu chan map, err:%d\n",
5317 __func__, ret);
5318 }
5319
5320err:
5321 return ret;
5322}
5323
5324
5325static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream,
5326 struct snd_pcm_hw_params *params)
5327{
5328 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5329 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5330 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5331 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5332
5333 int ret = 0;
5334 u32 rx_ch_cdc_dma, tx_ch_cdc_dma;
5335 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
5336 u32 user_set_tx_ch = 0;
5337 u32 user_set_rx_ch = 0;
5338 u32 ch_id;
5339
5340 ret = snd_soc_dai_get_channel_map(codec_dai,
5341 &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt,
5342 &rx_ch_cdc_dma);
5343 if (ret < 0) {
5344 pr_err("%s: failed to get codec chan map, err:%d\n",
5345 __func__, ret);
5346 goto err;
5347 }
5348
5349 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5350 switch (dai_link->id) {
5351 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
5352 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
5353 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
5354 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
5355 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
5356 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
5357 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_4:
5358 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5:
5359 {
5360 ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id);
5361 pr_debug("%s: id %d rx_ch=%d\n", __func__,
5362 ch_id, cdc_dma_rx_cfg[ch_id].channels);
5363 user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels;
5364 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
5365 user_set_rx_ch, &rx_ch_cdc_dma);
5366 if (ret < 0) {
5367 pr_err("%s: failed to set cpu chan map, err:%d\n",
5368 __func__, ret);
5369 goto err;
5370 }
5371
5372 }
5373 break;
5374 }
5375 } else {
5376 switch (dai_link->id) {
5377 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
5378 {
5379 user_set_tx_ch = msm_vi_feed_tx_ch;
5380 }
5381 break;
5382 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
5383 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
5384 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05305385 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
5386 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305387 {
5388 ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id);
5389 pr_debug("%s: id %d tx_ch=%d\n", __func__,
5390 ch_id, cdc_dma_tx_cfg[ch_id].channels);
5391 user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels;
5392 }
5393 break;
5394 }
5395
5396 ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch,
5397 &tx_ch_cdc_dma, 0, 0);
5398 if (ret < 0) {
5399 pr_err("%s: failed to set cpu chan map, err:%d\n",
5400 __func__, ret);
5401 goto err;
5402 }
5403 }
5404
5405err:
5406 return ret;
5407}
5408
5409static int msm_slimbus_2_hw_params(struct snd_pcm_substream *substream,
5410 struct snd_pcm_hw_params *params)
5411{
5412 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5413 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5414 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5415 unsigned int rx_ch[SLIM_MAX_RX_PORTS], tx_ch[SLIM_MAX_TX_PORTS];
5416 unsigned int rx_ch_cnt = 0, tx_ch_cnt = 0;
5417 unsigned int num_tx_ch = 0;
5418 unsigned int num_rx_ch = 0;
5419 int ret = 0;
5420
5421 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5422 num_rx_ch = params_channels(params);
5423 pr_debug("%s: %s rx_dai_id = %d num_ch = %d\n", __func__,
5424 codec_dai->name, codec_dai->id, num_rx_ch);
5425 ret = snd_soc_dai_get_channel_map(codec_dai,
5426 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5427 if (ret < 0) {
5428 pr_err("%s: failed to get codec chan map, err:%d\n",
5429 __func__, ret);
5430 goto err;
5431 }
5432 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
5433 num_rx_ch, rx_ch);
5434 if (ret < 0) {
5435 pr_err("%s: failed to set cpu chan map, err:%d\n",
5436 __func__, ret);
5437 goto err;
5438 }
5439 } else {
5440 num_tx_ch = params_channels(params);
5441 pr_debug("%s: %s tx_dai_id = %d num_ch = %d\n", __func__,
5442 codec_dai->name, codec_dai->id, num_tx_ch);
5443 ret = snd_soc_dai_get_channel_map(codec_dai,
5444 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5445 if (ret < 0) {
5446 pr_err("%s: failed to get tx codec chan map, err:%d\n",
5447 __func__, ret);
5448 goto err;
5449 }
5450 ret = snd_soc_dai_set_channel_map(cpu_dai,
5451 num_tx_ch, tx_ch, 0, 0);
5452 if (ret < 0) {
5453 pr_err("%s: failed to set tx cpu chan map, err:%d\n",
5454 __func__, ret);
5455 goto err;
5456 }
5457 }
5458
5459err:
5460 return ret;
5461}
5462
5463static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
5464 struct snd_pcm_hw_params *params)
5465{
5466 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5467 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5468 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5469 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5470 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
5471 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
5472 int ret;
5473
5474 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
5475 codec_dai->name, codec_dai->id);
5476 ret = snd_soc_dai_get_channel_map(codec_dai,
5477 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
5478 if (ret) {
5479 dev_err(rtd->dev,
5480 "%s: failed to get BTFM codec chan map\n, err:%d\n",
5481 __func__, ret);
5482 goto err;
5483 }
5484
5485 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n",
5486 __func__, tx_ch_cnt, dai_link->id);
5487
5488 ret = snd_soc_dai_set_channel_map(cpu_dai,
5489 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
5490 if (ret)
5491 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
5492 __func__, ret);
5493
5494err:
5495 return ret;
5496}
5497
Aditya Bavanari45e2e652019-01-11 20:18:55 +05305498int msm_snd_cpe_hw_params(struct snd_pcm_substream *substream,
5499 struct snd_pcm_hw_params *params)
5500{
5501 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5502 struct snd_soc_dai *codec_dai = rtd->codec_dai;
5503 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5504 struct snd_soc_dai_link *dai_link = rtd->dai_link;
5505 int ret = 0;
5506 u32 tx_ch[SLIM_MAX_TX_PORTS];
5507 u32 tx_ch_cnt = 0;
5508
5509 if (substream->stream != SNDRV_PCM_STREAM_CAPTURE) {
5510 pr_err("%s: Invalid stream type %d\n",
5511 __func__, substream->stream);
5512 ret = -EINVAL;
5513 goto end;
5514 }
5515
5516 pr_debug("%s: %s_tx_dai_id_%d\n", __func__,
5517 codec_dai->name, codec_dai->id);
5518 ret = snd_soc_dai_get_channel_map(codec_dai,
5519 &tx_ch_cnt, tx_ch, NULL, NULL);
5520 if (ret < 0) {
5521 pr_err("%s: failed to get codec chan map\n, err:%d\n",
5522 __func__, ret);
5523 goto end;
5524 }
5525
5526 pr_debug("%s: tx_ch_cnt(%d) id %d\n",
5527 __func__, tx_ch_cnt, dai_link->id);
5528
5529 ret = snd_soc_dai_set_channel_map(cpu_dai,
5530 tx_ch_cnt, tx_ch, 0, 0);
5531 if (ret < 0) {
5532 pr_err("%s: failed to set cpu chan map, err:%d\n",
5533 __func__, ret);
5534 goto end;
5535 }
5536end:
5537 return ret;
5538}
5539
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305540static int msm_get_port_id(int be_id)
5541{
5542 int afe_port_id;
5543
5544 switch (be_id) {
5545 case MSM_BACKEND_DAI_PRI_MI2S_RX:
5546 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX;
5547 break;
5548 case MSM_BACKEND_DAI_PRI_MI2S_TX:
5549 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX;
5550 break;
5551 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
5552 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX;
5553 break;
5554 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
5555 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX;
5556 break;
5557 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
5558 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX;
5559 break;
5560 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
5561 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
5562 break;
5563 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
5564 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
5565 break;
5566 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
5567 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
5568 break;
5569 case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
5570 afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX;
5571 break;
5572 case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
5573 afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
5574 break;
5575 default:
5576 pr_err("%s: Invalid BE id: %d\n", __func__, be_id);
5577 afe_port_id = -EINVAL;
5578 }
5579
5580 return afe_port_id;
5581}
5582
5583static u32 get_mi2s_bits_per_sample(u32 bit_format)
5584{
5585 u32 bit_per_sample;
5586
5587 switch (bit_format) {
5588 case SNDRV_PCM_FORMAT_S32_LE:
5589 case SNDRV_PCM_FORMAT_S24_3LE:
5590 case SNDRV_PCM_FORMAT_S24_LE:
5591 bit_per_sample = 32;
5592 break;
5593 case SNDRV_PCM_FORMAT_S16_LE:
5594 default:
5595 bit_per_sample = 16;
5596 break;
5597 }
5598
5599 return bit_per_sample;
5600}
5601
5602static void update_mi2s_clk_val(int dai_id, int stream)
5603{
5604 u32 bit_per_sample;
5605
5606 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
5607 bit_per_sample =
5608 get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format);
5609 mi2s_clk[dai_id].clk_freq_in_hz =
5610 mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
5611 } else {
5612 bit_per_sample =
5613 get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format);
5614 mi2s_clk[dai_id].clk_freq_in_hz =
5615 mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
5616 }
5617}
5618
5619static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
5620{
5621 int ret = 0;
5622 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5623 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5624 int port_id = 0;
5625 int index = cpu_dai->id;
5626
5627 port_id = msm_get_port_id(rtd->dai_link->id);
5628 if (port_id < 0) {
5629 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
5630 ret = port_id;
5631 goto err;
5632 }
5633
5634 if (enable) {
5635 update_mi2s_clk_val(index, substream->stream);
5636 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
5637 mi2s_clk[index].clk_freq_in_hz);
5638 }
5639
5640 mi2s_clk[index].enable = enable;
5641 ret = afe_set_lpass_clock_v2(port_id,
5642 &mi2s_clk[index]);
5643 if (ret < 0) {
5644 dev_err(rtd->card->dev,
5645 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
5646 __func__, port_id, ret);
5647 goto err;
5648 }
5649
5650err:
5651 return ret;
5652}
5653
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305654static int sm6150_tdm_snd_hw_params(struct snd_pcm_substream *substream,
5655 struct snd_pcm_hw_params *params)
5656{
5657 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5658 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5659 int ret = 0;
5660 int slot_width = 32;
5661 int channels, slots;
5662 unsigned int slot_mask, rate, clk_freq;
5663 unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28};
5664
5665 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
5666
5667 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
5668 switch (cpu_dai->id) {
5669 case AFE_PORT_ID_PRIMARY_TDM_RX:
5670 slots = tdm_rx_cfg[TDM_PRI][TDM_0].channels;
5671 break;
5672 case AFE_PORT_ID_SECONDARY_TDM_RX:
5673 slots = tdm_rx_cfg[TDM_SEC][TDM_0].channels;
5674 break;
5675 case AFE_PORT_ID_TERTIARY_TDM_RX:
5676 slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels;
5677 break;
5678 case AFE_PORT_ID_QUATERNARY_TDM_RX:
5679 slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
5680 break;
5681 case AFE_PORT_ID_QUINARY_TDM_RX:
5682 slots = tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
5683 break;
5684 case AFE_PORT_ID_PRIMARY_TDM_TX:
5685 slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels;
5686 break;
5687 case AFE_PORT_ID_SECONDARY_TDM_TX:
5688 slots = tdm_tx_cfg[TDM_SEC][TDM_0].channels;
5689 break;
5690 case AFE_PORT_ID_TERTIARY_TDM_TX:
5691 slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels;
5692 break;
5693 case AFE_PORT_ID_QUATERNARY_TDM_TX:
5694 slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
5695 break;
5696 case AFE_PORT_ID_QUINARY_TDM_TX:
5697 slots = tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
5698 break;
5699
5700 default:
5701 pr_err("%s: dai id 0x%x not supported\n",
5702 __func__, cpu_dai->id);
5703 return -EINVAL;
5704 }
5705
5706 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
5707 /*2 slot config - bits 0 and 1 set for the first two slots */
5708 slot_mask = 0x0000FFFF >> (16-slots);
5709 channels = slots;
5710
5711 pr_debug("%s: tdm rx slot_width %d slots %d\n",
5712 __func__, slot_width, slots);
5713
5714 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
5715 slots, slot_width);
5716 if (ret < 0) {
5717 pr_err("%s: failed to set tdm rx slot, err:%d\n",
5718 __func__, ret);
5719 goto end;
5720 }
5721
5722 ret = snd_soc_dai_set_channel_map(cpu_dai,
5723 0, NULL, channels, slot_offset);
5724 if (ret < 0) {
5725 pr_err("%s: failed to set tdm rx channel map, err:%d\n",
5726 __func__, ret);
5727 goto end;
5728 }
5729 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
5730 /*2 slot config - bits 0 and 1 set for the first two slots */
5731 slot_mask = 0x0000FFFF >> (16-slots);
5732 channels = slots;
5733
5734 pr_debug("%s: tdm tx slot_width %d slots %d\n",
5735 __func__, slot_width, slots);
5736
5737 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
5738 slots, slot_width);
5739 if (ret < 0) {
5740 pr_err("%s: failed to set tdm tx slot, err:%d\n",
5741 __func__, ret);
5742 goto end;
5743 }
5744
5745 ret = snd_soc_dai_set_channel_map(cpu_dai,
5746 channels, slot_offset, 0, NULL);
5747 if (ret < 0) {
5748 pr_err("%s: failed to set tdm tx channel map, err:%d\n",
5749 __func__, ret);
5750 goto end;
5751 }
5752 } else {
5753 ret = -EINVAL;
5754 pr_err("%s: invalid use case, err:%d\n",
5755 __func__, ret);
5756 goto end;
5757 }
5758
5759 rate = params_rate(params);
5760 clk_freq = rate * slot_width * slots;
5761 ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT);
5762 if (ret < 0)
5763 pr_err("%s: failed to set tdm clk, err:%d\n",
5764 __func__, ret);
5765
5766end:
5767 return ret;
5768}
5769
Aditya Bavanari353a5832018-11-22 15:10:32 +05305770static int msm_get_tdm_mode(u32 port_id)
5771{
5772 int tdm_mode;
5773
5774 switch (port_id) {
5775 case AFE_PORT_ID_PRIMARY_TDM_RX:
5776 case AFE_PORT_ID_PRIMARY_TDM_TX:
5777 tdm_mode = TDM_PRI;
5778 break;
5779 case AFE_PORT_ID_SECONDARY_TDM_RX:
5780 case AFE_PORT_ID_SECONDARY_TDM_TX:
5781 tdm_mode = TDM_SEC;
5782 break;
5783 case AFE_PORT_ID_TERTIARY_TDM_RX:
5784 case AFE_PORT_ID_TERTIARY_TDM_TX:
5785 tdm_mode = TDM_TERT;
5786 break;
5787 case AFE_PORT_ID_QUATERNARY_TDM_RX:
5788 case AFE_PORT_ID_QUATERNARY_TDM_TX:
5789 tdm_mode = TDM_QUAT;
5790 break;
5791 case AFE_PORT_ID_QUINARY_TDM_RX:
5792 case AFE_PORT_ID_QUINARY_TDM_TX:
5793 tdm_mode = TDM_QUIN;
5794 break;
5795 default:
5796 pr_err("%s: Invalid port id: %d\n", __func__, port_id);
5797 tdm_mode = -EINVAL;
5798 }
5799 return tdm_mode;
5800}
5801
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305802static int sm6150_tdm_snd_startup(struct snd_pcm_substream *substream)
5803{
5804 int ret = 0;
5805 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5806 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5807 struct snd_soc_card *card = rtd->card;
5808 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Aditya Bavanari353a5832018-11-22 15:10:32 +05305809 int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
5810
5811 if (tdm_mode < 0) {
5812 dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__);
5813 return tdm_mode;
5814 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305815
5816 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
Aditya Bavanari353a5832018-11-22 15:10:32 +05305817 if (pdata->mi2s_gpio_p[tdm_mode])
5818 ret = msm_cdc_pinctrl_select_active_state(
5819 pdata->mi2s_gpio_p[tdm_mode]);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305820
5821 return ret;
5822}
5823
5824static void sm6150_tdm_snd_shutdown(struct snd_pcm_substream *substream)
5825{
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305826 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5827 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5828 struct snd_soc_card *card = rtd->card;
5829 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Aditya Bavanari353a5832018-11-22 15:10:32 +05305830 int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
5831
5832 if (tdm_mode < 0) {
5833 dev_err(rtd->card->dev, "%s: Invalid tdm_mode\n", __func__);
5834 return;
5835 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305836
5837 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
Aditya Bavanari353a5832018-11-22 15:10:32 +05305838 if (pdata->mi2s_gpio_p[tdm_mode])
5839 msm_cdc_pinctrl_select_sleep_state(
5840 pdata->mi2s_gpio_p[tdm_mode]);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305841}
5842
5843static struct snd_soc_ops sm6150_tdm_be_ops = {
5844 .hw_params = sm6150_tdm_snd_hw_params,
5845 .startup = sm6150_tdm_snd_startup,
5846 .shutdown = sm6150_tdm_snd_shutdown
5847};
5848
5849static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
5850{
5851 cpumask_t mask;
5852
5853 if (pm_qos_request_active(&substream->latency_pm_qos_req))
5854 pm_qos_remove_request(&substream->latency_pm_qos_req);
5855
5856 cpumask_clear(&mask);
5857 cpumask_set_cpu(1, &mask); /* affine to core 1 */
5858 cpumask_set_cpu(2, &mask); /* affine to core 2 */
5859 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
5860
5861 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
5862
5863 pm_qos_add_request(&substream->latency_pm_qos_req,
5864 PM_QOS_CPU_DMA_LATENCY,
5865 MSM_LL_QOS_VALUE);
5866 return 0;
5867}
5868
5869static struct snd_soc_ops msm_fe_qos_ops = {
5870 .prepare = msm_fe_qos_prepare,
5871};
5872
5873static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
5874{
5875 int ret = 0;
5876 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5877 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
5878 int index = cpu_dai->id;
Aditya Bavanari353a5832018-11-22 15:10:32 +05305879 int port_id = msm_get_port_id(rtd->dai_link->id);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305880 unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
5881 struct snd_soc_card *card = rtd->card;
5882 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305883
5884 dev_dbg(rtd->card->dev,
5885 "%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
5886 __func__, substream->name, substream->stream,
5887 cpu_dai->name, cpu_dai->id);
5888
Aditya Bavanari353a5832018-11-22 15:10:32 +05305889 if (port_id < 0) {
5890 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
5891 ret = port_id;
5892 goto err;
5893 }
5894
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305895 if (index < PRIM_MI2S || index >= MI2S_MAX) {
5896 ret = -EINVAL;
5897 dev_err(rtd->card->dev,
5898 "%s: CPU DAI id (%d) out of range\n",
5899 __func__, cpu_dai->id);
5900 goto err;
5901 }
5902 /*
5903 * Mutex protection in case the same MI2S
5904 * interface using for both TX and RX so
5905 * that the same clock won't be enable twice.
5906 */
5907 mutex_lock(&mi2s_intf_conf[index].lock);
5908 if (++mi2s_intf_conf[index].ref_cnt == 1) {
5909 /* Check if msm needs to provide the clock to the interface */
5910 if (!mi2s_intf_conf[index].msm_is_mi2s_master) {
5911 mi2s_clk[index].clk_id = mi2s_ebit_clk[index];
5912 fmt = SND_SOC_DAIFMT_CBM_CFM;
5913 }
5914 ret = msm_mi2s_set_sclk(substream, true);
5915 if (ret < 0) {
5916 dev_err(rtd->card->dev,
5917 "%s: afe lpass clock failed to enable MI2S clock, err:%d\n",
5918 __func__, ret);
5919 goto clean_up;
5920 }
5921
5922 ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
5923 if (ret < 0) {
5924 pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n",
5925 __func__, index, ret);
5926 goto clk_off;
5927 }
Aditya Bavanari353a5832018-11-22 15:10:32 +05305928 if (mi2s_intf_conf[index].msm_is_ext_mclk) {
5929 pr_debug("%s: Enabling mclk, clk_freq_in_hz = %u\n",
5930 __func__, mi2s_mclk[index].clk_freq_in_hz);
Aditya Bavanarid92c7df2019-05-28 10:34:56 +05305931 mi2s_mclk[index].enable = 1;
Aditya Bavanari353a5832018-11-22 15:10:32 +05305932 ret = afe_set_lpass_clock_v2(port_id,
5933 &mi2s_mclk[index]);
5934 if (ret < 0) {
5935 pr_err("%s: afe lpass mclk failed, err:%d\n",
5936 __func__, ret);
5937 goto clk_off;
5938 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305939 }
Aditya Bavanari353a5832018-11-22 15:10:32 +05305940 if (pdata->mi2s_gpio_p[index])
5941 msm_cdc_pinctrl_select_active_state(
5942 pdata->mi2s_gpio_p[index]);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305943 }
5944clk_off:
5945 if (ret < 0)
5946 msm_mi2s_set_sclk(substream, false);
5947clean_up:
5948 if (ret < 0)
5949 mi2s_intf_conf[index].ref_cnt--;
5950 mutex_unlock(&mi2s_intf_conf[index].lock);
5951err:
5952 return ret;
5953}
5954
5955static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
5956{
5957 int ret;
5958 struct snd_soc_pcm_runtime *rtd = substream->private_data;
5959 int index = rtd->cpu_dai->id;
Aditya Bavanari353a5832018-11-22 15:10:32 +05305960 int port_id = msm_get_port_id(rtd->dai_link->id);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305961 struct snd_soc_card *card = rtd->card;
5962 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305963
5964 pr_debug("%s(): substream = %s stream = %d\n", __func__,
5965 substream->name, substream->stream);
Aditya Bavanari353a5832018-11-22 15:10:32 +05305966
5967 if (port_id < 0) {
5968 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
5969 return;
5970 }
5971
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305972 if (index < PRIM_MI2S || index >= MI2S_MAX) {
5973 pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index);
5974 return;
5975 }
5976
5977 mutex_lock(&mi2s_intf_conf[index].lock);
5978 if (--mi2s_intf_conf[index].ref_cnt == 0) {
Aditya Bavanari353a5832018-11-22 15:10:32 +05305979 if (pdata->mi2s_gpio_p[index])
5980 msm_cdc_pinctrl_select_sleep_state(
5981 pdata->mi2s_gpio_p[index]);
5982
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305983 ret = msm_mi2s_set_sclk(substream, false);
5984 if (ret < 0)
5985 pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
5986 __func__, index, ret);
Aditya Bavanari353a5832018-11-22 15:10:32 +05305987
5988 if (mi2s_intf_conf[index].msm_is_ext_mclk) {
5989 pr_debug("%s: Disabling mclk, clk_freq_in_hz = %u\n",
5990 __func__, mi2s_mclk[index].clk_freq_in_hz);
Aditya Bavanarid92c7df2019-05-28 10:34:56 +05305991 mi2s_mclk[index].enable = 0;
Aditya Bavanari353a5832018-11-22 15:10:32 +05305992 ret = afe_set_lpass_clock_v2(port_id,
5993 &mi2s_mclk[index]);
5994 if (ret < 0)
5995 pr_err("%s: mclk disable failed for MCLK (%d); ret=%d\n",
5996 __func__, index, ret);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05305997 }
5998 }
5999 mutex_unlock(&mi2s_intf_conf[index].lock);
6000}
6001
6002static struct snd_soc_ops msm_mi2s_be_ops = {
6003 .startup = msm_mi2s_snd_startup,
6004 .shutdown = msm_mi2s_snd_shutdown,
6005};
6006
6007static struct snd_soc_ops msm_cdc_dma_be_ops = {
6008 .hw_params = msm_snd_cdc_dma_hw_params,
6009};
6010
6011static struct snd_soc_ops msm_be_ops = {
6012 .hw_params = msm_snd_hw_params,
6013};
6014
6015static struct snd_soc_ops msm_slimbus_2_be_ops = {
6016 .hw_params = msm_slimbus_2_hw_params,
6017};
6018
6019static struct snd_soc_ops msm_wcn_ops = {
6020 .hw_params = msm_wcn_hw_params,
6021};
6022
Aditya Bavanari45e2e652019-01-11 20:18:55 +05306023static struct snd_soc_ops msm_ext_cpe_ops = {
6024 .hw_params = msm_snd_cpe_hw_params,
6025};
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306026
6027/* Digital audio interface glue - connects codec <---> CPU */
6028static struct snd_soc_dai_link msm_common_dai_links[] = {
6029 /* FrontEnd DAI Links */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306030 {/* hw:x,0 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306031 .name = MSM_DAILINK_NAME(Media1),
6032 .stream_name = "MultiMedia1",
6033 .cpu_dai_name = "MultiMedia1",
6034 .platform_name = "msm-pcm-dsp.0",
6035 .dynamic = 1,
6036 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6037 .dpcm_playback = 1,
6038 .dpcm_capture = 1,
6039 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6040 SND_SOC_DPCM_TRIGGER_POST},
6041 .codec_dai_name = "snd-soc-dummy-dai",
6042 .codec_name = "snd-soc-dummy",
6043 .ignore_suspend = 1,
6044 /* this dainlink has playback support */
6045 .ignore_pmdown_time = 1,
6046 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
6047 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306048 {/* hw:x,1 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306049 .name = MSM_DAILINK_NAME(Media2),
6050 .stream_name = "MultiMedia2",
6051 .cpu_dai_name = "MultiMedia2",
6052 .platform_name = "msm-pcm-dsp.0",
6053 .dynamic = 1,
6054 .dpcm_playback = 1,
6055 .dpcm_capture = 1,
6056 .codec_dai_name = "snd-soc-dummy-dai",
6057 .codec_name = "snd-soc-dummy",
6058 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6059 SND_SOC_DPCM_TRIGGER_POST},
6060 .ignore_suspend = 1,
6061 /* this dainlink has playback support */
6062 .ignore_pmdown_time = 1,
6063 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
6064 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306065 {/* hw:x,2 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306066 .name = "VoiceMMode1",
6067 .stream_name = "VoiceMMode1",
6068 .cpu_dai_name = "VoiceMMode1",
6069 .platform_name = "msm-pcm-voice",
6070 .dynamic = 1,
6071 .dpcm_playback = 1,
6072 .dpcm_capture = 1,
6073 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6074 SND_SOC_DPCM_TRIGGER_POST},
6075 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6076 .ignore_suspend = 1,
6077 .ignore_pmdown_time = 1,
6078 .codec_dai_name = "snd-soc-dummy-dai",
6079 .codec_name = "snd-soc-dummy",
6080 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
6081 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306082 {/* hw:x,3 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306083 .name = "MSM VoIP",
6084 .stream_name = "VoIP",
6085 .cpu_dai_name = "VoIP",
6086 .platform_name = "msm-voip-dsp",
6087 .dynamic = 1,
6088 .dpcm_playback = 1,
6089 .dpcm_capture = 1,
6090 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6091 SND_SOC_DPCM_TRIGGER_POST},
6092 .codec_dai_name = "snd-soc-dummy-dai",
6093 .codec_name = "snd-soc-dummy",
6094 .ignore_suspend = 1,
6095 /* this dainlink has playback support */
6096 .ignore_pmdown_time = 1,
6097 .id = MSM_FRONTEND_DAI_VOIP,
6098 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306099 {/* hw:x,4 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306100 .name = MSM_DAILINK_NAME(ULL),
6101 .stream_name = "MultiMedia3",
6102 .cpu_dai_name = "MultiMedia3",
6103 .platform_name = "msm-pcm-dsp.2",
6104 .dynamic = 1,
6105 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6106 .dpcm_playback = 1,
6107 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6108 SND_SOC_DPCM_TRIGGER_POST},
6109 .codec_dai_name = "snd-soc-dummy-dai",
6110 .codec_name = "snd-soc-dummy",
6111 .ignore_suspend = 1,
6112 /* this dainlink has playback support */
6113 .ignore_pmdown_time = 1,
6114 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
6115 },
6116 /* Hostless PCM purpose */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306117 {/* hw:x,5 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306118 .name = "SLIMBUS_0 Hostless",
6119 .stream_name = "SLIMBUS_0 Hostless",
6120 .cpu_dai_name = "SLIMBUS0_HOSTLESS",
6121 .platform_name = "msm-pcm-hostless",
6122 .dynamic = 1,
6123 .dpcm_playback = 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 /* this dailink has playback support */
6130 .ignore_pmdown_time = 1,
6131 .codec_dai_name = "snd-soc-dummy-dai",
6132 .codec_name = "snd-soc-dummy",
6133 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306134 {/* hw:x,6 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306135 .name = "MSM AFE-PCM RX",
6136 .stream_name = "AFE-PROXY RX",
6137 .cpu_dai_name = "msm-dai-q6-dev.241",
6138 .codec_name = "msm-stub-codec.1",
6139 .codec_dai_name = "msm-stub-rx",
6140 .platform_name = "msm-pcm-afe",
6141 .dpcm_playback = 1,
6142 .ignore_suspend = 1,
6143 /* this dainlink has playback support */
6144 .ignore_pmdown_time = 1,
6145 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306146 {/* hw:x,7 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306147 .name = "MSM AFE-PCM TX",
6148 .stream_name = "AFE-PROXY TX",
6149 .cpu_dai_name = "msm-dai-q6-dev.240",
6150 .codec_name = "msm-stub-codec.1",
6151 .codec_dai_name = "msm-stub-tx",
6152 .platform_name = "msm-pcm-afe",
6153 .dpcm_capture = 1,
6154 .ignore_suspend = 1,
6155 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306156 {/* hw:x,8 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306157 .name = MSM_DAILINK_NAME(Compress1),
6158 .stream_name = "Compress1",
6159 .cpu_dai_name = "MultiMedia4",
6160 .platform_name = "msm-compress-dsp",
6161 .dynamic = 1,
6162 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
6163 .dpcm_playback = 1,
6164 .dpcm_capture = 1,
6165 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6166 SND_SOC_DPCM_TRIGGER_POST},
6167 .codec_dai_name = "snd-soc-dummy-dai",
6168 .codec_name = "snd-soc-dummy",
6169 .ignore_suspend = 1,
6170 .ignore_pmdown_time = 1,
6171 /* this dainlink has playback support */
6172 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
6173 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306174 {/* hw:x,9 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306175 .name = "AUXPCM Hostless",
6176 .stream_name = "AUXPCM Hostless",
6177 .cpu_dai_name = "AUXPCM_HOSTLESS",
6178 .platform_name = "msm-pcm-hostless",
6179 .dynamic = 1,
6180 .dpcm_playback = 1,
6181 .dpcm_capture = 1,
6182 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6183 SND_SOC_DPCM_TRIGGER_POST},
6184 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6185 .ignore_suspend = 1,
6186 /* this dainlink has playback support */
6187 .ignore_pmdown_time = 1,
6188 .codec_dai_name = "snd-soc-dummy-dai",
6189 .codec_name = "snd-soc-dummy",
6190 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306191 {/* hw:x,10 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306192 .name = "SLIMBUS_1 Hostless",
6193 .stream_name = "SLIMBUS_1 Hostless",
6194 .cpu_dai_name = "SLIMBUS1_HOSTLESS",
6195 .platform_name = "msm-pcm-hostless",
6196 .dynamic = 1,
6197 .dpcm_playback = 1,
6198 .dpcm_capture = 1,
6199 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6200 SND_SOC_DPCM_TRIGGER_POST},
6201 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6202 .ignore_suspend = 1,
6203 /* this dailink has playback support */
6204 .ignore_pmdown_time = 1,
6205 .codec_dai_name = "snd-soc-dummy-dai",
6206 .codec_name = "snd-soc-dummy",
6207 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306208 {/* hw:x,11 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306209 .name = "SLIMBUS_3 Hostless",
6210 .stream_name = "SLIMBUS_3 Hostless",
6211 .cpu_dai_name = "SLIMBUS3_HOSTLESS",
6212 .platform_name = "msm-pcm-hostless",
6213 .dynamic = 1,
6214 .dpcm_playback = 1,
6215 .dpcm_capture = 1,
6216 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6217 SND_SOC_DPCM_TRIGGER_POST},
6218 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6219 .ignore_suspend = 1,
6220 /* this dailink has playback support */
6221 .ignore_pmdown_time = 1,
6222 .codec_dai_name = "snd-soc-dummy-dai",
6223 .codec_name = "snd-soc-dummy",
6224 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306225 {/* hw:x,12 */
6226 .name = "SLIMBUS_7 Hostless",
6227 .stream_name = "SLIMBUS_7 Hostless",
6228 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306229 .platform_name = "msm-pcm-hostless",
6230 .dynamic = 1,
6231 .dpcm_playback = 1,
6232 .dpcm_capture = 1,
6233 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6234 SND_SOC_DPCM_TRIGGER_POST},
6235 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6236 .ignore_suspend = 1,
6237 /* this dailink has playback support */
6238 .ignore_pmdown_time = 1,
6239 .codec_dai_name = "snd-soc-dummy-dai",
6240 .codec_name = "snd-soc-dummy",
6241 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306242 {/* hw:x,13 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306243 .name = MSM_DAILINK_NAME(LowLatency),
6244 .stream_name = "MultiMedia5",
6245 .cpu_dai_name = "MultiMedia5",
6246 .platform_name = "msm-pcm-dsp.1",
6247 .dynamic = 1,
6248 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6249 .dpcm_playback = 1,
6250 .dpcm_capture = 1,
6251 .codec_dai_name = "snd-soc-dummy-dai",
6252 .codec_name = "snd-soc-dummy",
6253 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6254 SND_SOC_DPCM_TRIGGER_POST},
6255 .ignore_suspend = 1,
6256 /* this dainlink has playback support */
6257 .ignore_pmdown_time = 1,
6258 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
6259 .ops = &msm_fe_qos_ops,
6260 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306261 {/* hw:x,14 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306262 .name = "Listen 1 Audio Service",
6263 .stream_name = "Listen 1 Audio Service",
6264 .cpu_dai_name = "LSM1",
6265 .platform_name = "msm-lsm-client",
6266 .dynamic = 1,
6267 .dpcm_capture = 1,
6268 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6269 SND_SOC_DPCM_TRIGGER_POST },
6270 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6271 .ignore_suspend = 1,
6272 .codec_dai_name = "snd-soc-dummy-dai",
6273 .codec_name = "snd-soc-dummy",
6274 .id = MSM_FRONTEND_DAI_LSM1,
6275 },
6276 /* Multiple Tunnel instances */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306277 {/* hw:x,15 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306278 .name = MSM_DAILINK_NAME(Compress2),
6279 .stream_name = "Compress2",
6280 .cpu_dai_name = "MultiMedia7",
6281 .platform_name = "msm-compress-dsp",
6282 .dynamic = 1,
6283 .dpcm_playback = 1,
6284 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6285 SND_SOC_DPCM_TRIGGER_POST},
6286 .codec_dai_name = "snd-soc-dummy-dai",
6287 .codec_name = "snd-soc-dummy",
6288 .ignore_suspend = 1,
6289 .ignore_pmdown_time = 1,
6290 /* this dainlink has playback support */
6291 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
6292 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306293 {/* hw:x,16 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306294 .name = MSM_DAILINK_NAME(MultiMedia10),
6295 .stream_name = "MultiMedia10",
6296 .cpu_dai_name = "MultiMedia10",
6297 .platform_name = "msm-pcm-dsp.1",
6298 .dynamic = 1,
6299 .dpcm_playback = 1,
6300 .dpcm_capture = 1,
6301 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6302 SND_SOC_DPCM_TRIGGER_POST},
6303 .codec_dai_name = "snd-soc-dummy-dai",
6304 .codec_name = "snd-soc-dummy",
6305 .ignore_suspend = 1,
6306 .ignore_pmdown_time = 1,
6307 /* this dainlink has playback support */
6308 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
6309 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306310 {/* hw:x,17 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306311 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
6312 .stream_name = "MM_NOIRQ",
6313 .cpu_dai_name = "MultiMedia8",
6314 .platform_name = "msm-pcm-dsp-noirq",
6315 .dynamic = 1,
6316 .dpcm_playback = 1,
6317 .dpcm_capture = 1,
6318 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6319 SND_SOC_DPCM_TRIGGER_POST},
6320 .codec_dai_name = "snd-soc-dummy-dai",
6321 .codec_name = "snd-soc-dummy",
6322 .ignore_suspend = 1,
6323 .ignore_pmdown_time = 1,
6324 /* this dainlink has playback support */
6325 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
6326 .ops = &msm_fe_qos_ops,
6327 },
6328 /* HDMI Hostless */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306329 {/* hw:x,18 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306330 .name = "HDMI_RX_HOSTLESS",
6331 .stream_name = "HDMI_RX_HOSTLESS",
6332 .cpu_dai_name = "HDMI_HOSTLESS",
6333 .platform_name = "msm-pcm-hostless",
6334 .dynamic = 1,
6335 .dpcm_playback = 1,
6336 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6337 SND_SOC_DPCM_TRIGGER_POST},
6338 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6339 .ignore_suspend = 1,
6340 .ignore_pmdown_time = 1,
6341 .codec_dai_name = "snd-soc-dummy-dai",
6342 .codec_name = "snd-soc-dummy",
6343 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306344 {/* hw:x,19 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306345 .name = "VoiceMMode2",
6346 .stream_name = "VoiceMMode2",
6347 .cpu_dai_name = "VoiceMMode2",
6348 .platform_name = "msm-pcm-voice",
6349 .dynamic = 1,
6350 .dpcm_playback = 1,
6351 .dpcm_capture = 1,
6352 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6353 SND_SOC_DPCM_TRIGGER_POST},
6354 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6355 .ignore_suspend = 1,
6356 .ignore_pmdown_time = 1,
6357 .codec_dai_name = "snd-soc-dummy-dai",
6358 .codec_name = "snd-soc-dummy",
6359 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
6360 },
6361 /* LSM FE */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306362 {/* hw:x,20 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306363 .name = "Listen 2 Audio Service",
6364 .stream_name = "Listen 2 Audio Service",
6365 .cpu_dai_name = "LSM2",
6366 .platform_name = "msm-lsm-client",
6367 .dynamic = 1,
6368 .dpcm_capture = 1,
6369 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6370 SND_SOC_DPCM_TRIGGER_POST },
6371 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6372 .ignore_suspend = 1,
6373 .codec_dai_name = "snd-soc-dummy-dai",
6374 .codec_name = "snd-soc-dummy",
6375 .id = MSM_FRONTEND_DAI_LSM2,
6376 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306377 {/* hw:x,21 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306378 .name = "Listen 3 Audio Service",
6379 .stream_name = "Listen 3 Audio Service",
6380 .cpu_dai_name = "LSM3",
6381 .platform_name = "msm-lsm-client",
6382 .dynamic = 1,
6383 .dpcm_capture = 1,
6384 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6385 SND_SOC_DPCM_TRIGGER_POST },
6386 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6387 .ignore_suspend = 1,
6388 .codec_dai_name = "snd-soc-dummy-dai",
6389 .codec_name = "snd-soc-dummy",
6390 .id = MSM_FRONTEND_DAI_LSM3,
6391 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306392 {/* hw:x,22 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306393 .name = "Listen 4 Audio Service",
6394 .stream_name = "Listen 4 Audio Service",
6395 .cpu_dai_name = "LSM4",
6396 .platform_name = "msm-lsm-client",
6397 .dynamic = 1,
6398 .dpcm_capture = 1,
6399 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6400 SND_SOC_DPCM_TRIGGER_POST },
6401 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6402 .ignore_suspend = 1,
6403 .codec_dai_name = "snd-soc-dummy-dai",
6404 .codec_name = "snd-soc-dummy",
6405 .id = MSM_FRONTEND_DAI_LSM4,
6406 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306407 {/* hw:x,23 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306408 .name = "Listen 5 Audio Service",
6409 .stream_name = "Listen 5 Audio Service",
6410 .cpu_dai_name = "LSM5",
6411 .platform_name = "msm-lsm-client",
6412 .dynamic = 1,
6413 .dpcm_capture = 1,
6414 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6415 SND_SOC_DPCM_TRIGGER_POST },
6416 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6417 .ignore_suspend = 1,
6418 .codec_dai_name = "snd-soc-dummy-dai",
6419 .codec_name = "snd-soc-dummy",
6420 .id = MSM_FRONTEND_DAI_LSM5,
6421 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306422 {/* hw:x,24 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306423 .name = "Listen 6 Audio Service",
6424 .stream_name = "Listen 6 Audio Service",
6425 .cpu_dai_name = "LSM6",
6426 .platform_name = "msm-lsm-client",
6427 .dynamic = 1,
6428 .dpcm_capture = 1,
6429 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6430 SND_SOC_DPCM_TRIGGER_POST },
6431 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6432 .ignore_suspend = 1,
6433 .codec_dai_name = "snd-soc-dummy-dai",
6434 .codec_name = "snd-soc-dummy",
6435 .id = MSM_FRONTEND_DAI_LSM6,
6436 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306437 {/* hw:x,25 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306438 .name = "Listen 7 Audio Service",
6439 .stream_name = "Listen 7 Audio Service",
6440 .cpu_dai_name = "LSM7",
6441 .platform_name = "msm-lsm-client",
6442 .dynamic = 1,
6443 .dpcm_capture = 1,
6444 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6445 SND_SOC_DPCM_TRIGGER_POST },
6446 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6447 .ignore_suspend = 1,
6448 .codec_dai_name = "snd-soc-dummy-dai",
6449 .codec_name = "snd-soc-dummy",
6450 .id = MSM_FRONTEND_DAI_LSM7,
6451 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306452 {/* hw:x,26 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306453 .name = "Listen 8 Audio Service",
6454 .stream_name = "Listen 8 Audio Service",
6455 .cpu_dai_name = "LSM8",
6456 .platform_name = "msm-lsm-client",
6457 .dynamic = 1,
6458 .dpcm_capture = 1,
6459 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
6460 SND_SOC_DPCM_TRIGGER_POST },
6461 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6462 .ignore_suspend = 1,
6463 .codec_dai_name = "snd-soc-dummy-dai",
6464 .codec_name = "snd-soc-dummy",
6465 .id = MSM_FRONTEND_DAI_LSM8,
6466 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306467 {/* hw:x,27 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306468 .name = MSM_DAILINK_NAME(Media9),
6469 .stream_name = "MultiMedia9",
6470 .cpu_dai_name = "MultiMedia9",
6471 .platform_name = "msm-pcm-dsp.0",
6472 .dynamic = 1,
6473 .dpcm_playback = 1,
6474 .dpcm_capture = 1,
6475 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6476 SND_SOC_DPCM_TRIGGER_POST},
6477 .codec_dai_name = "snd-soc-dummy-dai",
6478 .codec_name = "snd-soc-dummy",
6479 .ignore_suspend = 1,
6480 /* this dainlink has playback support */
6481 .ignore_pmdown_time = 1,
6482 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
6483 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306484 {/* hw:x,28 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306485 .name = MSM_DAILINK_NAME(Compress4),
6486 .stream_name = "Compress4",
6487 .cpu_dai_name = "MultiMedia11",
6488 .platform_name = "msm-compress-dsp",
6489 .dynamic = 1,
6490 .dpcm_playback = 1,
6491 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6492 SND_SOC_DPCM_TRIGGER_POST},
6493 .codec_dai_name = "snd-soc-dummy-dai",
6494 .codec_name = "snd-soc-dummy",
6495 .ignore_suspend = 1,
6496 .ignore_pmdown_time = 1,
6497 /* this dainlink has playback support */
6498 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
6499 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306500 {/* hw:x,29 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306501 .name = MSM_DAILINK_NAME(Compress5),
6502 .stream_name = "Compress5",
6503 .cpu_dai_name = "MultiMedia12",
6504 .platform_name = "msm-compress-dsp",
6505 .dynamic = 1,
6506 .dpcm_playback = 1,
6507 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6508 SND_SOC_DPCM_TRIGGER_POST},
6509 .codec_dai_name = "snd-soc-dummy-dai",
6510 .codec_name = "snd-soc-dummy",
6511 .ignore_suspend = 1,
6512 .ignore_pmdown_time = 1,
6513 /* this dainlink has playback support */
6514 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
6515 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306516 {/* hw:x,30 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306517 .name = MSM_DAILINK_NAME(Compress6),
6518 .stream_name = "Compress6",
6519 .cpu_dai_name = "MultiMedia13",
6520 .platform_name = "msm-compress-dsp",
6521 .dynamic = 1,
6522 .dpcm_playback = 1,
6523 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6524 SND_SOC_DPCM_TRIGGER_POST},
6525 .codec_dai_name = "snd-soc-dummy-dai",
6526 .codec_name = "snd-soc-dummy",
6527 .ignore_suspend = 1,
6528 .ignore_pmdown_time = 1,
6529 /* this dainlink has playback support */
6530 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
6531 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306532 {/* hw:x,31 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306533 .name = MSM_DAILINK_NAME(Compress7),
6534 .stream_name = "Compress7",
6535 .cpu_dai_name = "MultiMedia14",
6536 .platform_name = "msm-compress-dsp",
6537 .dynamic = 1,
6538 .dpcm_playback = 1,
6539 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6540 SND_SOC_DPCM_TRIGGER_POST},
6541 .codec_dai_name = "snd-soc-dummy-dai",
6542 .codec_name = "snd-soc-dummy",
6543 .ignore_suspend = 1,
6544 .ignore_pmdown_time = 1,
6545 /* this dainlink has playback support */
6546 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
6547 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306548 {/* hw:x,32 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306549 .name = MSM_DAILINK_NAME(Compress8),
6550 .stream_name = "Compress8",
6551 .cpu_dai_name = "MultiMedia15",
6552 .platform_name = "msm-compress-dsp",
6553 .dynamic = 1,
6554 .dpcm_playback = 1,
6555 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6556 SND_SOC_DPCM_TRIGGER_POST},
6557 .codec_dai_name = "snd-soc-dummy-dai",
6558 .codec_name = "snd-soc-dummy",
6559 .ignore_suspend = 1,
6560 .ignore_pmdown_time = 1,
6561 /* this dainlink has playback support */
6562 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
6563 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306564 {/* hw:x,33 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306565 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
6566 .stream_name = "MM_NOIRQ_2",
6567 .cpu_dai_name = "MultiMedia16",
6568 .platform_name = "msm-pcm-dsp-noirq",
6569 .dynamic = 1,
6570 .dpcm_playback = 1,
6571 .dpcm_capture = 1,
6572 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6573 SND_SOC_DPCM_TRIGGER_POST},
6574 .codec_dai_name = "snd-soc-dummy-dai",
6575 .codec_name = "snd-soc-dummy",
6576 .ignore_suspend = 1,
6577 .ignore_pmdown_time = 1,
6578 /* this dainlink has playback support */
6579 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
6580 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306581 {/* hw:x,34 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306582 .name = "SLIMBUS_8 Hostless",
6583 .stream_name = "SLIMBUS8_HOSTLESS Capture",
6584 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
6585 .platform_name = "msm-pcm-hostless",
6586 .dynamic = 1,
6587 .dpcm_capture = 1,
6588 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6589 SND_SOC_DPCM_TRIGGER_POST},
6590 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6591 .ignore_suspend = 1,
6592 .codec_dai_name = "snd-soc-dummy-dai",
6593 .codec_name = "snd-soc-dummy",
6594 },
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306595 {/* hw:x,35 */
6596 .name = "CDC_DMA Hostless",
6597 .stream_name = "CDC_DMA Hostless",
6598 .cpu_dai_name = "CDC_DMA_HOSTLESS",
6599 .platform_name = "msm-pcm-hostless",
6600 .dynamic = 1,
6601 .dpcm_playback = 1,
6602 .dpcm_capture = 1,
6603 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6604 SND_SOC_DPCM_TRIGGER_POST},
6605 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6606 .ignore_suspend = 1,
6607 /* this dailink has playback support */
6608 .ignore_pmdown_time = 1,
6609 .codec_dai_name = "snd-soc-dummy-dai",
6610 .codec_name = "snd-soc-dummy",
6611 },
6612 {/* hw:x,36 */
6613 .name = "TX3_CDC_DMA Hostless",
6614 .stream_name = "TX3_CDC_DMA Hostless",
6615 .cpu_dai_name = "TX3_CDC_DMA_HOSTLESS",
6616 .platform_name = "msm-pcm-hostless",
6617 .dynamic = 1,
6618 .dpcm_capture = 1,
6619 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6620 SND_SOC_DPCM_TRIGGER_POST},
6621 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6622 .ignore_suspend = 1,
6623 .codec_dai_name = "snd-soc-dummy-dai",
6624 .codec_name = "snd-soc-dummy",
6625 },
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306626};
6627
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306628static struct snd_soc_dai_link msm_tavil_fe_dai_links[] = {
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306629 {/* hw:x,37 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306630 .name = LPASS_BE_SLIMBUS_4_TX,
6631 .stream_name = "Slimbus4 Capture",
6632 .cpu_dai_name = "msm-dai-q6-dev.16393",
6633 .platform_name = "msm-pcm-hostless",
6634 .codec_name = "tavil_codec",
6635 .codec_dai_name = "tavil_vifeedback",
6636 .id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
6637 .be_hw_params_fixup = msm_be_hw_params_fixup,
6638 .ops = &msm_be_ops,
6639 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6640 .ignore_suspend = 1,
6641 },
6642 /* Ultrasound RX DAI Link */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306643 {/* hw:x,38 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306644 .name = "SLIMBUS_2 Hostless Playback",
6645 .stream_name = "SLIMBUS_2 Hostless Playback",
6646 .cpu_dai_name = "msm-dai-q6-dev.16388",
6647 .platform_name = "msm-pcm-hostless",
6648 .codec_name = "tavil_codec",
6649 .codec_dai_name = "tavil_rx2",
6650 .ignore_suspend = 1,
6651 .ignore_pmdown_time = 1,
6652 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6653 .ops = &msm_slimbus_2_be_ops,
6654 },
6655 /* Ultrasound TX DAI Link */
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306656 {/* hw:x,39 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306657 .name = "SLIMBUS_2 Hostless Capture",
6658 .stream_name = "SLIMBUS_2 Hostless Capture",
6659 .cpu_dai_name = "msm-dai-q6-dev.16389",
6660 .platform_name = "msm-pcm-hostless",
6661 .codec_name = "tavil_codec",
6662 .codec_dai_name = "tavil_tx2",
6663 .ignore_suspend = 1,
6664 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6665 .ops = &msm_slimbus_2_be_ops,
6666 },
6667};
6668
Md Mansoor Ahmedfc755592018-11-29 11:50:59 +05306669static struct snd_soc_dai_link msm_int_compress_capture_dai[] = {
6670 {
6671 .name = "Compress9",
6672 .stream_name = "Compress9",
6673 .cpu_dai_name = "MultiMedia17",
6674 .platform_name = "msm-compress-dsp",
6675 .dynamic = 1,
6676 .dpcm_capture = 1,
6677 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6678 SND_SOC_DPCM_TRIGGER_POST},
6679 .codec_dai_name = "snd-soc-dummy-dai",
6680 .codec_name = "snd-soc-dummy",
6681 .ignore_suspend = 1,
6682 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
6683 },
6684 {
6685 .name = "Compress10",
6686 .stream_name = "Compress10",
6687 .cpu_dai_name = "MultiMedia18",
6688 .platform_name = "msm-compress-dsp",
6689 .dynamic = 1,
6690 .dpcm_capture = 1,
6691 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6692 SND_SOC_DPCM_TRIGGER_POST},
6693 .codec_dai_name = "snd-soc-dummy-dai",
6694 .codec_name = "snd-soc-dummy",
6695 .ignore_suspend = 1,
6696 .id = MSM_FRONTEND_DAI_MULTIMEDIA18,
6697 },
6698 {
6699 .name = "Compress11",
6700 .stream_name = "Compress11",
6701 .cpu_dai_name = "MultiMedia19",
6702 .platform_name = "msm-compress-dsp",
6703 .dynamic = 1,
6704 .dpcm_capture = 1,
6705 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6706 SND_SOC_DPCM_TRIGGER_POST},
6707 .codec_dai_name = "snd-soc-dummy-dai",
6708 .codec_name = "snd-soc-dummy",
6709 .ignore_suspend = 1,
6710 .id = MSM_FRONTEND_DAI_MULTIMEDIA19,
6711 },
6712 {
6713 .name = "Compress12",
6714 .stream_name = "Compress12",
6715 .cpu_dai_name = "MultiMedia28",
6716 .platform_name = "msm-compress-dsp",
6717 .dynamic = 1,
6718 .dpcm_capture = 1,
6719 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6720 SND_SOC_DPCM_TRIGGER_POST},
6721 .codec_dai_name = "snd-soc-dummy-dai",
6722 .codec_name = "snd-soc-dummy",
6723 .ignore_suspend = 1,
6724 .id = MSM_FRONTEND_DAI_MULTIMEDIA28,
6725 },
6726 {
6727 .name = "Compress13",
6728 .stream_name = "Compress13",
6729 .cpu_dai_name = "MultiMedia29",
6730 .platform_name = "msm-compress-dsp",
6731 .dynamic = 1,
6732 .dpcm_capture = 1,
6733 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6734 SND_SOC_DPCM_TRIGGER_POST},
6735 .codec_dai_name = "snd-soc-dummy-dai",
6736 .codec_name = "snd-soc-dummy",
6737 .ignore_suspend = 1,
6738 .id = MSM_FRONTEND_DAI_MULTIMEDIA29,
6739 },
6740};
6741
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306742static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = {
Aditya Bavanaric65c7e42018-08-08 14:10:20 +05306743 {/* hw:x,37 */
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306744 .name = LPASS_BE_WSA_CDC_DMA_TX_0,
6745 .stream_name = "WSA CDC DMA0 Capture",
6746 .cpu_dai_name = "msm-dai-cdc-dma-dev.45057",
6747 .platform_name = "msm-pcm-hostless",
6748 .codec_name = "bolero_codec",
6749 .codec_dai_name = "wsa_macro_vifeedback",
6750 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
6751 .be_hw_params_fixup = msm_be_hw_params_fixup,
6752 .ignore_suspend = 1,
6753 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6754 .ops = &msm_cdc_dma_be_ops,
6755 },
6756};
6757
Aditya Bavanari45e2e652019-01-11 20:18:55 +05306758static struct snd_soc_dai_link msm_tasha_fe_dai_links[] = {
6759 /* tasha_vifeedback for speaker protection */
6760 {
6761 .name = LPASS_BE_SLIMBUS_4_TX,
6762 .stream_name = "Slimbus4 Capture",
6763 .cpu_dai_name = "msm-dai-q6-dev.16393",
6764 .platform_name = "msm-pcm-hostless",
6765 .codec_name = "tasha_codec",
6766 .codec_dai_name = "tasha_vifeedback",
6767 .id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
6768 .be_hw_params_fixup = msm_be_hw_params_fixup,
6769 .ops = &msm_be_ops,
6770 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6771 .ignore_suspend = 1,
6772 },
6773 /* Ultrasound RX DAI Link */
6774 {
6775 .name = "SLIMBUS_2 Hostless Playback",
6776 .stream_name = "SLIMBUS_2 Hostless Playback",
6777 .cpu_dai_name = "msm-dai-q6-dev.16388",
6778 .platform_name = "msm-pcm-hostless",
6779 .codec_name = "tasha_codec",
6780 .codec_dai_name = "tasha_rx2",
6781 .ignore_suspend = 1,
6782 .dpcm_playback = 1,
6783 .dpcm_capture = 1,
6784 .ignore_pmdown_time = 1,
6785 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6786 .ops = &msm_slimbus_2_be_ops,
6787 },
6788 /* Ultrasound TX DAI Link */
6789 {
6790 .name = "SLIMBUS_2 Hostless Capture",
6791 .stream_name = "SLIMBUS_2 Hostless Capture",
6792 .cpu_dai_name = "msm-dai-q6-dev.16389",
6793 .platform_name = "msm-pcm-hostless",
6794 .codec_name = "tasha_codec",
6795 .codec_dai_name = "tasha_tx2",
6796 .ignore_suspend = 1,
6797 .dpcm_capture = 1,
6798 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6799 .ops = &msm_slimbus_2_be_ops,
6800 },
6801 /* CPE LSM direct dai-link */
6802 {
6803 .name = "CPE Listen service",
6804 .stream_name = "CPE Listen Audio Service",
6805 .cpu_dai_name = "msm-dai-slim",
6806 .platform_name = "msm-cpe-lsm",
6807 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6808 SND_SOC_DPCM_TRIGGER_POST},
6809 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6810 .ignore_suspend = 1,
6811 .dpcm_capture = 1,
6812 .codec_dai_name = "tasha_mad1",
6813 .codec_name = "tasha_codec",
6814 .ops = &msm_ext_cpe_ops,
6815 },
6816 {
6817 .name = "SLIMBUS_6 Hostless Playback",
6818 .stream_name = "SLIMBUS_6 Hostless",
6819 .cpu_dai_name = "SLIMBUS6_HOSTLESS",
6820 .platform_name = "msm-pcm-hostless",
6821 .dynamic = 1,
6822 .dpcm_playback = 1,
6823 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6824 SND_SOC_DPCM_TRIGGER_POST},
6825 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6826 .ignore_suspend = 1,
6827 /* this dailink has playback support */
6828 .ignore_pmdown_time = 1,
6829 .codec_dai_name = "snd-soc-dummy-dai",
6830 .codec_name = "snd-soc-dummy",
6831 },
6832 /* CPE LSM EC PP direct dai-link */
6833 {
6834 .name = "CPE Listen service ECPP",
6835 .stream_name = "CPE Listen Audio Service ECPP",
6836 .cpu_dai_name = "CPE_LSM_NOHOST",
6837 .platform_name = "msm-cpe-lsm.3",
6838 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6839 SND_SOC_DPCM_TRIGGER_POST},
6840 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6841 .ignore_suspend = 1,
6842 .ignore_pmdown_time = 1,
6843 .codec_dai_name = "tasha_cpe",
6844 .codec_name = "tasha_codec",
6845 },
6846};
6847
Aditya Bavanari44eb8952018-05-09 19:01:50 +05306848static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
6849 {
6850 .name = MSM_DAILINK_NAME(ASM Loopback),
6851 .stream_name = "MultiMedia6",
6852 .cpu_dai_name = "MultiMedia6",
6853 .platform_name = "msm-pcm-loopback",
6854 .dynamic = 1,
6855 .dpcm_playback = 1,
6856 .dpcm_capture = 1,
6857 .codec_dai_name = "snd-soc-dummy-dai",
6858 .codec_name = "snd-soc-dummy",
6859 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6860 SND_SOC_DPCM_TRIGGER_POST},
6861 .ignore_suspend = 1,
6862 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6863 .ignore_pmdown_time = 1,
6864 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
6865 },
6866 {
6867 .name = "USB Audio Hostless",
6868 .stream_name = "USB Audio Hostless",
6869 .cpu_dai_name = "USBAUDIO_HOSTLESS",
6870 .platform_name = "msm-pcm-hostless",
6871 .dynamic = 1,
6872 .dpcm_playback = 1,
6873 .dpcm_capture = 1,
6874 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6875 SND_SOC_DPCM_TRIGGER_POST},
6876 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
6877 .ignore_suspend = 1,
6878 .ignore_pmdown_time = 1,
6879 .codec_dai_name = "snd-soc-dummy-dai",
6880 .codec_name = "snd-soc-dummy",
6881 },
6882};
6883
6884static struct snd_soc_dai_link msm_common_be_dai_links[] = {
6885 /* Backend AFE DAI Links */
6886 {
6887 .name = LPASS_BE_AFE_PCM_RX,
6888 .stream_name = "AFE Playback",
6889 .cpu_dai_name = "msm-dai-q6-dev.224",
6890 .platform_name = "msm-pcm-routing",
6891 .codec_name = "msm-stub-codec.1",
6892 .codec_dai_name = "msm-stub-rx",
6893 .no_pcm = 1,
6894 .dpcm_playback = 1,
6895 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
6896 .be_hw_params_fixup = msm_be_hw_params_fixup,
6897 /* this dainlink has playback support */
6898 .ignore_pmdown_time = 1,
6899 .ignore_suspend = 1,
6900 },
6901 {
6902 .name = LPASS_BE_AFE_PCM_TX,
6903 .stream_name = "AFE Capture",
6904 .cpu_dai_name = "msm-dai-q6-dev.225",
6905 .platform_name = "msm-pcm-routing",
6906 .codec_name = "msm-stub-codec.1",
6907 .codec_dai_name = "msm-stub-tx",
6908 .no_pcm = 1,
6909 .dpcm_capture = 1,
6910 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
6911 .be_hw_params_fixup = msm_be_hw_params_fixup,
6912 .ignore_suspend = 1,
6913 },
6914 /* Incall Record Uplink BACK END DAI Link */
6915 {
6916 .name = LPASS_BE_INCALL_RECORD_TX,
6917 .stream_name = "Voice Uplink Capture",
6918 .cpu_dai_name = "msm-dai-q6-dev.32772",
6919 .platform_name = "msm-pcm-routing",
6920 .codec_name = "msm-stub-codec.1",
6921 .codec_dai_name = "msm-stub-tx",
6922 .no_pcm = 1,
6923 .dpcm_capture = 1,
6924 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
6925 .be_hw_params_fixup = msm_be_hw_params_fixup,
6926 .ignore_suspend = 1,
6927 },
6928 /* Incall Record Downlink BACK END DAI Link */
6929 {
6930 .name = LPASS_BE_INCALL_RECORD_RX,
6931 .stream_name = "Voice Downlink Capture",
6932 .cpu_dai_name = "msm-dai-q6-dev.32771",
6933 .platform_name = "msm-pcm-routing",
6934 .codec_name = "msm-stub-codec.1",
6935 .codec_dai_name = "msm-stub-tx",
6936 .no_pcm = 1,
6937 .dpcm_capture = 1,
6938 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
6939 .be_hw_params_fixup = msm_be_hw_params_fixup,
6940 .ignore_suspend = 1,
6941 },
6942 /* Incall Music BACK END DAI Link */
6943 {
6944 .name = LPASS_BE_VOICE_PLAYBACK_TX,
6945 .stream_name = "Voice Farend Playback",
6946 .cpu_dai_name = "msm-dai-q6-dev.32773",
6947 .platform_name = "msm-pcm-routing",
6948 .codec_name = "msm-stub-codec.1",
6949 .codec_dai_name = "msm-stub-rx",
6950 .no_pcm = 1,
6951 .dpcm_playback = 1,
6952 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
6953 .be_hw_params_fixup = msm_be_hw_params_fixup,
6954 .ignore_suspend = 1,
6955 .ignore_pmdown_time = 1,
6956 },
6957 /* Incall Music 2 BACK END DAI Link */
6958 {
6959 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
6960 .stream_name = "Voice2 Farend Playback",
6961 .cpu_dai_name = "msm-dai-q6-dev.32770",
6962 .platform_name = "msm-pcm-routing",
6963 .codec_name = "msm-stub-codec.1",
6964 .codec_dai_name = "msm-stub-rx",
6965 .no_pcm = 1,
6966 .dpcm_playback = 1,
6967 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
6968 .be_hw_params_fixup = msm_be_hw_params_fixup,
6969 .ignore_suspend = 1,
6970 .ignore_pmdown_time = 1,
6971 },
6972 {
6973 .name = LPASS_BE_USB_AUDIO_RX,
6974 .stream_name = "USB Audio Playback",
6975 .cpu_dai_name = "msm-dai-q6-dev.28672",
6976 .platform_name = "msm-pcm-routing",
6977 .codec_name = "msm-stub-codec.1",
6978 .codec_dai_name = "msm-stub-rx",
6979 .no_pcm = 1,
6980 .dpcm_playback = 1,
6981 .id = MSM_BACKEND_DAI_USB_RX,
6982 .be_hw_params_fixup = msm_be_hw_params_fixup,
6983 .ignore_pmdown_time = 1,
6984 .ignore_suspend = 1,
6985 },
6986 {
6987 .name = LPASS_BE_USB_AUDIO_TX,
6988 .stream_name = "USB Audio Capture",
6989 .cpu_dai_name = "msm-dai-q6-dev.28673",
6990 .platform_name = "msm-pcm-routing",
6991 .codec_name = "msm-stub-codec.1",
6992 .codec_dai_name = "msm-stub-tx",
6993 .no_pcm = 1,
6994 .dpcm_capture = 1,
6995 .id = MSM_BACKEND_DAI_USB_TX,
6996 .be_hw_params_fixup = msm_be_hw_params_fixup,
6997 .ignore_suspend = 1,
6998 },
6999 {
7000 .name = LPASS_BE_PRI_TDM_RX_0,
7001 .stream_name = "Primary TDM0 Playback",
7002 .cpu_dai_name = "msm-dai-q6-tdm.36864",
7003 .platform_name = "msm-pcm-routing",
7004 .codec_name = "msm-stub-codec.1",
7005 .codec_dai_name = "msm-stub-rx",
7006 .no_pcm = 1,
7007 .dpcm_playback = 1,
7008 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
7009 .be_hw_params_fixup = msm_be_hw_params_fixup,
7010 .ops = &sm6150_tdm_be_ops,
7011 .ignore_suspend = 1,
7012 .ignore_pmdown_time = 1,
7013 },
7014 {
7015 .name = LPASS_BE_PRI_TDM_TX_0,
7016 .stream_name = "Primary TDM0 Capture",
7017 .cpu_dai_name = "msm-dai-q6-tdm.36865",
7018 .platform_name = "msm-pcm-routing",
7019 .codec_name = "msm-stub-codec.1",
7020 .codec_dai_name = "msm-stub-tx",
7021 .no_pcm = 1,
7022 .dpcm_capture = 1,
7023 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
7024 .be_hw_params_fixup = msm_be_hw_params_fixup,
7025 .ops = &sm6150_tdm_be_ops,
7026 .ignore_suspend = 1,
7027 },
7028 {
7029 .name = LPASS_BE_SEC_TDM_RX_0,
7030 .stream_name = "Secondary TDM0 Playback",
7031 .cpu_dai_name = "msm-dai-q6-tdm.36880",
7032 .platform_name = "msm-pcm-routing",
7033 .codec_name = "msm-stub-codec.1",
7034 .codec_dai_name = "msm-stub-rx",
7035 .no_pcm = 1,
7036 .dpcm_playback = 1,
7037 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
7038 .be_hw_params_fixup = msm_be_hw_params_fixup,
7039 .ops = &sm6150_tdm_be_ops,
7040 .ignore_suspend = 1,
7041 .ignore_pmdown_time = 1,
7042 },
7043 {
7044 .name = LPASS_BE_SEC_TDM_TX_0,
7045 .stream_name = "Secondary TDM0 Capture",
7046 .cpu_dai_name = "msm-dai-q6-tdm.36881",
7047 .platform_name = "msm-pcm-routing",
7048 .codec_name = "msm-stub-codec.1",
7049 .codec_dai_name = "msm-stub-tx",
7050 .no_pcm = 1,
7051 .dpcm_capture = 1,
7052 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
7053 .be_hw_params_fixup = msm_be_hw_params_fixup,
7054 .ops = &sm6150_tdm_be_ops,
7055 .ignore_suspend = 1,
7056 },
7057 {
7058 .name = LPASS_BE_TERT_TDM_RX_0,
7059 .stream_name = "Tertiary TDM0 Playback",
7060 .cpu_dai_name = "msm-dai-q6-tdm.36896",
7061 .platform_name = "msm-pcm-routing",
7062 .codec_name = "msm-stub-codec.1",
7063 .codec_dai_name = "msm-stub-rx",
7064 .no_pcm = 1,
7065 .dpcm_playback = 1,
7066 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
7067 .be_hw_params_fixup = msm_be_hw_params_fixup,
7068 .ops = &sm6150_tdm_be_ops,
7069 .ignore_suspend = 1,
7070 .ignore_pmdown_time = 1,
7071 },
7072 {
7073 .name = LPASS_BE_TERT_TDM_TX_0,
7074 .stream_name = "Tertiary TDM0 Capture",
7075 .cpu_dai_name = "msm-dai-q6-tdm.36897",
7076 .platform_name = "msm-pcm-routing",
7077 .codec_name = "msm-stub-codec.1",
7078 .codec_dai_name = "msm-stub-tx",
7079 .no_pcm = 1,
7080 .dpcm_capture = 1,
7081 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
7082 .be_hw_params_fixup = msm_be_hw_params_fixup,
7083 .ops = &sm6150_tdm_be_ops,
7084 .ignore_suspend = 1,
7085 },
7086 {
7087 .name = LPASS_BE_QUAT_TDM_RX_0,
7088 .stream_name = "Quaternary TDM0 Playback",
7089 .cpu_dai_name = "msm-dai-q6-tdm.36912",
7090 .platform_name = "msm-pcm-routing",
7091 .codec_name = "msm-stub-codec.1",
7092 .codec_dai_name = "msm-stub-rx",
7093 .no_pcm = 1,
7094 .dpcm_playback = 1,
7095 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
Aditya Bavanari353a5832018-11-22 15:10:32 +05307096 .be_hw_params_fixup = msm_be_hw_params_fixup,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307097 .ops = &sm6150_tdm_be_ops,
7098 .ignore_suspend = 1,
7099 .ignore_pmdown_time = 1,
7100 },
7101 {
7102 .name = LPASS_BE_QUAT_TDM_TX_0,
7103 .stream_name = "Quaternary TDM0 Capture",
7104 .cpu_dai_name = "msm-dai-q6-tdm.36913",
7105 .platform_name = "msm-pcm-routing",
7106 .codec_name = "msm-stub-codec.1",
7107 .codec_dai_name = "msm-stub-tx",
7108 .no_pcm = 1,
7109 .dpcm_capture = 1,
7110 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
7111 .be_hw_params_fixup = msm_be_hw_params_fixup,
7112 .ops = &sm6150_tdm_be_ops,
7113 .ignore_suspend = 1,
7114 },
Aditya Bavanari353a5832018-11-22 15:10:32 +05307115 {
7116 .name = LPASS_BE_QUIN_TDM_RX_0,
7117 .stream_name = "Quinary TDM0 Playback",
7118 .cpu_dai_name = "msm-dai-q6-tdm.36928",
7119 .platform_name = "msm-pcm-routing",
7120 .codec_name = "msm-stub-codec.1",
7121 .codec_dai_name = "msm-stub-rx",
7122 .no_pcm = 1,
7123 .dpcm_playback = 1,
7124 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
7125 .be_hw_params_fixup = msm_be_hw_params_fixup,
7126 .ops = &sm6150_tdm_be_ops,
7127 .ignore_suspend = 1,
7128 .ignore_pmdown_time = 1,
7129 },
7130 {
7131 .name = LPASS_BE_QUIN_TDM_TX_0,
7132 .stream_name = "Quinary TDM0 Capture",
7133 .cpu_dai_name = "msm-dai-q6-tdm.36929",
7134 .platform_name = "msm-pcm-routing",
7135 .codec_name = "msm-stub-codec.1",
7136 .codec_dai_name = "msm-stub-tx",
7137 .no_pcm = 1,
7138 .dpcm_capture = 1,
7139 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
7140 .be_hw_params_fixup = msm_be_hw_params_fixup,
7141 .ops = &sm6150_tdm_be_ops,
7142 .ignore_suspend = 1,
7143 },
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307144};
7145
7146static struct snd_soc_dai_link msm_tavil_be_dai_links[] = {
7147 {
7148 .name = LPASS_BE_SLIMBUS_0_RX,
7149 .stream_name = "Slimbus Playback",
7150 .cpu_dai_name = "msm-dai-q6-dev.16384",
7151 .platform_name = "msm-pcm-routing",
7152 .codec_name = "tavil_codec",
7153 .codec_dai_name = "tavil_rx1",
7154 .no_pcm = 1,
7155 .dpcm_playback = 1,
7156 .id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
7157 .init = &msm_audrx_tavil_init,
7158 .be_hw_params_fixup = msm_be_hw_params_fixup,
7159 /* this dainlink has playback support */
7160 .ignore_pmdown_time = 1,
7161 .ignore_suspend = 1,
7162 .ops = &msm_be_ops,
7163 },
7164 {
7165 .name = LPASS_BE_SLIMBUS_0_TX,
7166 .stream_name = "Slimbus Capture",
7167 .cpu_dai_name = "msm-dai-q6-dev.16385",
7168 .platform_name = "msm-pcm-routing",
7169 .codec_name = "tavil_codec",
7170 .codec_dai_name = "tavil_tx1",
7171 .no_pcm = 1,
7172 .dpcm_capture = 1,
7173 .id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
7174 .be_hw_params_fixup = msm_be_hw_params_fixup,
7175 .ignore_suspend = 1,
7176 .ops = &msm_be_ops,
7177 },
7178 {
7179 .name = LPASS_BE_SLIMBUS_1_RX,
7180 .stream_name = "Slimbus1 Playback",
7181 .cpu_dai_name = "msm-dai-q6-dev.16386",
7182 .platform_name = "msm-pcm-routing",
7183 .codec_name = "tavil_codec",
7184 .codec_dai_name = "tavil_rx1",
7185 .no_pcm = 1,
7186 .dpcm_playback = 1,
7187 .id = MSM_BACKEND_DAI_SLIMBUS_1_RX,
7188 .be_hw_params_fixup = msm_be_hw_params_fixup,
7189 .ops = &msm_be_ops,
7190 /* dai link has playback support */
7191 .ignore_pmdown_time = 1,
7192 .ignore_suspend = 1,
7193 },
7194 {
7195 .name = LPASS_BE_SLIMBUS_1_TX,
7196 .stream_name = "Slimbus1 Capture",
7197 .cpu_dai_name = "msm-dai-q6-dev.16387",
7198 .platform_name = "msm-pcm-routing",
7199 .codec_name = "tavil_codec",
7200 .codec_dai_name = "tavil_tx3",
7201 .no_pcm = 1,
7202 .dpcm_capture = 1,
7203 .id = MSM_BACKEND_DAI_SLIMBUS_1_TX,
7204 .be_hw_params_fixup = msm_be_hw_params_fixup,
7205 .ops = &msm_be_ops,
7206 .ignore_suspend = 1,
7207 },
7208 {
7209 .name = LPASS_BE_SLIMBUS_2_RX,
7210 .stream_name = "Slimbus2 Playback",
7211 .cpu_dai_name = "msm-dai-q6-dev.16388",
7212 .platform_name = "msm-pcm-routing",
7213 .codec_name = "tavil_codec",
7214 .codec_dai_name = "tavil_rx2",
7215 .no_pcm = 1,
7216 .dpcm_playback = 1,
7217 .id = MSM_BACKEND_DAI_SLIMBUS_2_RX,
7218 .be_hw_params_fixup = msm_be_hw_params_fixup,
7219 .ops = &msm_be_ops,
7220 .ignore_pmdown_time = 1,
7221 .ignore_suspend = 1,
7222 },
7223 {
7224 .name = LPASS_BE_SLIMBUS_3_RX,
7225 .stream_name = "Slimbus3 Playback",
7226 .cpu_dai_name = "msm-dai-q6-dev.16390",
7227 .platform_name = "msm-pcm-routing",
7228 .codec_name = "tavil_codec",
7229 .codec_dai_name = "tavil_rx1",
7230 .no_pcm = 1,
7231 .dpcm_playback = 1,
7232 .id = MSM_BACKEND_DAI_SLIMBUS_3_RX,
7233 .be_hw_params_fixup = msm_be_hw_params_fixup,
7234 .ops = &msm_be_ops,
7235 /* dai link has playback support */
7236 .ignore_pmdown_time = 1,
7237 .ignore_suspend = 1,
7238 },
7239 {
7240 .name = LPASS_BE_SLIMBUS_3_TX,
7241 .stream_name = "Slimbus3 Capture",
7242 .cpu_dai_name = "msm-dai-q6-dev.16391",
7243 .platform_name = "msm-pcm-routing",
7244 .codec_name = "tavil_codec",
7245 .codec_dai_name = "tavil_tx1",
7246 .no_pcm = 1,
7247 .dpcm_capture = 1,
7248 .id = MSM_BACKEND_DAI_SLIMBUS_3_TX,
7249 .be_hw_params_fixup = msm_be_hw_params_fixup,
7250 .ops = &msm_be_ops,
7251 .ignore_suspend = 1,
7252 },
7253 {
7254 .name = LPASS_BE_SLIMBUS_4_RX,
7255 .stream_name = "Slimbus4 Playback",
7256 .cpu_dai_name = "msm-dai-q6-dev.16392",
7257 .platform_name = "msm-pcm-routing",
7258 .codec_name = "tavil_codec",
7259 .codec_dai_name = "tavil_rx1",
7260 .no_pcm = 1,
7261 .dpcm_playback = 1,
7262 .id = MSM_BACKEND_DAI_SLIMBUS_4_RX,
7263 .be_hw_params_fixup = msm_be_hw_params_fixup,
7264 .ops = &msm_be_ops,
7265 /* dai link has playback support */
7266 .ignore_pmdown_time = 1,
7267 .ignore_suspend = 1,
7268 },
7269 {
7270 .name = LPASS_BE_SLIMBUS_5_RX,
7271 .stream_name = "Slimbus5 Playback",
7272 .cpu_dai_name = "msm-dai-q6-dev.16394",
7273 .platform_name = "msm-pcm-routing",
7274 .codec_name = "tavil_codec",
7275 .codec_dai_name = "tavil_rx3",
7276 .no_pcm = 1,
7277 .dpcm_playback = 1,
7278 .id = MSM_BACKEND_DAI_SLIMBUS_5_RX,
7279 .be_hw_params_fixup = msm_be_hw_params_fixup,
7280 .ops = &msm_be_ops,
7281 /* dai link has playback support */
7282 .ignore_pmdown_time = 1,
7283 .ignore_suspend = 1,
7284 },
7285 /* MAD BE */
7286 {
7287 .name = LPASS_BE_SLIMBUS_5_TX,
7288 .stream_name = "Slimbus5 Capture",
7289 .cpu_dai_name = "msm-dai-q6-dev.16395",
7290 .platform_name = "msm-pcm-routing",
7291 .codec_name = "tavil_codec",
7292 .codec_dai_name = "tavil_mad1",
7293 .no_pcm = 1,
7294 .dpcm_capture = 1,
7295 .id = MSM_BACKEND_DAI_SLIMBUS_5_TX,
7296 .be_hw_params_fixup = msm_be_hw_params_fixup,
7297 .ops = &msm_be_ops,
7298 .ignore_suspend = 1,
7299 },
7300 {
7301 .name = LPASS_BE_SLIMBUS_6_RX,
7302 .stream_name = "Slimbus6 Playback",
7303 .cpu_dai_name = "msm-dai-q6-dev.16396",
7304 .platform_name = "msm-pcm-routing",
7305 .codec_name = "tavil_codec",
7306 .codec_dai_name = "tavil_rx4",
7307 .no_pcm = 1,
7308 .dpcm_playback = 1,
7309 .id = MSM_BACKEND_DAI_SLIMBUS_6_RX,
7310 .be_hw_params_fixup = msm_be_hw_params_fixup,
7311 .ops = &msm_be_ops,
7312 /* dai link has playback support */
7313 .ignore_pmdown_time = 1,
7314 .ignore_suspend = 1,
7315 },
7316 /* Slimbus VI Recording */
7317 {
7318 .name = LPASS_BE_SLIMBUS_TX_VI,
7319 .stream_name = "Slimbus4 Capture",
7320 .cpu_dai_name = "msm-dai-q6-dev.16393",
7321 .platform_name = "msm-pcm-routing",
7322 .codec_name = "tavil_codec",
7323 .codec_dai_name = "tavil_vifeedback",
7324 .id = MSM_BACKEND_DAI_SLIMBUS_4_TX,
7325 .be_hw_params_fixup = msm_be_hw_params_fixup,
7326 .ops = &msm_be_ops,
7327 .ignore_suspend = 1,
7328 .no_pcm = 1,
7329 .dpcm_capture = 1,
7330 },
7331};
7332
Aditya Bavanari45e2e652019-01-11 20:18:55 +05307333static struct snd_soc_dai_link msm_tasha_be_dai_links[] = {
7334 /* Backend DAI Links */
7335 {
7336 .name = LPASS_BE_SLIMBUS_0_RX,
7337 .stream_name = "Slimbus Playback",
7338 .cpu_dai_name = "msm-dai-q6-dev.16384",
7339 .platform_name = "msm-pcm-routing",
7340 .codec_name = "tasha_codec",
7341 .codec_dai_name = "tasha_mix_rx1",
7342 .no_pcm = 1,
7343 .dpcm_playback = 1,
7344 .id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
7345 .init = &msm_audrx_tasha_init,
7346 .be_hw_params_fixup = msm_be_hw_params_fixup,
7347 /* this dainlink has playback support */
7348 .ignore_pmdown_time = 1,
7349 .ignore_suspend = 1,
7350 .ops = &msm_be_ops,
7351 },
7352 {
7353 .name = LPASS_BE_SLIMBUS_0_TX,
7354 .stream_name = "Slimbus Capture",
7355 .cpu_dai_name = "msm-dai-q6-dev.16385",
7356 .platform_name = "msm-pcm-routing",
7357 .codec_name = "tasha_codec",
7358 .codec_dai_name = "tasha_tx1",
7359 .no_pcm = 1,
7360 .dpcm_capture = 1,
7361 .id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
7362 .be_hw_params_fixup = msm_be_hw_params_fixup,
7363 .ignore_suspend = 1,
7364 .ops = &msm_be_ops,
7365 },
7366 {
7367 .name = LPASS_BE_SLIMBUS_1_RX,
7368 .stream_name = "Slimbus1 Playback",
7369 .cpu_dai_name = "msm-dai-q6-dev.16386",
7370 .platform_name = "msm-pcm-routing",
7371 .codec_name = "tasha_codec",
7372 .codec_dai_name = "tasha_mix_rx1",
7373 .no_pcm = 1,
7374 .dpcm_playback = 1,
7375 .id = MSM_BACKEND_DAI_SLIMBUS_1_RX,
7376 .be_hw_params_fixup = msm_be_hw_params_fixup,
7377 .ops = &msm_be_ops,
7378 /* dai link has playback support */
7379 .ignore_pmdown_time = 1,
7380 .ignore_suspend = 1,
7381 },
7382 {
7383 .name = LPASS_BE_SLIMBUS_1_TX,
7384 .stream_name = "Slimbus1 Capture",
7385 .cpu_dai_name = "msm-dai-q6-dev.16387",
7386 .platform_name = "msm-pcm-routing",
7387 .codec_name = "tasha_codec",
7388 .codec_dai_name = "tasha_tx3",
7389 .no_pcm = 1,
7390 .dpcm_capture = 1,
7391 .id = MSM_BACKEND_DAI_SLIMBUS_1_TX,
7392 .be_hw_params_fixup = msm_be_hw_params_fixup,
7393 .ops = &msm_be_ops,
7394 .ignore_suspend = 1,
7395 },
7396 {
7397 .name = LPASS_BE_SLIMBUS_3_RX,
7398 .stream_name = "Slimbus3 Playback",
7399 .cpu_dai_name = "msm-dai-q6-dev.16390",
7400 .platform_name = "msm-pcm-routing",
7401 .codec_name = "tasha_codec",
7402 .codec_dai_name = "tasha_mix_rx1",
7403 .no_pcm = 1,
7404 .dpcm_playback = 1,
7405 .id = MSM_BACKEND_DAI_SLIMBUS_3_RX,
7406 .be_hw_params_fixup = msm_be_hw_params_fixup,
7407 .ops = &msm_be_ops,
7408 /* dai link has playback support */
7409 .ignore_pmdown_time = 1,
7410 .ignore_suspend = 1,
7411 },
7412 {
7413 .name = LPASS_BE_SLIMBUS_3_TX,
7414 .stream_name = "Slimbus3 Capture",
7415 .cpu_dai_name = "msm-dai-q6-dev.16391",
7416 .platform_name = "msm-pcm-routing",
7417 .codec_name = "tasha_codec",
7418 .codec_dai_name = "tasha_tx1",
7419 .no_pcm = 1,
7420 .dpcm_capture = 1,
7421 .dpcm_playback = 1,
7422 .id = MSM_BACKEND_DAI_SLIMBUS_3_TX,
7423 .be_hw_params_fixup = msm_be_hw_params_fixup,
7424 .ops = &msm_be_ops,
7425 .ignore_suspend = 1,
7426 },
7427 {
7428 .name = LPASS_BE_SLIMBUS_4_RX,
7429 .stream_name = "Slimbus4 Playback",
7430 .cpu_dai_name = "msm-dai-q6-dev.16392",
7431 .platform_name = "msm-pcm-routing",
7432 .codec_name = "tasha_codec",
7433 .codec_dai_name = "tasha_mix_rx1",
7434 .no_pcm = 1,
7435 .dpcm_playback = 1,
7436 .id = MSM_BACKEND_DAI_SLIMBUS_4_RX,
7437 .be_hw_params_fixup = msm_be_hw_params_fixup,
7438 .ops = &msm_be_ops,
7439 /* dai link has playback support */
7440 .ignore_pmdown_time = 1,
7441 .ignore_suspend = 1,
7442 },
7443 {
7444 .name = LPASS_BE_SLIMBUS_5_RX,
7445 .stream_name = "Slimbus5 Playback",
7446 .cpu_dai_name = "msm-dai-q6-dev.16394",
7447 .platform_name = "msm-pcm-routing",
7448 .codec_name = "tasha_codec",
7449 .codec_dai_name = "tasha_rx3",
7450 .no_pcm = 1,
7451 .dpcm_playback = 1,
7452 .id = MSM_BACKEND_DAI_SLIMBUS_5_RX,
7453 .be_hw_params_fixup = msm_be_hw_params_fixup,
7454 .ops = &msm_be_ops,
7455 /* dai link has playback support */
7456 .ignore_pmdown_time = 1,
7457 .ignore_suspend = 1,
7458 },
7459 /* MAD BE */
7460 {
7461 .name = LPASS_BE_SLIMBUS_5_TX,
7462 .stream_name = "Slimbus5 Capture",
7463 .cpu_dai_name = "msm-dai-q6-dev.16395",
7464 .platform_name = "msm-pcm-routing",
7465 .codec_name = "tasha_codec",
7466 .codec_dai_name = "tasha_mad1",
7467 .no_pcm = 1,
7468 .dpcm_capture = 1,
7469 .id = MSM_BACKEND_DAI_SLIMBUS_5_TX,
7470 .be_hw_params_fixup = msm_be_hw_params_fixup,
7471 .ops = &msm_be_ops,
7472 .ignore_suspend = 1,
7473 },
7474 {
7475 .name = LPASS_BE_SLIMBUS_6_RX,
7476 .stream_name = "Slimbus6 Playback",
7477 .cpu_dai_name = "msm-dai-q6-dev.16396",
7478 .platform_name = "msm-pcm-routing",
7479 .codec_name = "tasha_codec",
7480 .codec_dai_name = "tasha_rx4",
7481 .no_pcm = 1,
7482 .dpcm_playback = 1,
7483 .id = MSM_BACKEND_DAI_SLIMBUS_6_RX,
7484 .be_hw_params_fixup = msm_be_hw_params_fixup,
7485 .ops = &msm_be_ops,
7486 /* dai link has playback support */
7487 .ignore_pmdown_time = 1,
7488 .ignore_suspend = 1,
7489 },
7490};
7491
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307492static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
7493 {
7494 .name = LPASS_BE_SLIMBUS_7_RX,
7495 .stream_name = "Slimbus7 Playback",
7496 .cpu_dai_name = "msm-dai-q6-dev.16398",
7497 .platform_name = "msm-pcm-routing",
7498 .codec_name = "btfmslim_slave",
7499 /* BT codec driver determines capabilities based on
7500 * dai name, bt codecdai name should always contains
7501 * supported usecase information
7502 */
7503 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
7504 .no_pcm = 1,
7505 .dpcm_playback = 1,
7506 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
7507 .be_hw_params_fixup = msm_be_hw_params_fixup,
7508 .ops = &msm_wcn_ops,
7509 /* dai link has playback support */
7510 .ignore_pmdown_time = 1,
7511 .ignore_suspend = 1,
7512 },
7513 {
7514 .name = LPASS_BE_SLIMBUS_7_TX,
7515 .stream_name = "Slimbus7 Capture",
7516 .cpu_dai_name = "msm-dai-q6-dev.16399",
7517 .platform_name = "msm-pcm-routing",
7518 .codec_name = "btfmslim_slave",
7519 .codec_dai_name = "btfm_bt_sco_slim_tx",
7520 .no_pcm = 1,
7521 .dpcm_capture = 1,
7522 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
7523 .be_hw_params_fixup = msm_be_hw_params_fixup,
7524 .ops = &msm_wcn_ops,
7525 .ignore_suspend = 1,
7526 },
7527 {
7528 .name = LPASS_BE_SLIMBUS_8_TX,
7529 .stream_name = "Slimbus8 Capture",
7530 .cpu_dai_name = "msm-dai-q6-dev.16401",
7531 .platform_name = "msm-pcm-routing",
7532 .codec_name = "btfmslim_slave",
7533 .codec_dai_name = "btfm_fm_slim_tx",
7534 .no_pcm = 1,
7535 .dpcm_capture = 1,
7536 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
7537 .be_hw_params_fixup = msm_be_hw_params_fixup,
7538 .init = &msm_wcn_init,
7539 .ops = &msm_wcn_ops,
7540 .ignore_suspend = 1,
7541 },
7542};
7543
7544static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
7545 /* DISP PORT BACK END DAI Link */
7546 {
7547 .name = LPASS_BE_DISPLAY_PORT,
7548 .stream_name = "Display Port Playback",
7549 .cpu_dai_name = "msm-dai-q6-dp.24608",
7550 .platform_name = "msm-pcm-routing",
7551 .codec_name = "msm-ext-disp-audio-codec-rx",
7552 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
7553 .no_pcm = 1,
7554 .dpcm_playback = 1,
7555 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
7556 .be_hw_params_fixup = msm_be_hw_params_fixup,
7557 .ignore_pmdown_time = 1,
7558 .ignore_suspend = 1,
7559 },
7560};
7561
7562static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
7563 {
7564 .name = LPASS_BE_PRI_MI2S_RX,
7565 .stream_name = "Primary MI2S Playback",
7566 .cpu_dai_name = "msm-dai-q6-mi2s.0",
7567 .platform_name = "msm-pcm-routing",
7568 .codec_name = "msm-stub-codec.1",
7569 .codec_dai_name = "msm-stub-rx",
7570 .no_pcm = 1,
7571 .dpcm_playback = 1,
7572 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
7573 .be_hw_params_fixup = msm_be_hw_params_fixup,
7574 .ops = &msm_mi2s_be_ops,
7575 .ignore_suspend = 1,
7576 .ignore_pmdown_time = 1,
7577 },
7578 {
7579 .name = LPASS_BE_PRI_MI2S_TX,
7580 .stream_name = "Primary MI2S Capture",
7581 .cpu_dai_name = "msm-dai-q6-mi2s.0",
7582 .platform_name = "msm-pcm-routing",
7583 .codec_name = "msm-stub-codec.1",
7584 .codec_dai_name = "msm-stub-tx",
7585 .no_pcm = 1,
7586 .dpcm_capture = 1,
7587 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
7588 .be_hw_params_fixup = msm_be_hw_params_fixup,
7589 .ops = &msm_mi2s_be_ops,
7590 .ignore_suspend = 1,
7591 },
7592 {
7593 .name = LPASS_BE_SEC_MI2S_RX,
7594 .stream_name = "Secondary MI2S Playback",
7595 .cpu_dai_name = "msm-dai-q6-mi2s.1",
7596 .platform_name = "msm-pcm-routing",
7597 .codec_name = "msm-stub-codec.1",
7598 .codec_dai_name = "msm-stub-rx",
7599 .no_pcm = 1,
7600 .dpcm_playback = 1,
7601 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
7602 .be_hw_params_fixup = msm_be_hw_params_fixup,
7603 .ops = &msm_mi2s_be_ops,
7604 .ignore_suspend = 1,
7605 .ignore_pmdown_time = 1,
7606 },
7607 {
7608 .name = LPASS_BE_SEC_MI2S_TX,
7609 .stream_name = "Secondary MI2S Capture",
7610 .cpu_dai_name = "msm-dai-q6-mi2s.1",
7611 .platform_name = "msm-pcm-routing",
7612 .codec_name = "msm-stub-codec.1",
7613 .codec_dai_name = "msm-stub-tx",
7614 .no_pcm = 1,
7615 .dpcm_capture = 1,
7616 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
7617 .be_hw_params_fixup = msm_be_hw_params_fixup,
7618 .ops = &msm_mi2s_be_ops,
7619 .ignore_suspend = 1,
7620 },
7621 {
7622 .name = LPASS_BE_TERT_MI2S_RX,
7623 .stream_name = "Tertiary MI2S Playback",
7624 .cpu_dai_name = "msm-dai-q6-mi2s.2",
7625 .platform_name = "msm-pcm-routing",
7626 .codec_name = "msm-stub-codec.1",
7627 .codec_dai_name = "msm-stub-rx",
7628 .no_pcm = 1,
7629 .dpcm_playback = 1,
7630 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
7631 .be_hw_params_fixup = msm_be_hw_params_fixup,
7632 .ops = &msm_mi2s_be_ops,
7633 .ignore_suspend = 1,
7634 .ignore_pmdown_time = 1,
7635 },
7636 {
7637 .name = LPASS_BE_TERT_MI2S_TX,
7638 .stream_name = "Tertiary MI2S Capture",
7639 .cpu_dai_name = "msm-dai-q6-mi2s.2",
7640 .platform_name = "msm-pcm-routing",
7641 .codec_name = "msm-stub-codec.1",
7642 .codec_dai_name = "msm-stub-tx",
7643 .no_pcm = 1,
7644 .dpcm_capture = 1,
7645 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
7646 .be_hw_params_fixup = msm_be_hw_params_fixup,
7647 .ops = &msm_mi2s_be_ops,
7648 .ignore_suspend = 1,
7649 },
7650 {
7651 .name = LPASS_BE_QUAT_MI2S_RX,
7652 .stream_name = "Quaternary MI2S Playback",
7653 .cpu_dai_name = "msm-dai-q6-mi2s.3",
7654 .platform_name = "msm-pcm-routing",
7655 .codec_name = "msm-stub-codec.1",
7656 .codec_dai_name = "msm-stub-rx",
7657 .no_pcm = 1,
7658 .dpcm_playback = 1,
7659 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
7660 .be_hw_params_fixup = msm_be_hw_params_fixup,
7661 .ops = &msm_mi2s_be_ops,
7662 .ignore_suspend = 1,
7663 .ignore_pmdown_time = 1,
7664 },
7665 {
7666 .name = LPASS_BE_QUAT_MI2S_TX,
7667 .stream_name = "Quaternary MI2S Capture",
7668 .cpu_dai_name = "msm-dai-q6-mi2s.3",
7669 .platform_name = "msm-pcm-routing",
7670 .codec_name = "msm-stub-codec.1",
7671 .codec_dai_name = "msm-stub-tx",
7672 .no_pcm = 1,
7673 .dpcm_capture = 1,
7674 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
7675 .be_hw_params_fixup = msm_be_hw_params_fixup,
7676 .ops = &msm_mi2s_be_ops,
7677 .ignore_suspend = 1,
7678 },
7679 {
7680 .name = LPASS_BE_QUIN_MI2S_RX,
7681 .stream_name = "Quinary MI2S Playback",
7682 .cpu_dai_name = "msm-dai-q6-mi2s.4",
7683 .platform_name = "msm-pcm-routing",
7684 .codec_name = "msm-stub-codec.1",
7685 .codec_dai_name = "msm-stub-rx",
7686 .no_pcm = 1,
7687 .dpcm_playback = 1,
7688 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
7689 .be_hw_params_fixup = msm_be_hw_params_fixup,
7690 .ops = &msm_mi2s_be_ops,
7691 .ignore_suspend = 1,
7692 .ignore_pmdown_time = 1,
7693 },
7694 {
7695 .name = LPASS_BE_QUIN_MI2S_TX,
7696 .stream_name = "Quinary MI2S Capture",
7697 .cpu_dai_name = "msm-dai-q6-mi2s.4",
7698 .platform_name = "msm-pcm-routing",
7699 .codec_name = "msm-stub-codec.1",
7700 .codec_dai_name = "msm-stub-tx",
7701 .no_pcm = 1,
7702 .dpcm_capture = 1,
7703 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
7704 .be_hw_params_fixup = msm_be_hw_params_fixup,
7705 .ops = &msm_mi2s_be_ops,
7706 .ignore_suspend = 1,
7707 },
7708
7709};
7710
7711static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
7712 /* Primary AUX PCM Backend DAI Links */
7713 {
7714 .name = LPASS_BE_AUXPCM_RX,
7715 .stream_name = "AUX PCM Playback",
7716 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
7717 .platform_name = "msm-pcm-routing",
7718 .codec_name = "msm-stub-codec.1",
7719 .codec_dai_name = "msm-stub-rx",
7720 .no_pcm = 1,
7721 .dpcm_playback = 1,
7722 .id = MSM_BACKEND_DAI_AUXPCM_RX,
7723 .be_hw_params_fixup = msm_be_hw_params_fixup,
7724 .ignore_pmdown_time = 1,
7725 .ignore_suspend = 1,
7726 },
7727 {
7728 .name = LPASS_BE_AUXPCM_TX,
7729 .stream_name = "AUX PCM Capture",
7730 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
7731 .platform_name = "msm-pcm-routing",
7732 .codec_name = "msm-stub-codec.1",
7733 .codec_dai_name = "msm-stub-tx",
7734 .no_pcm = 1,
7735 .dpcm_capture = 1,
7736 .id = MSM_BACKEND_DAI_AUXPCM_TX,
7737 .be_hw_params_fixup = msm_be_hw_params_fixup,
7738 .ignore_suspend = 1,
7739 },
7740 /* Secondary AUX PCM Backend DAI Links */
7741 {
7742 .name = LPASS_BE_SEC_AUXPCM_RX,
7743 .stream_name = "Sec AUX PCM Playback",
7744 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
7745 .platform_name = "msm-pcm-routing",
7746 .codec_name = "msm-stub-codec.1",
7747 .codec_dai_name = "msm-stub-rx",
7748 .no_pcm = 1,
7749 .dpcm_playback = 1,
7750 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
7751 .be_hw_params_fixup = msm_be_hw_params_fixup,
7752 .ignore_pmdown_time = 1,
7753 .ignore_suspend = 1,
7754 },
7755 {
7756 .name = LPASS_BE_SEC_AUXPCM_TX,
7757 .stream_name = "Sec AUX PCM Capture",
7758 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
7759 .platform_name = "msm-pcm-routing",
7760 .codec_name = "msm-stub-codec.1",
7761 .codec_dai_name = "msm-stub-tx",
7762 .no_pcm = 1,
7763 .dpcm_capture = 1,
7764 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
7765 .be_hw_params_fixup = msm_be_hw_params_fixup,
7766 .ignore_suspend = 1,
7767 },
7768 /* Tertiary AUX PCM Backend DAI Links */
7769 {
7770 .name = LPASS_BE_TERT_AUXPCM_RX,
7771 .stream_name = "Tert AUX PCM Playback",
7772 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
7773 .platform_name = "msm-pcm-routing",
7774 .codec_name = "msm-stub-codec.1",
7775 .codec_dai_name = "msm-stub-rx",
7776 .no_pcm = 1,
7777 .dpcm_playback = 1,
7778 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
7779 .be_hw_params_fixup = msm_be_hw_params_fixup,
7780 .ignore_suspend = 1,
7781 },
7782 {
7783 .name = LPASS_BE_TERT_AUXPCM_TX,
7784 .stream_name = "Tert AUX PCM Capture",
7785 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
7786 .platform_name = "msm-pcm-routing",
7787 .codec_name = "msm-stub-codec.1",
7788 .codec_dai_name = "msm-stub-tx",
7789 .no_pcm = 1,
7790 .dpcm_capture = 1,
7791 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
7792 .be_hw_params_fixup = msm_be_hw_params_fixup,
7793 .ignore_suspend = 1,
7794 },
7795 /* Quaternary AUX PCM Backend DAI Links */
7796 {
7797 .name = LPASS_BE_QUAT_AUXPCM_RX,
7798 .stream_name = "Quat AUX PCM Playback",
7799 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
7800 .platform_name = "msm-pcm-routing",
7801 .codec_name = "msm-stub-codec.1",
7802 .codec_dai_name = "msm-stub-rx",
7803 .no_pcm = 1,
7804 .dpcm_playback = 1,
7805 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
7806 .be_hw_params_fixup = msm_be_hw_params_fixup,
7807 .ignore_pmdown_time = 1,
7808 .ignore_suspend = 1,
7809 },
7810 {
7811 .name = LPASS_BE_QUAT_AUXPCM_TX,
7812 .stream_name = "Quat AUX PCM Capture",
7813 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
7814 .platform_name = "msm-pcm-routing",
7815 .codec_name = "msm-stub-codec.1",
7816 .codec_dai_name = "msm-stub-tx",
7817 .no_pcm = 1,
7818 .dpcm_capture = 1,
7819 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
7820 .be_hw_params_fixup = msm_be_hw_params_fixup,
7821 .ignore_suspend = 1,
7822 },
7823 /* Quinary AUX PCM Backend DAI Links */
7824 {
7825 .name = LPASS_BE_QUIN_AUXPCM_RX,
7826 .stream_name = "Quin AUX PCM Playback",
7827 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
7828 .platform_name = "msm-pcm-routing",
7829 .codec_name = "msm-stub-codec.1",
7830 .codec_dai_name = "msm-stub-rx",
7831 .no_pcm = 1,
7832 .dpcm_playback = 1,
7833 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
7834 .be_hw_params_fixup = msm_be_hw_params_fixup,
7835 .ignore_pmdown_time = 1,
7836 .ignore_suspend = 1,
7837 },
7838 {
7839 .name = LPASS_BE_QUIN_AUXPCM_TX,
7840 .stream_name = "Quin AUX PCM Capture",
7841 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
7842 .platform_name = "msm-pcm-routing",
7843 .codec_name = "msm-stub-codec.1",
7844 .codec_dai_name = "msm-stub-tx",
7845 .no_pcm = 1,
7846 .dpcm_capture = 1,
7847 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
7848 .be_hw_params_fixup = msm_be_hw_params_fixup,
7849 .ignore_suspend = 1,
7850 },
7851};
7852
7853static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = {
7854 /* WSA CDC DMA Backend DAI Links */
7855 {
7856 .name = LPASS_BE_WSA_CDC_DMA_RX_0,
7857 .stream_name = "WSA CDC DMA0 Playback",
7858 .cpu_dai_name = "msm-dai-cdc-dma-dev.45056",
7859 .platform_name = "msm-pcm-routing",
7860 .codec_name = "bolero_codec",
7861 .codec_dai_name = "wsa_macro_rx1",
7862 .no_pcm = 1,
7863 .dpcm_playback = 1,
7864 .init = &msm_int_audrx_init,
7865 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
7866 .be_hw_params_fixup = msm_be_hw_params_fixup,
7867 .ignore_pmdown_time = 1,
7868 .ignore_suspend = 1,
7869 .ops = &msm_cdc_dma_be_ops,
7870 },
7871 {
7872 .name = LPASS_BE_WSA_CDC_DMA_RX_1,
7873 .stream_name = "WSA CDC DMA1 Playback",
7874 .cpu_dai_name = "msm-dai-cdc-dma-dev.45058",
7875 .platform_name = "msm-pcm-routing",
7876 .codec_name = "bolero_codec",
7877 .codec_dai_name = "wsa_macro_rx_mix",
7878 .no_pcm = 1,
7879 .dpcm_playback = 1,
7880 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1,
7881 .be_hw_params_fixup = msm_be_hw_params_fixup,
7882 .ignore_pmdown_time = 1,
7883 .ignore_suspend = 1,
7884 .ops = &msm_cdc_dma_be_ops,
7885 },
7886 {
7887 .name = LPASS_BE_WSA_CDC_DMA_TX_1,
7888 .stream_name = "WSA CDC DMA1 Capture",
7889 .cpu_dai_name = "msm-dai-cdc-dma-dev.45059",
7890 .platform_name = "msm-pcm-routing",
7891 .codec_name = "bolero_codec",
7892 .codec_dai_name = "wsa_macro_echo",
7893 .no_pcm = 1,
7894 .dpcm_capture = 1,
7895 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1,
7896 .be_hw_params_fixup = msm_be_hw_params_fixup,
7897 .ignore_suspend = 1,
7898 .ops = &msm_cdc_dma_be_ops,
7899 },
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307900};
7901
7902static struct snd_soc_dai_link msm_rx_tx_cdc_dma_be_dai_links[] = {
7903 /* RX CDC DMA Backend DAI Links */
7904 {
7905 .name = LPASS_BE_RX_CDC_DMA_RX_0,
7906 .stream_name = "RX CDC DMA0 Playback",
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05307907 .cpu_dai_name = "msm-dai-cdc-dma-dev.45104",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307908 .platform_name = "msm-pcm-routing",
7909 .codec_name = "bolero_codec",
7910 .codec_dai_name = "rx_macro_rx1",
7911 .no_pcm = 1,
7912 .dpcm_playback = 1,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307913 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_0,
7914 .be_hw_params_fixup = msm_be_hw_params_fixup,
7915 .ignore_pmdown_time = 1,
7916 .ignore_suspend = 1,
7917 .ops = &msm_cdc_dma_be_ops,
7918 },
7919 {
7920 .name = LPASS_BE_RX_CDC_DMA_RX_1,
7921 .stream_name = "RX CDC DMA1 Playback",
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05307922 .cpu_dai_name = "msm-dai-cdc-dma-dev.45106",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307923 .platform_name = "msm-pcm-routing",
7924 .codec_name = "bolero_codec",
7925 .codec_dai_name = "rx_macro_rx2",
7926 .no_pcm = 1,
7927 .dpcm_playback = 1,
7928 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
7929 .be_hw_params_fixup = msm_be_hw_params_fixup,
7930 .ignore_pmdown_time = 1,
7931 .ignore_suspend = 1,
7932 .ops = &msm_cdc_dma_be_ops,
7933 },
7934 {
7935 .name = LPASS_BE_RX_CDC_DMA_RX_2,
7936 .stream_name = "RX CDC DMA2 Playback",
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05307937 .cpu_dai_name = "msm-dai-cdc-dma-dev.45108",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307938 .platform_name = "msm-pcm-routing",
7939 .codec_name = "bolero_codec",
7940 .codec_dai_name = "rx_macro_rx3",
7941 .no_pcm = 1,
7942 .dpcm_playback = 1,
7943 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_2,
7944 .be_hw_params_fixup = msm_be_hw_params_fixup,
7945 .ignore_pmdown_time = 1,
7946 .ignore_suspend = 1,
7947 .ops = &msm_cdc_dma_be_ops,
7948 },
7949 {
7950 .name = LPASS_BE_RX_CDC_DMA_RX_3,
7951 .stream_name = "RX CDC DMA3 Playback",
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05307952 .cpu_dai_name = "msm-dai-cdc-dma-dev.45110",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307953 .platform_name = "msm-pcm-routing",
7954 .codec_name = "bolero_codec",
7955 .codec_dai_name = "rx_macro_rx4",
7956 .no_pcm = 1,
7957 .dpcm_playback = 1,
7958 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_3,
7959 .be_hw_params_fixup = msm_be_hw_params_fixup,
7960 .ignore_pmdown_time = 1,
7961 .ignore_suspend = 1,
7962 .ops = &msm_cdc_dma_be_ops,
7963 },
7964 /* TX CDC DMA Backend DAI Links */
7965 {
Vatsal Bucha83e6ee12018-11-30 18:58:31 +05307966 .name = LPASS_BE_TX_CDC_DMA_TX_0,
7967 .stream_name = "TX CDC DMA0 Capture",
7968 .cpu_dai_name = "msm-dai-cdc-dma-dev.45105",
7969 .platform_name = "msm-pcm-routing",
7970 .codec_name = "bolero_codec",
7971 .codec_dai_name = "rx_macro_echo",
7972 .no_pcm = 1,
7973 .dpcm_capture = 1,
7974 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_0,
7975 .be_hw_params_fixup = msm_be_hw_params_fixup,
7976 .ignore_suspend = 1,
7977 .ops = &msm_cdc_dma_be_ops,
7978 },
7979 {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307980 .name = LPASS_BE_TX_CDC_DMA_TX_3,
7981 .stream_name = "TX CDC DMA3 Capture",
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05307982 .cpu_dai_name = "msm-dai-cdc-dma-dev.45111",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307983 .platform_name = "msm-pcm-routing",
7984 .codec_name = "bolero_codec",
7985 .codec_dai_name = "tx_macro_tx1",
7986 .no_pcm = 1,
7987 .dpcm_capture = 1,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307988 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
7989 .be_hw_params_fixup = msm_be_hw_params_fixup,
7990 .ignore_suspend = 1,
7991 .ops = &msm_cdc_dma_be_ops,
7992 },
7993 {
7994 .name = LPASS_BE_TX_CDC_DMA_TX_4,
7995 .stream_name = "TX CDC DMA4 Capture",
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05307996 .cpu_dai_name = "msm-dai-cdc-dma-dev.45113",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05307997 .platform_name = "msm-pcm-routing",
7998 .codec_name = "bolero_codec",
7999 .codec_dai_name = "tx_macro_tx2",
8000 .no_pcm = 1,
8001 .dpcm_capture = 1,
8002 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_4,
8003 .be_hw_params_fixup = msm_be_hw_params_fixup,
8004 .ignore_suspend = 1,
8005 .ops = &msm_cdc_dma_be_ops,
8006 },
8007};
8008
8009static struct snd_soc_dai_link msm_sm6150_dai_links[
8010 ARRAY_SIZE(msm_common_dai_links) +
8011 ARRAY_SIZE(msm_tavil_fe_dai_links) +
8012 ARRAY_SIZE(msm_bolero_fe_dai_links) +
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308013 ARRAY_SIZE(msm_tasha_fe_dai_links) +
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308014 ARRAY_SIZE(msm_common_misc_fe_dai_links) +
Md Mansoor Ahmedfc755592018-11-29 11:50:59 +05308015 ARRAY_SIZE(msm_int_compress_capture_dai) +
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308016 ARRAY_SIZE(msm_common_be_dai_links) +
8017 ARRAY_SIZE(msm_tavil_be_dai_links) +
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308018 ARRAY_SIZE(msm_tasha_be_dai_links) +
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308019 ARRAY_SIZE(msm_wcn_be_dai_links) +
8020 ARRAY_SIZE(ext_disp_be_dai_link) +
8021 ARRAY_SIZE(msm_mi2s_be_dai_links) +
8022 ARRAY_SIZE(msm_auxpcm_be_dai_links) +
8023 ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) +
8024 ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links)];
8025
8026static int msm_snd_card_tavil_late_probe(struct snd_soc_card *card)
8027{
8028 const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
8029 struct snd_soc_pcm_runtime *rtd;
Meng Wang56a0f8f2018-09-06 18:17:30 +08008030 struct snd_soc_component *component;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308031 int ret = 0;
8032 void *mbhc_calibration;
8033
8034 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
8035 if (!rtd) {
8036 dev_err(card->dev,
8037 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
8038 __func__, be_dl_name);
8039 ret = -EINVAL;
8040 goto err_pcm_runtime;
8041 }
8042
Meng Wang56a0f8f2018-09-06 18:17:30 +08008043 component = snd_soc_rtdcom_lookup(rtd, "tavil_codec");
8044 if (!component) {
8045 pr_err("%s: component is NULL\n", __func__);
8046 ret = -EINVAL;
8047 goto err_pcm_runtime;
8048 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308049 mbhc_calibration = def_wcd_mbhc_cal();
8050 if (!mbhc_calibration) {
8051 ret = -ENOMEM;
8052 goto err_mbhc_cal;
8053 }
8054 wcd_mbhc_cfg.calibration = mbhc_calibration;
Meng Wang56a0f8f2018-09-06 18:17:30 +08008055 ret = tavil_mbhc_hs_detect(component, &wcd_mbhc_cfg);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308056 if (ret) {
8057 dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n",
8058 __func__, ret);
8059 goto err_hs_detect;
8060 }
8061 return 0;
8062
8063err_hs_detect:
8064 kfree(mbhc_calibration);
8065err_mbhc_cal:
8066err_pcm_runtime:
8067 return ret;
8068}
8069
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308070static int msm_snd_card_tasha_late_probe(struct snd_soc_card *card)
8071{
8072 const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
8073 struct snd_soc_pcm_runtime *rtd;
8074 struct snd_soc_component *component;
8075 int ret = 0;
8076 void *mbhc_calibration;
8077
8078 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
8079 if (!rtd) {
8080 dev_err(card->dev,
8081 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
8082 __func__, be_dl_name);
8083 ret = -EINVAL;
8084 goto err_pcm_runtime;
8085 }
8086
8087 component = snd_soc_rtdcom_lookup(rtd, "tasha_codec");
8088 if (!component) {
8089 pr_err("%s: component is NULL\n", __func__);
8090 ret = -EINVAL;
8091 goto err_pcm_runtime;
8092 }
8093
8094 mbhc_calibration = def_wcd_mbhc_cal();
8095 if (!mbhc_calibration) {
8096 ret = -ENOMEM;
8097 goto err_mbhc_cal;
8098 }
8099 wcd_mbhc_cfg.calibration = mbhc_calibration;
8100 ret = tasha_mbhc_hs_detect(component, &wcd_mbhc_cfg);
8101 if (ret) {
8102 dev_err(card->dev, "%s: mbhc hs detect failed, err:%d\n",
8103 __func__, ret);
8104 goto err_hs_detect;
8105 }
8106 return 0;
8107
8108err_hs_detect:
8109 kfree(mbhc_calibration);
8110err_mbhc_cal:
8111err_pcm_runtime:
8112 return ret;
8113}
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308114
8115static int msm_populate_dai_link_component_of_node(
8116 struct snd_soc_card *card)
8117{
8118 int i, index, ret = 0;
8119 struct device *cdev = card->dev;
8120 struct snd_soc_dai_link *dai_link = card->dai_link;
8121 struct device_node *np;
8122
8123 if (!cdev) {
8124 pr_err("%s: Sound card device memory NULL\n", __func__);
8125 return -ENODEV;
8126 }
8127
8128 for (i = 0; i < card->num_links; i++) {
8129 if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node)
8130 continue;
8131
8132 /* populate platform_of_node for snd card dai links */
8133 if (dai_link[i].platform_name &&
8134 !dai_link[i].platform_of_node) {
8135 index = of_property_match_string(cdev->of_node,
8136 "asoc-platform-names",
8137 dai_link[i].platform_name);
8138 if (index < 0) {
8139 pr_err("%s: No match found for platform name: %s\n",
8140 __func__, dai_link[i].platform_name);
8141 ret = index;
8142 goto err;
8143 }
8144 np = of_parse_phandle(cdev->of_node, "asoc-platform",
8145 index);
8146 if (!np) {
8147 pr_err("%s: retrieving phandle for platform %s, index %d failed\n",
8148 __func__, dai_link[i].platform_name,
8149 index);
8150 ret = -ENODEV;
8151 goto err;
8152 }
8153 dai_link[i].platform_of_node = np;
8154 dai_link[i].platform_name = NULL;
8155 }
8156
8157 /* populate cpu_of_node for snd card dai links */
8158 if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) {
8159 index = of_property_match_string(cdev->of_node,
8160 "asoc-cpu-names",
8161 dai_link[i].cpu_dai_name);
8162 if (index >= 0) {
8163 np = of_parse_phandle(cdev->of_node, "asoc-cpu",
8164 index);
8165 if (!np) {
8166 pr_err("%s: retrieving phandle for cpu dai %s failed\n",
8167 __func__,
8168 dai_link[i].cpu_dai_name);
8169 ret = -ENODEV;
8170 goto err;
8171 }
8172 dai_link[i].cpu_of_node = np;
8173 dai_link[i].cpu_dai_name = NULL;
8174 }
8175 }
8176
8177 /* populate codec_of_node for snd card dai links */
8178 if (dai_link[i].codec_name && !dai_link[i].codec_of_node) {
8179 index = of_property_match_string(cdev->of_node,
8180 "asoc-codec-names",
8181 dai_link[i].codec_name);
8182 if (index < 0)
8183 continue;
8184 np = of_parse_phandle(cdev->of_node, "asoc-codec",
8185 index);
8186 if (!np) {
8187 pr_err("%s: retrieving phandle for codec %s failed\n",
8188 __func__, dai_link[i].codec_name);
8189 ret = -ENODEV;
8190 goto err;
8191 }
8192 dai_link[i].codec_of_node = np;
8193 dai_link[i].codec_name = NULL;
8194 }
8195 }
8196
8197err:
8198 return ret;
8199}
8200
8201static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd)
8202{
8203 int ret = 0;
Meng Wang56a0f8f2018-09-06 18:17:30 +08008204 struct snd_soc_component *component =
8205 snd_soc_rtdcom_lookup(rtd, "msm-stub-codec");
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308206
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308207 ret = snd_soc_add_component_controls(component, msm_ext_snd_controls,
8208 ARRAY_SIZE(msm_ext_snd_controls));
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308209 if (ret < 0) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08008210 dev_err(component->dev,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308211 "%s: add_codec_controls failed, err = %d\n",
8212 __func__, ret);
8213 return ret;
8214 }
8215
8216 return 0;
8217}
8218
8219static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream,
8220 struct snd_pcm_hw_params *params)
8221{
8222 struct snd_soc_pcm_runtime *rtd = substream->private_data;
8223 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
8224
8225 int ret = 0;
8226 unsigned int rx_ch[] = {144, 145, 146, 147, 148, 149, 150,
8227 151};
8228 unsigned int tx_ch[] = {128, 129, 130, 131, 132, 133,
8229 134, 135, 136, 137, 138, 139,
8230 140, 141, 142, 143};
8231
8232 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
8233 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
8234 slim_rx_cfg[SLIM_RX_0].channels,
8235 rx_ch);
8236 if (ret < 0)
8237 pr_err("%s: RX failed to set cpu chan map error %d\n",
8238 __func__, ret);
8239 } else {
8240 ret = snd_soc_dai_set_channel_map(cpu_dai,
8241 slim_tx_cfg[SLIM_TX_0].channels,
8242 tx_ch, 0, 0);
8243 if (ret < 0)
8244 pr_err("%s: TX failed to set cpu chan map error %d\n",
8245 __func__, ret);
8246 }
8247
8248 return ret;
8249}
8250
8251static struct snd_soc_ops msm_stub_be_ops = {
8252 .hw_params = msm_snd_stub_hw_params,
8253};
8254
8255static struct snd_soc_dai_link msm_stub_fe_dai_links[] = {
8256
8257 /* FrontEnd DAI Links */
8258 {
8259 .name = "MSMSTUB Media1",
8260 .stream_name = "MultiMedia1",
8261 .cpu_dai_name = "MultiMedia1",
8262 .platform_name = "msm-pcm-dsp.0",
8263 .dynamic = 1,
8264 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
8265 .dpcm_playback = 1,
8266 .dpcm_capture = 1,
8267 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
8268 SND_SOC_DPCM_TRIGGER_POST},
8269 .codec_dai_name = "snd-soc-dummy-dai",
8270 .codec_name = "snd-soc-dummy",
8271 .ignore_suspend = 1,
8272 /* this dainlink has playback support */
8273 .ignore_pmdown_time = 1,
8274 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
8275 },
8276};
8277
8278static struct snd_soc_dai_link msm_stub_be_dai_links[] = {
8279
8280 /* Backend DAI Links */
8281 {
8282 .name = LPASS_BE_SLIMBUS_0_RX,
8283 .stream_name = "Slimbus Playback",
8284 .cpu_dai_name = "msm-dai-q6-dev.16384",
8285 .platform_name = "msm-pcm-routing",
8286 .codec_name = "msm-stub-codec.1",
8287 .codec_dai_name = "msm-stub-rx",
8288 .no_pcm = 1,
8289 .dpcm_playback = 1,
8290 .id = MSM_BACKEND_DAI_SLIMBUS_0_RX,
8291 .init = &msm_audrx_stub_init,
8292 .be_hw_params_fixup = msm_be_hw_params_fixup,
8293 .ignore_pmdown_time = 1, /* dai link has playback support */
8294 .ignore_suspend = 1,
8295 .ops = &msm_stub_be_ops,
8296 },
8297 {
8298 .name = LPASS_BE_SLIMBUS_0_TX,
8299 .stream_name = "Slimbus Capture",
8300 .cpu_dai_name = "msm-dai-q6-dev.16385",
8301 .platform_name = "msm-pcm-routing",
8302 .codec_name = "msm-stub-codec.1",
8303 .codec_dai_name = "msm-stub-tx",
8304 .no_pcm = 1,
8305 .dpcm_capture = 1,
8306 .id = MSM_BACKEND_DAI_SLIMBUS_0_TX,
8307 .be_hw_params_fixup = msm_be_hw_params_fixup,
8308 .ignore_suspend = 1,
8309 .ops = &msm_stub_be_ops,
8310 },
8311};
8312
8313static struct snd_soc_dai_link msm_stub_dai_links[
8314 ARRAY_SIZE(msm_stub_fe_dai_links) +
8315 ARRAY_SIZE(msm_stub_be_dai_links)];
8316
8317struct snd_soc_card snd_soc_card_stub_msm = {
8318 .name = "sm6150-stub-snd-card",
8319};
8320
8321static const struct of_device_id sm6150_asoc_machine_of_match[] = {
8322 { .compatible = "qcom,sm6150-asoc-snd",
8323 .data = "codec"},
8324 { .compatible = "qcom,sm6150-asoc-snd-stub",
8325 .data = "stub_codec"},
8326 {},
8327};
8328
8329static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
8330{
8331 struct snd_soc_card *card = NULL;
8332 struct snd_soc_dai_link *dailink;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308333 int total_links = 0, rc = 0;
8334 u32 tavil_codec = 0, auxpcm_audio_intf = 0;
8335 u32 mi2s_audio_intf = 0, ext_disp_audio_intf = 0;
8336 u32 wcn_btfm_intf = 0;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308337 const struct of_device_id *match;
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308338 u32 tasha_codec = 0;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308339
8340 match = of_match_node(sm6150_asoc_machine_of_match, dev->of_node);
8341 if (!match) {
8342 dev_err(dev, "%s: No DT match found for sound card\n",
8343 __func__);
8344 return NULL;
8345 }
8346
8347 if (!strcmp(match->data, "codec")) {
8348 card = &snd_soc_card_sm6150_msm;
8349 memcpy(msm_sm6150_dai_links + total_links,
8350 msm_common_dai_links,
8351 sizeof(msm_common_dai_links));
8352
8353 total_links += ARRAY_SIZE(msm_common_dai_links);
8354
8355 memcpy(msm_sm6150_dai_links + total_links,
8356 msm_common_misc_fe_dai_links,
8357 sizeof(msm_common_misc_fe_dai_links));
8358
8359 total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links);
8360
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308361 rc = of_property_read_u32(dev->of_node, "qcom,tavil_codec",
8362 &tavil_codec);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308363 if (rc)
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308364 dev_dbg(dev, "%s: No DT match for tavil codec\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308365 __func__);
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308366
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308367 rc = of_property_read_u32(dev->of_node, "qcom,tasha_codec",
8368 &tasha_codec);
8369 if (rc)
8370 dev_dbg(dev, "%s: No DT match for tasha codec\n",
8371 __func__);
8372
8373 if (tavil_codec) {
8374 card->late_probe =
8375 msm_snd_card_tavil_late_probe;
8376 memcpy(msm_sm6150_dai_links + total_links,
8377 msm_tavil_fe_dai_links,
8378 sizeof(msm_tavil_fe_dai_links));
8379 total_links +=
8380 ARRAY_SIZE(msm_tavil_fe_dai_links);
8381 } else if (tasha_codec) {
8382 card->late_probe =
8383 msm_snd_card_tasha_late_probe;
8384 memcpy(msm_sm6150_dai_links + total_links,
8385 msm_tasha_fe_dai_links,
8386 sizeof(msm_tasha_fe_dai_links));
8387 total_links +=
8388 ARRAY_SIZE(msm_tasha_fe_dai_links);
8389 } else {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308390 memcpy(msm_sm6150_dai_links + total_links,
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308391 msm_bolero_fe_dai_links,
8392 sizeof(msm_bolero_fe_dai_links));
8393 total_links +=
8394 ARRAY_SIZE(msm_bolero_fe_dai_links);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308395 }
8396
8397 memcpy(msm_sm6150_dai_links + total_links,
Md Mansoor Ahmedfc755592018-11-29 11:50:59 +05308398 msm_int_compress_capture_dai,
8399 sizeof(msm_int_compress_capture_dai));
8400
8401 total_links += ARRAY_SIZE(msm_int_compress_capture_dai);
8402
8403 memcpy(msm_sm6150_dai_links + total_links,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308404 msm_common_be_dai_links,
8405 sizeof(msm_common_be_dai_links));
8406
8407 total_links += ARRAY_SIZE(msm_common_be_dai_links);
8408
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308409 if (tavil_codec) {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308410 memcpy(msm_sm6150_dai_links + total_links,
8411 msm_tavil_be_dai_links,
8412 sizeof(msm_tavil_be_dai_links));
8413 total_links += ARRAY_SIZE(msm_tavil_be_dai_links);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05308414 } else if (tasha_codec) {
8415 memcpy(msm_sm6150_dai_links + total_links,
8416 msm_tasha_be_dai_links,
8417 sizeof(msm_tasha_be_dai_links));
8418 total_links += ARRAY_SIZE(msm_tasha_be_dai_links);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308419 } else {
8420 memcpy(msm_sm6150_dai_links + total_links,
8421 msm_wsa_cdc_dma_be_dai_links,
8422 sizeof(msm_wsa_cdc_dma_be_dai_links));
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308423 total_links +=
8424 ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308425
8426 memcpy(msm_sm6150_dai_links + total_links,
8427 msm_rx_tx_cdc_dma_be_dai_links,
8428 sizeof(msm_rx_tx_cdc_dma_be_dai_links));
8429 total_links +=
8430 ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links);
8431 }
8432
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308433 rc = of_property_read_u32(dev->of_node,
8434 "qcom,ext-disp-audio-rx",
8435 &ext_disp_audio_intf);
8436 if (rc) {
8437 dev_dbg(dev, "%s: No DT match Ext Disp interface\n",
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308438 __func__);
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308439 } else {
Rohit kumare5a1d4f2018-09-17 11:36:25 +05308440 if (ext_disp_audio_intf) {
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308441 memcpy(msm_sm6150_dai_links + total_links,
8442 ext_disp_be_dai_link,
8443 sizeof(ext_disp_be_dai_link));
8444 total_links +=
8445 ARRAY_SIZE(ext_disp_be_dai_link);
8446 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308447 }
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308448
8449 rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf",
8450 &mi2s_audio_intf);
8451 if (rc) {
8452 dev_dbg(dev, "%s: No DT match MI2S audio interface\n",
8453 __func__);
8454 } else {
8455 if (mi2s_audio_intf) {
8456 memcpy(msm_sm6150_dai_links + total_links,
8457 msm_mi2s_be_dai_links,
8458 sizeof(msm_mi2s_be_dai_links));
8459 total_links +=
8460 ARRAY_SIZE(msm_mi2s_be_dai_links);
8461 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308462 }
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308463
8464
8465 rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm",
8466 &wcn_btfm_intf);
8467 if (rc) {
8468 dev_dbg(dev, "%s: No DT match wcn btfm interface\n",
8469 __func__);
8470 } else {
8471 if (wcn_btfm_intf) {
8472 memcpy(msm_sm6150_dai_links + total_links,
8473 msm_wcn_be_dai_links,
8474 sizeof(msm_wcn_be_dai_links));
8475 total_links +=
8476 ARRAY_SIZE(msm_wcn_be_dai_links);
8477 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308478 }
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308479
8480 rc = of_property_read_u32(dev->of_node,
8481 "qcom,auxpcm-audio-intf",
8482 &auxpcm_audio_intf);
8483 if (rc) {
8484 dev_dbg(dev, "%s: No DT match Aux PCM interface\n",
8485 __func__);
8486 } else {
8487 if (auxpcm_audio_intf) {
8488 memcpy(msm_sm6150_dai_links + total_links,
8489 msm_auxpcm_be_dai_links,
8490 sizeof(msm_auxpcm_be_dai_links));
8491 total_links +=
8492 ARRAY_SIZE(msm_auxpcm_be_dai_links);
8493 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308494 }
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308495
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308496 dailink = msm_sm6150_dai_links;
8497 } else if (!strcmp(match->data, "stub_codec")) {
8498 card = &snd_soc_card_stub_msm;
8499
8500 memcpy(msm_stub_dai_links + total_links,
8501 msm_stub_fe_dai_links,
8502 sizeof(msm_stub_fe_dai_links));
8503 total_links += ARRAY_SIZE(msm_stub_fe_dai_links);
8504
8505 memcpy(msm_stub_dai_links + total_links,
8506 msm_stub_be_dai_links,
8507 sizeof(msm_stub_be_dai_links));
8508 total_links += ARRAY_SIZE(msm_stub_be_dai_links);
8509
8510 dailink = msm_stub_dai_links;
8511 }
8512
8513 if (card) {
8514 card->dai_link = dailink;
8515 card->num_links = total_links;
8516 }
8517
8518 return card;
8519}
8520
8521static int msm_wsa881x_init(struct snd_soc_component *component)
8522{
8523 u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
8524 u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
8525 u8 spkleft_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP,
8526 SPKR_L_BOOST, SPKR_L_VI};
8527 u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
8528 SPKR_R_BOOST, SPKR_R_VI};
8529 unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
8530 unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308531 struct msm_asoc_mach_data *pdata;
8532 struct snd_soc_dapm_context *dapm;
Aditya Bavanari4ae32fc2018-08-13 13:08:34 +05308533 struct snd_card *card = component->card->snd_card;
8534 struct snd_info_entry *entry;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308535 int ret = 0;
8536
Meng Wang56a0f8f2018-09-06 18:17:30 +08008537 if (!component) {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308538 pr_err("%s codec is NULL\n", __func__);
8539 return -EINVAL;
8540 }
8541
Meng Wang56a0f8f2018-09-06 18:17:30 +08008542 dapm = snd_soc_component_get_dapm(component);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308543
8544 if (!strcmp(component->name_prefix, "SpkrLeft")) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08008545 dev_dbg(component->dev, "%s: setting left ch map to codec %s\n",
8546 __func__, component->name);
8547 wsa881x_set_channel_map(component, &spkleft_ports[0],
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308548 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
8549 &ch_rate[0], &spkleft_port_types[0]);
8550 if (dapm->component) {
8551 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
8552 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR");
8553 }
8554 } else if (!strcmp(component->name_prefix, "SpkrRight")) {
Meng Wang56a0f8f2018-09-06 18:17:30 +08008555 dev_dbg(component->dev, "%s: setting right ch map to codec %s\n",
8556 __func__, component->name);
8557 wsa881x_set_channel_map(component, &spkright_ports[0],
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308558 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
8559 &ch_rate[0], &spkright_port_types[0]);
8560 if (dapm->component) {
8561 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
8562 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR");
8563 }
8564 } else {
Meng Wang56a0f8f2018-09-06 18:17:30 +08008565 dev_err(component->dev, "%s: wrong codec name %s\n", __func__,
8566 component->name);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308567 ret = -EINVAL;
8568 goto err;
8569 }
8570 pdata = snd_soc_card_get_drvdata(component->card);
Aditya Bavanari4ae32fc2018-08-13 13:08:34 +05308571 if (!pdata->codec_root) {
8572 entry = snd_info_create_subdir(card->module, "codecs",
8573 card->proc_root);
8574 if (!entry) {
8575 pr_err("%s: Cannot create codecs module entry\n",
8576 __func__);
8577 ret = 0;
8578 goto err;
8579 }
8580 pdata->codec_root = entry;
8581 }
8582 wsa881x_codec_info_create_codec_entry(pdata->codec_root,
Meng Wang56a0f8f2018-09-06 18:17:30 +08008583 component);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308584err:
8585 return ret;
8586}
8587
8588static int msm_aux_codec_init(struct snd_soc_component *component)
8589{
Meng Wang56a0f8f2018-09-06 18:17:30 +08008590 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
Ramprasad Katkam997da402018-08-17 20:20:06 +05308591 int ret = 0;
8592 void *mbhc_calibration;
Aditya Bavanari4ae32fc2018-08-13 13:08:34 +05308593 struct snd_info_entry *entry;
8594 struct snd_card *card = component->card->snd_card;
8595 struct msm_asoc_mach_data *pdata;
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308596
8597 snd_soc_dapm_ignore_suspend(dapm, "EAR");
8598 snd_soc_dapm_ignore_suspend(dapm, "AUX");
8599 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
8600 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
8601 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
8602 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
8603 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05308604 snd_soc_dapm_sync(dapm);
8605
Aditya Bavanari4ae32fc2018-08-13 13:08:34 +05308606 pdata = snd_soc_card_get_drvdata(component->card);
8607 if (!pdata->codec_root) {
8608 entry = snd_info_create_subdir(card->module, "codecs",
8609 card->proc_root);
8610 if (!entry) {
8611 pr_err("%s: Cannot create codecs module entry\n",
8612 __func__);
8613 ret = 0;
8614 goto codec_root_err;
8615 }
8616 pdata->codec_root = entry;
8617 }
Meng Wang56a0f8f2018-09-06 18:17:30 +08008618 wcd937x_info_create_codec_entry(pdata->codec_root, component);
Aditya Bavanari4ae32fc2018-08-13 13:08:34 +05308619codec_root_err:
Ramprasad Katkam997da402018-08-17 20:20:06 +05308620 mbhc_calibration = def_wcd_mbhc_cal();
8621 if (!mbhc_calibration) {
8622 return -ENOMEM;
8623 }
8624 wcd_mbhc_cfg.calibration = mbhc_calibration;
Meng Wang56a0f8f2018-09-06 18:17:30 +08008625 ret = wcd937x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
Ramprasad Katkam997da402018-08-17 20:20:06 +05308626
8627 return ret;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308628}
8629
8630static int msm_init_aux_dev(struct platform_device *pdev,
8631 struct snd_soc_card *card)
8632{
8633 struct device_node *wsa_of_node;
8634 struct device_node *aux_codec_of_node;
8635 u32 wsa_max_devs;
8636 u32 wsa_dev_cnt;
Aditya Bavanari32b3e5e2018-12-04 17:19:56 +05308637 u32 codec_max_aux_devs = 0;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308638 u32 codec_aux_dev_cnt = 0;
8639 int i;
Md Mansoor Ahmed2382aaa2018-11-20 11:06:32 +05308640 struct msm_wsa881x_dev_info *wsa881x_dev_info = NULL;
8641 struct aux_codec_dev_info *aux_cdc_dev_info = NULL;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308642 const char *auxdev_name_prefix[1];
8643 char *dev_name_str = NULL;
8644 int found = 0;
8645 int codecs_found = 0;
8646 int ret = 0;
8647
8648 /* Get maximum WSA device count for this platform */
8649 ret = of_property_read_u32(pdev->dev.of_node,
8650 "qcom,wsa-max-devs", &wsa_max_devs);
8651 if (ret) {
Aditya Bavanariec279c72018-11-22 15:52:25 +05308652 dev_err(&pdev->dev,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308653 "%s: wsa-max-devs property missing in DT %s, ret = %d\n",
8654 __func__, pdev->dev.of_node->full_name, ret);
8655 wsa_max_devs = 0;
8656 goto codec_aux_dev;
8657 }
8658 if (wsa_max_devs == 0) {
Aditya Bavanariec279c72018-11-22 15:52:25 +05308659 dev_dbg(&pdev->dev,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308660 "%s: Max WSA devices is 0 for this target?\n",
8661 __func__);
8662 goto codec_aux_dev;
8663 }
8664
8665 /* Get count of WSA device phandles for this platform */
8666 wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node,
8667 "qcom,wsa-devs", NULL);
8668 if (wsa_dev_cnt == -ENOENT) {
8669 dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n",
8670 __func__);
8671 goto err;
8672 } else if (wsa_dev_cnt <= 0) {
8673 dev_err(&pdev->dev,
8674 "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n",
8675 __func__, wsa_dev_cnt);
8676 ret = -EINVAL;
8677 goto err;
8678 }
8679
8680 /*
8681 * Expect total phandles count to be NOT less than maximum possible
8682 * WSA count. However, if it is less, then assign same value to
8683 * max count as well.
8684 */
8685 if (wsa_dev_cnt < wsa_max_devs) {
8686 dev_dbg(&pdev->dev,
8687 "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n",
8688 __func__, wsa_max_devs, wsa_dev_cnt);
8689 wsa_max_devs = wsa_dev_cnt;
8690 }
8691
8692 /* Make sure prefix string passed for each WSA device */
8693 ret = of_property_count_strings(pdev->dev.of_node,
8694 "qcom,wsa-aux-dev-prefix");
8695 if (ret != wsa_dev_cnt) {
8696 dev_err(&pdev->dev,
8697 "%s: expecting %d wsa prefix. Defined only %d in DT\n",
8698 __func__, wsa_dev_cnt, ret);
8699 ret = -EINVAL;
8700 goto err;
8701 }
8702
8703 /*
8704 * Alloc mem to store phandle and index info of WSA device, if already
8705 * registered with ALSA core
8706 */
8707 wsa881x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
8708 sizeof(struct msm_wsa881x_dev_info),
8709 GFP_KERNEL);
8710 if (!wsa881x_dev_info) {
8711 ret = -ENOMEM;
8712 goto err;
8713 }
8714
8715 /*
8716 * search and check whether all WSA devices are already
8717 * registered with ALSA core or not. If found a node, store
8718 * the node and the index in a local array of struct for later
8719 * use.
8720 */
8721 for (i = 0; i < wsa_dev_cnt; i++) {
8722 wsa_of_node = of_parse_phandle(pdev->dev.of_node,
8723 "qcom,wsa-devs", i);
8724 if (unlikely(!wsa_of_node)) {
8725 /* we should not be here */
8726 dev_err(&pdev->dev,
8727 "%s: wsa dev node is not present\n",
8728 __func__);
8729 ret = -EINVAL;
8730 goto err;
8731 }
Aditya Bavanari849a5fd2018-12-04 15:51:56 +05308732 if (soc_find_component_locked(wsa_of_node, NULL)) {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308733 /* WSA device registered with ALSA core */
8734 wsa881x_dev_info[found].of_node = wsa_of_node;
8735 wsa881x_dev_info[found].index = i;
8736 found++;
8737 if (found == wsa_max_devs)
8738 break;
8739 }
8740 }
8741
8742 if (found < wsa_max_devs) {
8743 dev_dbg(&pdev->dev,
8744 "%s: failed to find %d components. Found only %d\n",
8745 __func__, wsa_max_devs, found);
8746 return -EPROBE_DEFER;
8747 }
8748 dev_info(&pdev->dev,
8749 "%s: found %d wsa881x devices registered with ALSA core\n",
8750 __func__, found);
8751
8752codec_aux_dev:
Aditya Bavanari054e70e2019-01-25 19:34:16 +05308753 if (!strnstr(card->name, "tavil", strlen(card->name)) &&
8754 !strnstr(card->name, "tasha", strlen(card->name))) {
Aditya Bavanariec279c72018-11-22 15:52:25 +05308755 /* Get maximum aux codec device count for this platform */
8756 ret = of_property_read_u32(pdev->dev.of_node,
8757 "qcom,codec-max-aux-devs",
8758 &codec_max_aux_devs);
8759 if (ret) {
8760 dev_err(&pdev->dev,
8761 "%s: codec-max-aux-devs property missing in DT %s, ret = %d\n",
8762 __func__, pdev->dev.of_node->full_name, ret);
8763 codec_max_aux_devs = 0;
8764 goto aux_dev_register;
8765 }
8766 if (codec_max_aux_devs == 0) {
8767 dev_dbg(&pdev->dev,
8768 "%s: Max aux codec devices is 0 for this target?\n",
8769 __func__);
8770 goto aux_dev_register;
8771 }
8772
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308773 /* Get count of aux codec device phandles for this platform */
8774 codec_aux_dev_cnt = of_count_phandle_with_args(
8775 pdev->dev.of_node,
8776 "qcom,codec-aux-devs", NULL);
8777 if (codec_aux_dev_cnt == -ENOENT) {
8778 dev_warn(&pdev->dev, "%s: No aux codec defined in DT.\n",
8779 __func__);
8780 goto err;
8781 } else if (codec_aux_dev_cnt <= 0) {
8782 dev_err(&pdev->dev,
8783 "%s: Error reading aux codec device from DT, dev_cnt=%d\n",
8784 __func__, codec_aux_dev_cnt);
8785 ret = -EINVAL;
8786 goto err;
8787 }
8788
8789 /*
Aditya Bavanariec279c72018-11-22 15:52:25 +05308790 * Expect total phandles count to be NOT less than maximum possible
8791 * AUX device count. However, if it is less, then assign same value to
8792 * max count as well.
8793 */
8794 if (codec_aux_dev_cnt < codec_max_aux_devs) {
8795 dev_dbg(&pdev->dev,
8796 "%s: codec_max_aux_devs = %d cannot exceed codec_aux_dev_cnt = %d\n",
8797 __func__, codec_max_aux_devs,
8798 codec_aux_dev_cnt);
8799 codec_max_aux_devs = codec_aux_dev_cnt;
8800 }
8801
8802 /*
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308803 * Alloc mem to store phandle and index info of aux codec
8804 * if already registered with ALSA core
8805 */
Aditya Bavanariec279c72018-11-22 15:52:25 +05308806 aux_cdc_dev_info = devm_kcalloc(&pdev->dev, codec_max_aux_devs,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308807 sizeof(struct aux_codec_dev_info),
8808 GFP_KERNEL);
8809 if (!aux_cdc_dev_info) {
8810 ret = -ENOMEM;
8811 goto err;
8812 }
8813
8814 /*
8815 * search and check whether all aux codecs are already
8816 * registered with ALSA core or not. If found a node, store
8817 * the node and the index in a local array of struct for later
8818 * use.
8819 */
8820 for (i = 0; i < codec_aux_dev_cnt; i++) {
8821 aux_codec_of_node = of_parse_phandle(pdev->dev.of_node,
8822 "qcom,codec-aux-devs", i);
8823 if (unlikely(!aux_codec_of_node)) {
8824 /* we should not be here */
8825 dev_err(&pdev->dev,
8826 "%s: aux codec dev node is not present\n",
8827 __func__);
8828 ret = -EINVAL;
8829 goto err;
8830 }
Aditya Bavanari849a5fd2018-12-04 15:51:56 +05308831 if (soc_find_component_locked(aux_codec_of_node, NULL)) {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308832 /* AUX codec registered with ALSA core */
8833 aux_cdc_dev_info[codecs_found].of_node =
8834 aux_codec_of_node;
8835 aux_cdc_dev_info[codecs_found].index = i;
8836 codecs_found++;
8837 }
8838 }
8839
Aditya Bavanariec279c72018-11-22 15:52:25 +05308840 if (codecs_found < codec_max_aux_devs) {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308841 dev_dbg(&pdev->dev,
8842 "%s: failed to find %d components. Found only %d\n",
Aditya Bavanariec279c72018-11-22 15:52:25 +05308843 __func__, codec_max_aux_devs, codecs_found);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308844 return -EPROBE_DEFER;
8845 }
8846 dev_info(&pdev->dev,
8847 "%s: found %d AUX codecs registered with ALSA core\n",
8848 __func__, codecs_found);
8849
8850 }
8851
Aditya Bavanariec279c72018-11-22 15:52:25 +05308852aux_dev_register:
8853 card->num_aux_devs = wsa_max_devs + codec_max_aux_devs;
8854 card->num_configs = wsa_max_devs + codec_max_aux_devs;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308855
8856 /* Alloc array of AUX devs struct */
8857 msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs,
8858 sizeof(struct snd_soc_aux_dev),
8859 GFP_KERNEL);
8860 if (!msm_aux_dev) {
8861 ret = -ENOMEM;
8862 goto err;
8863 }
8864
8865 /* Alloc array of codec conf struct */
8866 msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_configs,
8867 sizeof(struct snd_soc_codec_conf),
8868 GFP_KERNEL);
8869 if (!msm_codec_conf) {
8870 ret = -ENOMEM;
8871 goto err;
8872 }
8873
8874 for (i = 0; i < wsa_max_devs; i++) {
8875 dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN,
8876 GFP_KERNEL);
8877 if (!dev_name_str) {
8878 ret = -ENOMEM;
8879 goto err;
8880 }
8881
8882 ret = of_property_read_string_index(pdev->dev.of_node,
8883 "qcom,wsa-aux-dev-prefix",
8884 wsa881x_dev_info[i].index,
8885 auxdev_name_prefix);
8886 if (ret) {
8887 dev_err(&pdev->dev,
8888 "%s: failed to read wsa aux dev prefix, ret = %d\n",
8889 __func__, ret);
8890 ret = -EINVAL;
8891 goto err;
8892 }
8893
8894 snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i);
8895 msm_aux_dev[i].name = dev_name_str;
8896 msm_aux_dev[i].codec_name = NULL;
8897 msm_aux_dev[i].codec_of_node =
8898 wsa881x_dev_info[i].of_node;
8899 msm_aux_dev[i].init = msm_wsa881x_init;
8900 msm_codec_conf[i].dev_name = NULL;
8901 msm_codec_conf[i].name_prefix = auxdev_name_prefix[0];
8902 msm_codec_conf[i].of_node =
8903 wsa881x_dev_info[i].of_node;
8904 }
8905
8906 for (i = 0; i < codec_aux_dev_cnt; i++) {
Aditya Bavanariec279c72018-11-22 15:52:25 +05308907 msm_aux_dev[wsa_max_devs + i].name = "aux_codec";
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308908 msm_aux_dev[wsa_max_devs + i].codec_name = NULL;
8909 msm_aux_dev[wsa_max_devs + i].codec_of_node =
8910 aux_cdc_dev_info[i].of_node;
8911 msm_aux_dev[wsa_max_devs + i].init = msm_aux_codec_init;
8912 msm_codec_conf[wsa_max_devs + i].dev_name = NULL;
8913 msm_codec_conf[wsa_max_devs + i].name_prefix =
8914 NULL;
8915 msm_codec_conf[wsa_max_devs + i].of_node =
8916 aux_cdc_dev_info[i].of_node;
8917 }
8918
8919 card->codec_conf = msm_codec_conf;
8920 card->aux_dev = msm_aux_dev;
8921err:
8922 return ret;
8923}
8924
8925static void msm_i2s_auxpcm_init(struct platform_device *pdev)
8926{
8927 int count;
8928 u32 mi2s_master_slave[MI2S_MAX];
Aditya Bavanari353a5832018-11-22 15:10:32 +05308929 u32 mi2s_ext_mclk[MI2S_MAX];
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308930 int ret;
8931
8932 for (count = 0; count < MI2S_MAX; count++) {
8933 mutex_init(&mi2s_intf_conf[count].lock);
8934 mi2s_intf_conf[count].ref_cnt = 0;
8935 }
8936
8937 ret = of_property_read_u32_array(pdev->dev.of_node,
8938 "qcom,msm-mi2s-master",
8939 mi2s_master_slave, MI2S_MAX);
8940 if (ret) {
8941 dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n",
8942 __func__);
8943 } else {
8944 for (count = 0; count < MI2S_MAX; count++) {
8945 mi2s_intf_conf[count].msm_is_mi2s_master =
8946 mi2s_master_slave[count];
8947 }
8948 }
Aditya Bavanari353a5832018-11-22 15:10:32 +05308949
8950 ret = of_property_read_u32_array(pdev->dev.of_node,
8951 "qcom,msm-mi2s-ext-mclk",
8952 mi2s_ext_mclk, MI2S_MAX);
8953 if (ret) {
8954 dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-ext-mclk in DT node\n",
8955 __func__);
8956 } else {
8957 for (count = 0; count < MI2S_MAX; count++)
8958 mi2s_intf_conf[count].msm_is_ext_mclk =
8959 mi2s_ext_mclk[count];
8960 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308961}
8962
8963static void msm_i2s_auxpcm_deinit(void)
8964{
8965 int count;
8966
8967 for (count = 0; count < MI2S_MAX; count++) {
8968 mutex_destroy(&mi2s_intf_conf[count].lock);
8969 mi2s_intf_conf[count].ref_cnt = 0;
8970 mi2s_intf_conf[count].msm_is_mi2s_master = 0;
Aditya Bavanari353a5832018-11-22 15:10:32 +05308971 mi2s_intf_conf[count].msm_is_ext_mclk = 0;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05308972 }
8973}
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05308974
8975static int sm6150_ssr_enable(struct device *dev, void *data)
8976{
8977 struct platform_device *pdev = to_platform_device(dev);
8978 struct snd_soc_card *card = platform_get_drvdata(pdev);
Meng Wang56a0f8f2018-09-06 18:17:30 +08008979 struct msm_asoc_mach_data *pdata = NULL;
8980 struct snd_soc_component *component = NULL;
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05308981 int ret = 0;
8982
8983 if (!card) {
8984 dev_err(dev, "%s: card is NULL\n", __func__);
8985 ret = -EINVAL;
8986 goto err;
8987 }
8988
Aditya Bavanari054e70e2019-01-25 19:34:16 +05308989 if (strnstr(card->name, "tavil", strlen(card->name)) ||
8990 strnstr(card->name, "tasha", strlen(card->name))) {
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05308991 pdata = snd_soc_card_get_drvdata(card);
8992 if (!pdata->is_afe_config_done) {
8993 const char *be_dl_name = LPASS_BE_SLIMBUS_0_RX;
8994 struct snd_soc_pcm_runtime *rtd;
8995
8996 rtd = snd_soc_get_pcm_runtime(card, be_dl_name);
8997 if (!rtd) {
8998 dev_err(dev,
8999 "%s: snd_soc_get_pcm_runtime for %s failed!\n",
9000 __func__, be_dl_name);
9001 ret = -EINVAL;
9002 goto err;
9003 }
Meng Wang56a0f8f2018-09-06 18:17:30 +08009004 component = snd_soc_rtdcom_lookup(rtd, "tavil_codec");
9005 if (!component) {
9006 dev_err(dev, "%s: component is NULL\n",
9007 __func__);
9008 ret = -EINVAL;
9009 goto err;
9010 }
9011 ret = msm_afe_set_config(component);
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05309012 if (ret)
9013 dev_err(dev, "%s: Failed to set AFE config. err %d\n",
9014 __func__, ret);
9015 else
9016 pdata->is_afe_config_done = true;
9017 }
9018 }
9019 snd_soc_card_change_online_state(card, 1);
9020 dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__);
9021
9022err:
9023 return ret;
9024}
9025
9026static void sm6150_ssr_disable(struct device *dev, void *data)
9027{
9028 struct platform_device *pdev = to_platform_device(dev);
9029 struct snd_soc_card *card = platform_get_drvdata(pdev);
9030 struct msm_asoc_mach_data *pdata;
9031
9032 if (!card) {
9033 dev_err(dev, "%s: card is NULL\n", __func__);
9034 return;
9035 }
9036
9037 dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__);
9038 snd_soc_card_change_online_state(card, 0);
9039
Aditya Bavanari054e70e2019-01-25 19:34:16 +05309040 if (strnstr(card->name, "tavil", strlen(card->name)) ||
9041 strnstr(card->name, "tasha", strlen(card->name))) {
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05309042 pdata = snd_soc_card_get_drvdata(card);
9043 msm_afe_clear_config();
9044 pdata->is_afe_config_done = false;
9045 }
9046}
9047
Aditya Bavanari45e2e652019-01-11 20:18:55 +05309048static int msm_ext_prepare_hifi(struct msm_asoc_mach_data *pdata)
9049{
9050 int ret = 0;
9051
9052 if (gpio_is_valid(pdata->hph_en1_gpio)) {
9053 pr_debug("%s: hph_en1_gpio request %d\n", __func__,
9054 pdata->hph_en1_gpio);
9055 ret = gpio_request(pdata->hph_en1_gpio, "hph_en1_gpio");
9056 if (ret) {
9057 pr_err("%s: hph_en1_gpio request failed, ret:%d\n",
9058 __func__, ret);
9059 goto err;
9060 }
9061 }
9062 if (gpio_is_valid(pdata->hph_en0_gpio)) {
9063 pr_debug("%s: hph_en0_gpio request %d\n", __func__,
9064 pdata->hph_en0_gpio);
9065 ret = gpio_request(pdata->hph_en0_gpio, "hph_en0_gpio");
9066 if (ret)
9067 pr_err("%s: hph_en0_gpio request failed, ret:%d\n",
9068 __func__, ret);
9069 }
9070
9071err:
9072 return ret;
9073}
9074
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05309075static const struct snd_event_ops sm6150_ssr_ops = {
9076 .enable = sm6150_ssr_enable,
9077 .disable = sm6150_ssr_disable,
9078};
9079
9080static int msm_audio_ssr_compare(struct device *dev, void *data)
9081{
9082 struct device_node *node = data;
9083
9084 dev_dbg(dev, "%s: dev->of_node = 0x%p, node = 0x%p\n",
9085 __func__, dev->of_node, node);
9086 return (dev->of_node && dev->of_node == node);
9087}
9088
9089static int msm_audio_ssr_register(struct device *dev)
9090{
9091 struct device_node *np = dev->of_node;
9092 struct snd_event_clients *ssr_clients = NULL;
9093 struct device_node *node;
9094 int ret;
9095 int i;
9096
9097 for (i = 0; ; i++) {
9098 node = of_parse_phandle(np, "qcom,msm_audio_ssr_devs", i);
9099 if (!node)
9100 break;
9101 snd_event_mstr_add_client(&ssr_clients,
9102 msm_audio_ssr_compare, node);
9103 }
9104
9105 ret = snd_event_master_register(dev, &sm6150_ssr_ops,
9106 ssr_clients, NULL);
9107 if (!ret)
9108 snd_event_notify(dev, SND_EVENT_UP);
9109
9110 return ret;
9111}
9112
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309113static int msm_asoc_machine_probe(struct platform_device *pdev)
9114{
9115 struct snd_soc_card *card;
9116 struct msm_asoc_mach_data *pdata;
9117 const char *mbhc_audio_jack_type = NULL;
9118 int ret;
9119
9120 if (!pdev->dev.of_node) {
9121 dev_err(&pdev->dev, "No platform supplied from device tree\n");
9122 return -EINVAL;
9123 }
9124
9125 pdata = devm_kzalloc(&pdev->dev,
9126 sizeof(struct msm_asoc_mach_data), GFP_KERNEL);
9127 if (!pdata)
9128 return -ENOMEM;
9129
9130 card = populate_snd_card_dailinks(&pdev->dev);
9131 if (!card) {
9132 dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
9133 ret = -EINVAL;
9134 goto err;
9135 }
9136 card->dev = &pdev->dev;
9137 platform_set_drvdata(pdev, card);
9138 snd_soc_card_set_drvdata(card, pdata);
9139
9140 ret = snd_soc_of_parse_card_name(card, "qcom,model");
9141 if (ret) {
9142 dev_err(&pdev->dev, "parse card name failed, err:%d\n",
9143 ret);
9144 goto err;
9145 }
9146
9147 ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
9148 if (ret) {
9149 dev_err(&pdev->dev, "parse audio routing failed, err:%d\n",
9150 ret);
9151 goto err;
9152 }
9153
9154 ret = msm_populate_dai_link_component_of_node(card);
9155 if (ret) {
9156 ret = -EPROBE_DEFER;
9157 goto err;
9158 }
9159
9160 ret = msm_init_aux_dev(pdev, card);
9161 if (ret)
9162 goto err;
9163
9164 ret = devm_snd_soc_register_card(&pdev->dev, card);
9165 if (ret == -EPROBE_DEFER) {
9166 if (codec_reg_done)
9167 ret = -EINVAL;
9168 goto err;
9169 } else if (ret) {
9170 dev_err(&pdev->dev, "snd_soc_register_card failed (%d)\n",
9171 ret);
9172 goto err;
9173 }
9174 dev_info(&pdev->dev, "Sound card %s registered\n", card->name);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309175
Aditya Bavanari45e2e652019-01-11 20:18:55 +05309176 pdata->hph_en1_gpio = of_get_named_gpio(pdev->dev.of_node,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309177 "qcom,hph-en1-gpio", 0);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05309178 if (!gpio_is_valid(pdata->hph_en1_gpio))
9179 pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node,
9180 "qcom,hph-en1-gpio", 0);
9181 if (!gpio_is_valid(pdata->hph_en1_gpio) && (!pdata->hph_en1_gpio_p)) {
9182 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9183 "qcom,hph-en1-gpio", pdev->dev.of_node->full_name);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309184 }
9185
Aditya Bavanari45e2e652019-01-11 20:18:55 +05309186 pdata->hph_en0_gpio = of_get_named_gpio(pdev->dev.of_node,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309187 "qcom,hph-en0-gpio", 0);
Aditya Bavanari45e2e652019-01-11 20:18:55 +05309188 if (!gpio_is_valid(pdata->hph_en0_gpio))
9189 pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node,
9190 "qcom,hph-en0-gpio", 0);
9191 if (!gpio_is_valid(pdata->hph_en0_gpio) && (!pdata->hph_en0_gpio_p)) {
9192 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9193 "qcom,hph-en0-gpio", pdev->dev.of_node->full_name);
9194 }
9195
9196 ret = msm_ext_prepare_hifi(pdata);
9197 if (ret) {
9198 dev_dbg(&pdev->dev, "msm_ext_prepare_hifi failed (%d)\n",
9199 ret);
9200 ret = 0;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309201 }
9202
9203 ret = of_property_read_string(pdev->dev.of_node,
9204 "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type);
9205 if (ret) {
9206 dev_dbg(&pdev->dev, "Looking up %s property in node %s failed\n",
9207 "qcom,mbhc-audio-jack-type",
9208 pdev->dev.of_node->full_name);
9209 dev_dbg(&pdev->dev, "Jack type properties set to default\n");
Aditya Bavanari353a5832018-11-22 15:10:32 +05309210 ret = 0;
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309211 } else {
9212 if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) {
9213 wcd_mbhc_cfg.enable_anc_mic_detect = false;
9214 dev_dbg(&pdev->dev, "This hardware has 4 pole jack");
9215 } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) {
9216 wcd_mbhc_cfg.enable_anc_mic_detect = true;
9217 dev_dbg(&pdev->dev, "This hardware has 5 pole jack");
9218 } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) {
9219 wcd_mbhc_cfg.enable_anc_mic_detect = true;
9220 dev_dbg(&pdev->dev, "This hardware has 6 pole jack");
9221 } else {
9222 wcd_mbhc_cfg.enable_anc_mic_detect = false;
9223 dev_dbg(&pdev->dev, "Unknown value, set to default\n");
9224 }
9225 }
Aditya Bavanari353a5832018-11-22 15:10:32 +05309226
9227 pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
9228 "qcom,pri-mi2s-gpios", 0);
9229 pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
9230 "qcom,sec-mi2s-gpios", 0);
9231 pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
9232 "qcom,tert-mi2s-gpios", 0);
9233 pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
9234 "qcom,quat-mi2s-gpios", 0);
9235 pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
9236 "qcom,quin-mi2s-gpios", 0);
9237
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309238 /*
9239 * Parse US-Euro gpio info from DT. Report no error if us-euro
9240 * entry is not found in DT file as some targets do not support
9241 * US-Euro detection
9242 */
9243 pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node,
9244 "qcom,us-euro-gpios", 0);
9245 if (!pdata->us_euro_gpio_p) {
9246 dev_dbg(&pdev->dev, "property %s not detected in node %s",
9247 "qcom,us-euro-gpios", pdev->dev.of_node->full_name);
9248 } else {
9249 dev_dbg(&pdev->dev, "%s detected\n",
9250 "qcom,us-euro-gpios");
9251 wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic;
9252 }
Vatsal Bucha6cb17a02018-08-07 11:07:04 +05309253
9254 if (wcd_mbhc_cfg.enable_usbc_analog) {
9255 wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic;
9256
9257 pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node,
9258 "fsa4480-i2c-handle", 0);
9259 if (!pdata->fsa_handle)
9260 dev_err(&pdev->dev,
9261 "property %s not detected in node %s\n",
9262 "fsa4480-i2c-handle",
9263 pdev->dev.of_node->full_name);
9264 }
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309265
9266 msm_i2s_auxpcm_init(pdev);
Aditya Bavanari054e70e2019-01-25 19:34:16 +05309267 if (!strnstr(card->name, "tavil", strlen(card->name)) &&
9268 !strnstr(card->name, "tasha", strlen(card->name))) {
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309269 pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node,
9270 "qcom,cdc-dmic01-gpios",
9271 0);
9272 pdata->dmic23_gpio_p = of_parse_phandle(pdev->dev.of_node,
9273 "qcom,cdc-dmic23-gpios",
9274 0);
9275 }
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05309276
9277 ret = msm_audio_ssr_register(&pdev->dev);
9278 if (ret)
9279 pr_err("%s: Registration with SND event FWK failed ret = %d\n",
9280 __func__, ret);
9281
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309282err:
9283 return ret;
9284}
9285
9286static int msm_asoc_machine_remove(struct platform_device *pdev)
9287{
Vaishnavi Kommaraju9a3d5eb2018-09-19 18:16:39 +05309288 snd_event_master_deregister(&pdev->dev);
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309289 msm_i2s_auxpcm_deinit();
9290
9291 return 0;
9292}
9293
9294static struct platform_driver sm6150_asoc_machine_driver = {
9295 .driver = {
9296 .name = DRV_NAME,
9297 .owner = THIS_MODULE,
9298 .pm = &snd_soc_pm_ops,
9299 .of_match_table = sm6150_asoc_machine_of_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08009300 .suppress_bind_attrs = true,
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309301 },
9302 .probe = msm_asoc_machine_probe,
9303 .remove = msm_asoc_machine_remove,
9304};
Rahul Sharmaa070ce52018-11-19 15:45:27 +05309305
9306int __init sm6150_init(void)
9307{
9308 pr_debug("%s\n", __func__);
9309 return platform_driver_register(&sm6150_asoc_machine_driver);
9310}
9311
9312void sm6150_exit(void)
9313{
9314 pr_debug("%s\n", __func__);
9315 platform_driver_unregister(&sm6150_asoc_machine_driver);
9316}
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309317
Aditya Bavanari0b26ab32018-08-03 23:53:01 +05309318MODULE_DESCRIPTION("ALSA SoC SM6150 Machine driver");
Aditya Bavanari44eb8952018-05-09 19:01:50 +05309319MODULE_LICENSE("GPL v2");
9320MODULE_ALIAS("platform:" DRV_NAME);
9321MODULE_DEVICE_TABLE(of, sm6150_asoc_machine_of_match);