blob: 63ee94869d59357e736c9e7617f9750ba59444b1 [file] [log] [blame]
Meng Wang688a8672019-01-29 13:43:33 +08001// SPDX-License-Identifier: GPL-2.0-only
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07002/*
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07004 */
5
6#include <linux/clk.h>
7#include <linux/delay.h>
8#include <linux/gpio.h>
9#include <linux/of_gpio.h>
10#include <linux/platform_device.h>
11#include <linux/slab.h>
12#include <linux/io.h>
13#include <linux/module.h>
14#include <linux/input.h>
15#include <linux/of_device.h>
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080016#include <linux/soc/qcom/fsa4480-i2c.h>
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070017#include <sound/core.h>
18#include <sound/soc.h>
19#include <sound/soc-dapm.h>
20#include <sound/pcm.h>
21#include <sound/pcm_params.h>
22#include <sound/info.h>
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070023#include <soc/snd_event.h>
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070024#include <dsp/audio_notifier.h>
Karthikeyan Mani7eef68e2018-12-13 17:45:02 -080025#include <soc/swr-common.h>
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070026#include <dsp/q6afe-v2.h>
27#include <dsp/q6core.h>
28#include "device_event.h"
29#include "msm-pcm-routing-v2.h"
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070030#include "asoc/msm-cdc-pinctrl.h"
31#include "asoc/wcd-mbhc-v2.h"
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080032#include "codecs/wcd938x/wcd938x-mbhc.h"
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070033#include "codecs/wsa881x.h"
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080034#include "codecs/wcd938x/wcd938x.h"
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070035#include "codecs/bolero/bolero-cdc.h"
36#include <dt-bindings/sound/audio-codec-port-types.h>
37#include "codecs/bolero/wsa-macro.h"
Vatsal Bucha82b30ba2019-04-17 12:43:54 +053038#include "kona-port-config.h"
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070039
40#define DRV_NAME "kona-asoc-snd"
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070041#define __CHIPSET__ "KONA "
42#define MSM_DAILINK_NAME(name) (__CHIPSET__#name)
43
44#define SAMPLING_RATE_8KHZ 8000
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070045#define SAMPLING_RATE_11P025KHZ 11025
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -070046#define SAMPLING_RATE_16KHZ 16000
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070047#define SAMPLING_RATE_22P05KHZ 22050
48#define SAMPLING_RATE_32KHZ 32000
49#define SAMPLING_RATE_44P1KHZ 44100
50#define SAMPLING_RATE_48KHZ 48000
51#define SAMPLING_RATE_88P2KHZ 88200
52#define SAMPLING_RATE_96KHZ 96000
53#define SAMPLING_RATE_176P4KHZ 176400
54#define SAMPLING_RATE_192KHZ 192000
55#define SAMPLING_RATE_352P8KHZ 352800
56#define SAMPLING_RATE_384KHZ 384000
57
Karthikeyan Mani5eb13422018-11-05 13:49:17 -080058#define WCD9XXX_MBHC_DEF_RLOADS 5
59#define WCD9XXX_MBHC_DEF_BUTTONS 8
60#define CODEC_EXT_CLK_RATE 9600000
61#define ADSP_STATE_READY_TIMEOUT_MS 3000
62#define DEV_NAME_STR_LEN 32
63#define WCD_MBHC_HS_V_MAX 1600
64
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070065#define TDM_CHANNEL_MAX 8
66#define DEV_NAME_STR_LEN 32
67
68#define MSM_LL_QOS_VALUE 300 /* time in us to ensure LPM doesn't go in C3/C4 */
69
70#define ADSP_STATE_READY_TIMEOUT_MS 3000
71
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070072#define WSA8810_NAME_1 "wsa881x.20170211"
73#define WSA8810_NAME_2 "wsa881x.20170212"
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -080074#define WCN_CDC_SLIM_RX_CH_MAX 2
75#define WCN_CDC_SLIM_TX_CH_MAX 2
Vatsal Bucha82b30ba2019-04-17 12:43:54 +053076#define WCN_CDC_SLIM_TX_CH_MAX_LITO 3
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -070077
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070078enum {
79 TDM_0 = 0,
80 TDM_1,
81 TDM_2,
82 TDM_3,
83 TDM_4,
84 TDM_5,
85 TDM_6,
86 TDM_7,
87 TDM_PORT_MAX,
88};
89
90enum {
91 TDM_PRI = 0,
92 TDM_SEC,
93 TDM_TERT,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -080094 TDM_QUAT,
95 TDM_QUIN,
96 TDM_SEN,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -070097 TDM_INTERFACE_MAX,
98};
99
100enum {
101 PRIM_AUX_PCM = 0,
102 SEC_AUX_PCM,
103 TERT_AUX_PCM,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800104 QUAT_AUX_PCM,
105 QUIN_AUX_PCM,
106 SEN_AUX_PCM,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700107 AUX_PCM_MAX,
108};
109
110enum {
111 PRIM_MI2S = 0,
112 SEC_MI2S,
113 TERT_MI2S,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800114 QUAT_MI2S,
115 QUIN_MI2S,
116 SEN_MI2S,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700117 MI2S_MAX,
118};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700119
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700120enum {
121 WSA_CDC_DMA_RX_0 = 0,
122 WSA_CDC_DMA_RX_1,
123 RX_CDC_DMA_RX_0,
124 RX_CDC_DMA_RX_1,
125 RX_CDC_DMA_RX_2,
126 RX_CDC_DMA_RX_3,
127 RX_CDC_DMA_RX_5,
128 CDC_DMA_RX_MAX,
129};
130
131enum {
132 WSA_CDC_DMA_TX_0 = 0,
133 WSA_CDC_DMA_TX_1,
134 WSA_CDC_DMA_TX_2,
135 TX_CDC_DMA_TX_0,
136 TX_CDC_DMA_TX_3,
137 TX_CDC_DMA_TX_4,
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800138 VA_CDC_DMA_TX_0,
139 VA_CDC_DMA_TX_1,
140 VA_CDC_DMA_TX_2,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700141 CDC_DMA_TX_MAX,
142};
143
Banajit Goswami83a370d2019-03-05 16:15:21 -0800144enum {
145 SLIM_RX_7 = 0,
146 SLIM_RX_MAX,
147};
148enum {
149 SLIM_TX_7 = 0,
Vatsal Bucha82b30ba2019-04-17 12:43:54 +0530150 SLIM_TX_8,
Banajit Goswami83a370d2019-03-05 16:15:21 -0800151 SLIM_TX_MAX,
152};
153
Meng Wange8e53822019-03-18 10:49:50 +0800154enum {
155 AFE_LOOPBACK_TX_IDX = 0,
156 AFE_LOOPBACK_TX_IDX_MAX,
157};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700158struct msm_asoc_mach_data {
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700159 struct snd_info_entry *codec_root;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700160 int usbc_en2_gpio; /* used by gpio driver API */
161 struct device_node *dmic01_gpio_p; /* used by pinctrl API */
162 struct device_node *dmic23_gpio_p; /* used by pinctrl API */
163 struct device_node *dmic45_gpio_p; /* used by pinctrl API */
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800164 struct device_node *mi2s_gpio_p[MI2S_MAX]; /* used by pinctrl API */
165 atomic_t mi2s_gpio_ref_count[MI2S_MAX]; /* used by pinctrl API */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700166 struct device_node *us_euro_gpio_p; /* used by pinctrl API */
167 struct pinctrl *usbc_en2_gpio_p; /* used by pinctrl API */
168 struct device_node *hph_en1_gpio_p; /* used by pinctrl API */
169 struct device_node *hph_en0_gpio_p; /* used by pinctrl API */
170 bool is_afe_config_done;
Karthikeyan Mani5eb13422018-11-05 13:49:17 -0800171 struct device_node *fsa_handle;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700172};
173
174struct tdm_port {
175 u32 mode;
176 u32 channel;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700177};
178
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800179enum {
180 EXT_DISP_RX_IDX_DP = 0,
181 EXT_DISP_RX_IDX_MAX,
182};
183
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700184struct msm_wsa881x_dev_info {
185 struct device_node *of_node;
186 u32 index;
187};
188
189struct aux_codec_dev_info {
190 struct device_node *of_node;
191 u32 index;
192};
193
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700194struct dev_config {
195 u32 sample_rate;
196 u32 bit_format;
197 u32 channels;
198};
199
Banajit Goswami83a370d2019-03-05 16:15:21 -0800200/* Default configuration of slimbus channels */
201static struct dev_config slim_rx_cfg[] = {
202 [SLIM_RX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
203};
204
205static struct dev_config slim_tx_cfg[] = {
206 [SLIM_TX_7] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vatsal Bucha82b30ba2019-04-17 12:43:54 +0530207 [SLIM_TX_8] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Banajit Goswami83a370d2019-03-05 16:15:21 -0800208};
209
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800210/* Default configuration of external display BE */
211static struct dev_config ext_disp_rx_cfg[] = {
212 [EXT_DISP_RX_IDX_DP] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
213};
214
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700215static struct dev_config usb_rx_cfg = {
216 .sample_rate = SAMPLING_RATE_48KHZ,
217 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
218 .channels = 2,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700219};
220
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700221static struct dev_config usb_tx_cfg = {
222 .sample_rate = SAMPLING_RATE_48KHZ,
223 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
224 .channels = 1,
225};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700226
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700227static struct dev_config proxy_rx_cfg = {
228 .sample_rate = SAMPLING_RATE_48KHZ,
229 .bit_format = SNDRV_PCM_FORMAT_S16_LE,
230 .channels = 2,
231};
232
233static struct afe_clk_set mi2s_clk[MI2S_MAX] = {
234 {
235 AFE_API_VERSION_I2S_CONFIG,
236 Q6AFE_LPASS_CLK_ID_PRI_MI2S_IBIT,
237 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
238 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
239 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
240 0,
241 },
242 {
243 AFE_API_VERSION_I2S_CONFIG,
244 Q6AFE_LPASS_CLK_ID_SEC_MI2S_IBIT,
245 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
246 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
247 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
248 0,
249 },
250 {
251 AFE_API_VERSION_I2S_CONFIG,
252 Q6AFE_LPASS_CLK_ID_TER_MI2S_IBIT,
253 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
254 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
255 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
256 0,
257 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800258 {
259 AFE_API_VERSION_I2S_CONFIG,
260 Q6AFE_LPASS_CLK_ID_QUAD_MI2S_IBIT,
261 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
262 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
263 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
264 0,
265 },
266 {
267 AFE_API_VERSION_I2S_CONFIG,
268 Q6AFE_LPASS_CLK_ID_QUI_MI2S_IBIT,
269 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
270 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
271 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
272 0,
273 },
274 {
275 AFE_API_VERSION_I2S_CONFIG,
276 Q6AFE_LPASS_CLK_ID_SEN_MI2S_IBIT,
277 Q6AFE_LPASS_IBIT_CLK_1_P536_MHZ,
278 Q6AFE_LPASS_CLK_ATTRIBUTE_COUPLE_NO,
279 Q6AFE_LPASS_CLK_ROOT_DEFAULT,
280 0,
281 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700282};
283
284struct mi2s_conf {
285 struct mutex lock;
286 u32 ref_cnt;
287 u32 msm_is_mi2s_master;
288};
289
290static u32 mi2s_ebit_clk[MI2S_MAX] = {
291 Q6AFE_LPASS_CLK_ID_PRI_MI2S_EBIT,
292 Q6AFE_LPASS_CLK_ID_SEC_MI2S_EBIT,
293 Q6AFE_LPASS_CLK_ID_TER_MI2S_EBIT,
294};
295
296static struct mi2s_conf mi2s_intf_conf[MI2S_MAX];
297
298/* Default configuration of TDM channels */
299static struct dev_config tdm_rx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
300 { /* PRI TDM */
301 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
302 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
303 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
304 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
305 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
306 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
307 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
308 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
309 },
310 { /* SEC TDM */
311 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
312 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
313 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
314 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
315 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
316 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
317 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
318 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
319 },
320 { /* TERT TDM */
321 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
322 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
323 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
324 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
325 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
326 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
327 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
328 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
329 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800330 { /* QUAT TDM */
331 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
332 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
333 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
334 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
335 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
336 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
337 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
338 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
339 },
340 { /* QUIN TDM */
341 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
342 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
343 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
344 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
345 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
346 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
347 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
348 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
349 },
350 { /* SEN TDM */
351 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_0 */
352 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_1 */
353 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_2 */
354 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_3 */
355 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_4 */
356 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_5 */
357 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_6 */
358 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* RX_7 */
359 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700360};
361
362static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
363 { /* PRI TDM */
364 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
365 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
366 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
367 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
368 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
369 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
370 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
371 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
372 },
373 { /* SEC TDM */
374 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
375 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
376 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
377 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
378 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
379 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
380 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
381 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
382 },
383 { /* TERT TDM */
384 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
385 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
386 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
387 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
388 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
389 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
390 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
391 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
392 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800393 { /* QUAT TDM */
394 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
395 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
396 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
397 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
398 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
399 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
400 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
401 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
402 },
403 { /* QUIN TDM */
404 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
405 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
406 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
407 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
408 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
409 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
410 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
411 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
412 },
413 { /* SEN TDM */
414 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_0 */
415 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_1 */
416 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_2 */
417 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_3 */
418 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_4 */
419 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_5 */
420 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_6 */
421 {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
422 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700423};
424
425/* Default configuration of AUX PCM channels */
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700426static struct dev_config aux_pcm_rx_cfg[] = {
427 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700428 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
429 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800430 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
431 [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
432 [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700433};
434
435static struct dev_config aux_pcm_tx_cfg[] = {
436 [PRIM_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700437 [SEC_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
438 [TERT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800439 [QUAT_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
440 [QUIN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
441 [SEN_AUX_PCM] = {SAMPLING_RATE_8KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700442};
443
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700444/* Default configuration of MI2S channels */
445static struct dev_config mi2s_rx_cfg[] = {
446 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
447 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
448 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800449 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
450 [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
451 [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700452};
453
454static struct dev_config mi2s_tx_cfg[] = {
455 [PRIM_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
456 [SEC_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
457 [TERT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800458 [QUAT_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
459 [QUIN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
460 [SEN_MI2S] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700461};
462
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700463/* Default configuration of Codec DMA Interface RX */
464static struct dev_config cdc_dma_rx_cfg[] = {
465 [WSA_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
466 [WSA_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
467 [RX_CDC_DMA_RX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
468 [RX_CDC_DMA_RX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
469 [RX_CDC_DMA_RX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
470 [RX_CDC_DMA_RX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
471 [RX_CDC_DMA_RX_5] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
472};
473
474/* Default configuration of Codec DMA Interface TX */
475static struct dev_config cdc_dma_tx_cfg[] = {
476 [WSA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
477 [WSA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
478 [WSA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
479 [TX_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
480 [TX_CDC_DMA_TX_3] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
481 [TX_CDC_DMA_TX_4] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800482 [VA_CDC_DMA_TX_0] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8},
483 [VA_CDC_DMA_TX_1] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8},
484 [VA_CDC_DMA_TX_2] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 8},
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700485};
486
Meng Wange8e53822019-03-18 10:49:50 +0800487static struct dev_config afe_loopback_tx_cfg[] = {
488 [AFE_LOOPBACK_TX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1},
489};
490
Meng Wangd1db67c2019-04-17 12:41:34 +0800491static int msm_vi_feed_tx_ch = 2;
492static const char *const vi_feed_ch_text[] = {"One", "Two"};
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700493static char const *bit_format_text[] = {"S16_LE", "S24_LE", "S24_3LE",
494 "S32_LE"};
495static char const *ch_text[] = {"Two", "Three", "Four", "Five",
496 "Six", "Seven", "Eight"};
497static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
498 "KHZ_16", "KHZ_22P05",
499 "KHZ_32", "KHZ_44P1", "KHZ_48",
500 "KHZ_88P2", "KHZ_96", "KHZ_176P4",
501 "KHZ_192", "KHZ_352P8", "KHZ_384"};
502static const char *const usb_ch_text[] = {"One", "Two", "Three", "Four",
503 "Five", "Six", "Seven",
504 "Eight"};
505static char const *tdm_sample_rate_text[] = {"KHZ_8", "KHZ_16", "KHZ_32",
506 "KHZ_48", "KHZ_176P4",
507 "KHZ_352P8"};
508static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"};
509static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
510 "Five", "Six", "Seven", "Eight"};
511static const char *const auxpcm_rate_text[] = {"KHZ_8", "KHZ_16"};
512static char const *mi2s_rate_text[] = {"KHZ_8", "KHZ_11P025", "KHZ_16",
513 "KHZ_22P05", "KHZ_32", "KHZ_44P1",
514 "KHZ_48", "KHZ_96", "KHZ_192"};
515static const char *const mi2s_ch_text[] = {"One", "Two", "Three", "Four",
516 "Five", "Six", "Seven",
517 "Eight"};
518
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700519static const char *const cdc_dma_rx_ch_text[] = {"One", "Two"};
520static const char *const cdc_dma_tx_ch_text[] = {"One", "Two", "Three", "Four",
521 "Five", "Six", "Seven",
522 "Eight"};
523static char const *cdc_dma_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
524 "KHZ_16", "KHZ_22P05",
525 "KHZ_32", "KHZ_44P1", "KHZ_48",
526 "KHZ_88P2", "KHZ_96",
527 "KHZ_176P4", "KHZ_192",
528 "KHZ_352P8", "KHZ_384"};
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800529static char const *ext_disp_bit_format_text[] = {"S16_LE", "S24_LE",
530 "S24_3LE"};
531static char const *ext_disp_sample_rate_text[] = {"KHZ_48", "KHZ_96",
532 "KHZ_192", "KHZ_32", "KHZ_44P1",
533 "KHZ_88P2", "KHZ_176P4"};
Banajit Goswami83a370d2019-03-05 16:15:21 -0800534static char const *bt_sample_rate_text[] = {"KHZ_8", "KHZ_16",
535 "KHZ_44P1", "KHZ_48",
536 "KHZ_88P2", "KHZ_96"};
537static char const *bt_sample_rate_rx_text[] = {"KHZ_8", "KHZ_16",
538 "KHZ_44P1", "KHZ_48",
539 "KHZ_88P2", "KHZ_96"};
540static char const *bt_sample_rate_tx_text[] = {"KHZ_8", "KHZ_16",
541 "KHZ_44P1", "KHZ_48",
542 "KHZ_88P2", "KHZ_96"};
Meng Wange8e53822019-03-18 10:49:50 +0800543static const char *const afe_loopback_tx_ch_text[] = {"One", "Two"};
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700544
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700545static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text);
546static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text);
547static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text);
548static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text);
549static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text);
550static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text);
Meng Wangd1db67c2019-04-17 12:41:34 +0800551static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700552static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text);
553static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_sample_rate, tdm_sample_rate_text);
554static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_sample_rate, tdm_sample_rate_text);
555static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_format, tdm_bit_format_text);
556static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_format, tdm_bit_format_text);
557static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text);
558static SOC_ENUM_SINGLE_EXT_DECL(tdm_rx_chs, tdm_ch_text);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700559static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_rx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700560static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_rx_sample_rate, auxpcm_rate_text);
561static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_rx_sample_rate, auxpcm_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800562static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_rx_sample_rate, auxpcm_rate_text);
563static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_rx_sample_rate, auxpcm_rate_text);
564static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_rx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700565static SOC_ENUM_SINGLE_EXT_DECL(prim_aux_pcm_tx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700566static SOC_ENUM_SINGLE_EXT_DECL(sec_aux_pcm_tx_sample_rate, auxpcm_rate_text);
567static SOC_ENUM_SINGLE_EXT_DECL(tert_aux_pcm_tx_sample_rate, auxpcm_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800568static SOC_ENUM_SINGLE_EXT_DECL(quat_aux_pcm_tx_sample_rate, auxpcm_rate_text);
569static SOC_ENUM_SINGLE_EXT_DECL(quin_aux_pcm_tx_sample_rate, auxpcm_rate_text);
570static SOC_ENUM_SINGLE_EXT_DECL(sen_aux_pcm_tx_sample_rate, auxpcm_rate_text);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700571static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_rx_format, bit_format_text);
572static SOC_ENUM_SINGLE_EXT_DECL(aux_pcm_tx_format, bit_format_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700573static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_sample_rate, mi2s_rate_text);
574static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_sample_rate, mi2s_rate_text);
575static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_sample_rate, mi2s_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800576static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_sample_rate, mi2s_rate_text);
577static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_sample_rate, mi2s_rate_text);
578static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_sample_rate, mi2s_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700579static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_sample_rate, mi2s_rate_text);
580static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_sample_rate, mi2s_rate_text);
581static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_sample_rate, mi2s_rate_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800582static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_sample_rate, mi2s_rate_text);
583static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_sample_rate, mi2s_rate_text);
584static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_sample_rate, mi2s_rate_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700585static SOC_ENUM_SINGLE_EXT_DECL(mi2s_rx_format, bit_format_text);
586static SOC_ENUM_SINGLE_EXT_DECL(mi2s_tx_format, bit_format_text);
587static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_rx_chs, mi2s_ch_text);
588static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_rx_chs, mi2s_ch_text);
589static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_rx_chs, mi2s_ch_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800590static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_rx_chs, mi2s_ch_text);
591static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_rx_chs, mi2s_ch_text);
592static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_rx_chs, mi2s_ch_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700593static SOC_ENUM_SINGLE_EXT_DECL(prim_mi2s_tx_chs, mi2s_ch_text);
594static SOC_ENUM_SINGLE_EXT_DECL(sec_mi2s_tx_chs, mi2s_ch_text);
595static SOC_ENUM_SINGLE_EXT_DECL(tert_mi2s_tx_chs, mi2s_ch_text);
Karthikeyan Mani12dcf642019-01-29 11:21:15 -0800596static SOC_ENUM_SINGLE_EXT_DECL(quat_mi2s_tx_chs, mi2s_ch_text);
597static SOC_ENUM_SINGLE_EXT_DECL(quin_mi2s_tx_chs, mi2s_ch_text);
598static SOC_ENUM_SINGLE_EXT_DECL(sen_mi2s_tx_chs, mi2s_ch_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700599static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
600static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
601static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_chs, cdc_dma_rx_ch_text);
602static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_chs, cdc_dma_rx_ch_text);
603static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_chs, cdc_dma_rx_ch_text);
604static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_chs, cdc_dma_rx_ch_text);
605static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_chs, cdc_dma_rx_ch_text);
606static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
607static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text);
608static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text);
609static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
610static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_chs, cdc_dma_tx_ch_text);
611static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_chs, cdc_dma_tx_ch_text);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800612static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_chs, cdc_dma_tx_ch_text);
613static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_chs, cdc_dma_tx_ch_text);
614static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_chs, cdc_dma_tx_ch_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700615static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_format, bit_format_text);
616static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_format, bit_format_text);
617static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_format, bit_format_text);
618static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_format, bit_format_text);
619static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_format, bit_format_text);
620static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_format, bit_format_text);
621static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_format, bit_format_text);
622static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_format, bit_format_text);
623static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_format, bit_format_text);
624static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_format, bit_format_text);
625static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_format, bit_format_text);
626static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_format, bit_format_text);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800627static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_format, bit_format_text);
628static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_format, bit_format_text);
629static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_format, bit_format_text);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700630static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_0_sample_rate,
631 cdc_dma_sample_rate_text);
632static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_rx_1_sample_rate,
633 cdc_dma_sample_rate_text);
634static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_0_sample_rate,
635 cdc_dma_sample_rate_text);
636static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_1_sample_rate,
637 cdc_dma_sample_rate_text);
638static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_2_sample_rate,
639 cdc_dma_sample_rate_text);
640static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_3_sample_rate,
641 cdc_dma_sample_rate_text);
642static SOC_ENUM_SINGLE_EXT_DECL(rx_cdc_dma_rx_5_sample_rate,
643 cdc_dma_sample_rate_text);
644static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_0_sample_rate,
645 cdc_dma_sample_rate_text);
646static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_1_sample_rate,
647 cdc_dma_sample_rate_text);
648static SOC_ENUM_SINGLE_EXT_DECL(wsa_cdc_dma_tx_2_sample_rate,
649 cdc_dma_sample_rate_text);
650static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_0_sample_rate,
651 cdc_dma_sample_rate_text);
652static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_3_sample_rate,
653 cdc_dma_sample_rate_text);
654static SOC_ENUM_SINGLE_EXT_DECL(tx_cdc_dma_tx_4_sample_rate,
655 cdc_dma_sample_rate_text);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -0800656static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_0_sample_rate,
657 cdc_dma_sample_rate_text);
658static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_1_sample_rate,
659 cdc_dma_sample_rate_text);
660static SOC_ENUM_SINGLE_EXT_DECL(va_cdc_dma_tx_2_sample_rate,
661 cdc_dma_sample_rate_text);
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -0800662static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_chs, ch_text);
663static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_format, ext_disp_bit_format_text);
664static SOC_ENUM_SINGLE_EXT_DECL(ext_disp_rx_sample_rate,
665 ext_disp_sample_rate_text);
Banajit Goswami83a370d2019-03-05 16:15:21 -0800666static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
667static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_rx, bt_sample_rate_rx_text);
668static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_tx, bt_sample_rate_tx_text);
Meng Wange8e53822019-03-18 10:49:50 +0800669static SOC_ENUM_SINGLE_EXT_DECL(afe_loopback_tx_chs, afe_loopback_tx_ch_text);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700670
671static bool is_initial_boot;
672static bool codec_reg_done;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700673static struct snd_soc_aux_dev *msm_aux_dev;
674static struct snd_soc_codec_conf *msm_codec_conf;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700675static struct snd_soc_card snd_soc_card_kona_msm;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -0700676static int dmic_0_1_gpio_cnt;
677static int dmic_2_3_gpio_cnt;
678static int dmic_4_5_gpio_cnt;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700679
Karthikeyan Mani5eb13422018-11-05 13:49:17 -0800680static void *def_wcd_mbhc_cal(void);
681
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700682/*
683 * Need to report LINEIN
684 * if R/L channel impedance is larger than 5K ohm
685 */
686static struct wcd_mbhc_config wcd_mbhc_cfg = {
687 .read_fw_bin = false,
688 .calibration = NULL,
689 .detect_extn_cable = true,
690 .mono_stero_detection = false,
691 .swap_gnd_mic = NULL,
692 .hs_ext_micbias = true,
693 .key_code[0] = KEY_MEDIA,
694 .key_code[1] = KEY_VOICECOMMAND,
695 .key_code[2] = KEY_VOLUMEUP,
696 .key_code[3] = KEY_VOLUMEDOWN,
697 .key_code[4] = 0,
698 .key_code[5] = 0,
699 .key_code[6] = 0,
700 .key_code[7] = 0,
701 .linein_th = 5000,
702 .moisture_en = true,
703 .mbhc_micbias = MIC_BIAS_2,
704 .anc_micbias = MIC_BIAS_2,
705 .enable_anc_mic_detect = false,
706};
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700707
708static inline int param_is_mask(int p)
709{
710 return (p >= SNDRV_PCM_HW_PARAM_FIRST_MASK) &&
711 (p <= SNDRV_PCM_HW_PARAM_LAST_MASK);
712}
713
714static inline struct snd_mask *param_to_mask(struct snd_pcm_hw_params *p,
715 int n)
716{
717 return &(p->masks[n - SNDRV_PCM_HW_PARAM_FIRST_MASK]);
718}
719
720static void param_set_mask(struct snd_pcm_hw_params *p, int n,
721 unsigned int bit)
722{
723 if (bit >= SNDRV_MASK_MAX)
724 return;
725 if (param_is_mask(n)) {
726 struct snd_mask *m = param_to_mask(p, n);
727
728 m->bits[0] = 0;
729 m->bits[1] = 0;
730 m->bits[bit >> 5] |= (1 << (bit & 31));
731 }
732}
733
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700734static int usb_audio_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
735 struct snd_ctl_elem_value *ucontrol)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700736{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700737 int sample_rate_val = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700738
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700739 switch (usb_rx_cfg.sample_rate) {
740 case SAMPLING_RATE_384KHZ:
741 sample_rate_val = 12;
742 break;
743 case SAMPLING_RATE_352P8KHZ:
744 sample_rate_val = 11;
745 break;
746 case SAMPLING_RATE_192KHZ:
747 sample_rate_val = 10;
748 break;
749 case SAMPLING_RATE_176P4KHZ:
750 sample_rate_val = 9;
751 break;
752 case SAMPLING_RATE_96KHZ:
753 sample_rate_val = 8;
754 break;
755 case SAMPLING_RATE_88P2KHZ:
756 sample_rate_val = 7;
757 break;
758 case SAMPLING_RATE_48KHZ:
759 sample_rate_val = 6;
760 break;
761 case SAMPLING_RATE_44P1KHZ:
762 sample_rate_val = 5;
763 break;
764 case SAMPLING_RATE_32KHZ:
765 sample_rate_val = 4;
766 break;
767 case SAMPLING_RATE_22P05KHZ:
768 sample_rate_val = 3;
769 break;
770 case SAMPLING_RATE_16KHZ:
771 sample_rate_val = 2;
772 break;
773 case SAMPLING_RATE_11P025KHZ:
774 sample_rate_val = 1;
775 break;
776 case SAMPLING_RATE_8KHZ:
777 default:
778 sample_rate_val = 0;
779 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700780 }
781
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700782 ucontrol->value.integer.value[0] = sample_rate_val;
783 pr_debug("%s: usb_audio_rx_sample_rate = %d\n", __func__,
784 usb_rx_cfg.sample_rate);
785 return 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -0700786}
787
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700788static int usb_audio_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
789 struct snd_ctl_elem_value *ucontrol)
790{
791 switch (ucontrol->value.integer.value[0]) {
792 case 12:
793 usb_rx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
794 break;
795 case 11:
796 usb_rx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
797 break;
798 case 10:
799 usb_rx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
800 break;
801 case 9:
802 usb_rx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
803 break;
804 case 8:
805 usb_rx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
806 break;
807 case 7:
808 usb_rx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
809 break;
810 case 6:
811 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
812 break;
813 case 5:
814 usb_rx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
815 break;
816 case 4:
817 usb_rx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
818 break;
819 case 3:
820 usb_rx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
821 break;
822 case 2:
823 usb_rx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
824 break;
825 case 1:
826 usb_rx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
827 break;
828 case 0:
829 usb_rx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
830 break;
831 default:
832 usb_rx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
833 break;
834 }
835
836 pr_debug("%s: control value = %ld, usb_audio_rx_sample_rate = %d\n",
837 __func__, ucontrol->value.integer.value[0],
838 usb_rx_cfg.sample_rate);
839 return 0;
840}
841
842static int usb_audio_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
843 struct snd_ctl_elem_value *ucontrol)
844{
845 int sample_rate_val = 0;
846
847 switch (usb_tx_cfg.sample_rate) {
848 case SAMPLING_RATE_384KHZ:
849 sample_rate_val = 12;
850 break;
851 case SAMPLING_RATE_352P8KHZ:
852 sample_rate_val = 11;
853 break;
854 case SAMPLING_RATE_192KHZ:
855 sample_rate_val = 10;
856 break;
857 case SAMPLING_RATE_176P4KHZ:
858 sample_rate_val = 9;
859 break;
860 case SAMPLING_RATE_96KHZ:
861 sample_rate_val = 8;
862 break;
863 case SAMPLING_RATE_88P2KHZ:
864 sample_rate_val = 7;
865 break;
866 case SAMPLING_RATE_48KHZ:
867 sample_rate_val = 6;
868 break;
869 case SAMPLING_RATE_44P1KHZ:
870 sample_rate_val = 5;
871 break;
872 case SAMPLING_RATE_32KHZ:
873 sample_rate_val = 4;
874 break;
875 case SAMPLING_RATE_22P05KHZ:
876 sample_rate_val = 3;
877 break;
878 case SAMPLING_RATE_16KHZ:
879 sample_rate_val = 2;
880 break;
881 case SAMPLING_RATE_11P025KHZ:
882 sample_rate_val = 1;
883 break;
884 case SAMPLING_RATE_8KHZ:
885 sample_rate_val = 0;
886 break;
887 default:
888 sample_rate_val = 6;
889 break;
890 }
891
892 ucontrol->value.integer.value[0] = sample_rate_val;
893 pr_debug("%s: usb_audio_tx_sample_rate = %d\n", __func__,
894 usb_tx_cfg.sample_rate);
895 return 0;
896}
897
898static int usb_audio_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
899 struct snd_ctl_elem_value *ucontrol)
900{
901 switch (ucontrol->value.integer.value[0]) {
902 case 12:
903 usb_tx_cfg.sample_rate = SAMPLING_RATE_384KHZ;
904 break;
905 case 11:
906 usb_tx_cfg.sample_rate = SAMPLING_RATE_352P8KHZ;
907 break;
908 case 10:
909 usb_tx_cfg.sample_rate = SAMPLING_RATE_192KHZ;
910 break;
911 case 9:
912 usb_tx_cfg.sample_rate = SAMPLING_RATE_176P4KHZ;
913 break;
914 case 8:
915 usb_tx_cfg.sample_rate = SAMPLING_RATE_96KHZ;
916 break;
917 case 7:
918 usb_tx_cfg.sample_rate = SAMPLING_RATE_88P2KHZ;
919 break;
920 case 6:
921 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
922 break;
923 case 5:
924 usb_tx_cfg.sample_rate = SAMPLING_RATE_44P1KHZ;
925 break;
926 case 4:
927 usb_tx_cfg.sample_rate = SAMPLING_RATE_32KHZ;
928 break;
929 case 3:
930 usb_tx_cfg.sample_rate = SAMPLING_RATE_22P05KHZ;
931 break;
932 case 2:
933 usb_tx_cfg.sample_rate = SAMPLING_RATE_16KHZ;
934 break;
935 case 1:
936 usb_tx_cfg.sample_rate = SAMPLING_RATE_11P025KHZ;
937 break;
938 case 0:
939 usb_tx_cfg.sample_rate = SAMPLING_RATE_8KHZ;
940 break;
941 default:
942 usb_tx_cfg.sample_rate = SAMPLING_RATE_48KHZ;
943 break;
944 }
945
946 pr_debug("%s: control value = %ld, usb_audio_tx_sample_rate = %d\n",
947 __func__, ucontrol->value.integer.value[0],
948 usb_tx_cfg.sample_rate);
949 return 0;
950}
Meng Wange8e53822019-03-18 10:49:50 +0800951static int afe_loopback_tx_ch_get(struct snd_kcontrol *kcontrol,
952 struct snd_ctl_elem_value *ucontrol)
953{
954 pr_debug("%s: afe_loopback_tx_ch = %d\n", __func__,
955 afe_loopback_tx_cfg[0].channels);
956 ucontrol->value.enumerated.item[0] =
957 afe_loopback_tx_cfg[0].channels - 1;
958
959 return 0;
960}
961
962static int afe_loopback_tx_ch_put(struct snd_kcontrol *kcontrol,
963 struct snd_ctl_elem_value *ucontrol)
964{
965 afe_loopback_tx_cfg[0].channels =
966 ucontrol->value.enumerated.item[0] + 1;
967 pr_debug("%s: afe_loopback_tx_ch = %d\n", __func__,
968 afe_loopback_tx_cfg[0].channels);
969
970 return 1;
971}
Vignesh Kulothungan483a5592018-10-19 15:00:08 -0700972
973static int usb_audio_rx_format_get(struct snd_kcontrol *kcontrol,
974 struct snd_ctl_elem_value *ucontrol)
975{
976 switch (usb_rx_cfg.bit_format) {
977 case SNDRV_PCM_FORMAT_S32_LE:
978 ucontrol->value.integer.value[0] = 3;
979 break;
980 case SNDRV_PCM_FORMAT_S24_3LE:
981 ucontrol->value.integer.value[0] = 2;
982 break;
983 case SNDRV_PCM_FORMAT_S24_LE:
984 ucontrol->value.integer.value[0] = 1;
985 break;
986 case SNDRV_PCM_FORMAT_S16_LE:
987 default:
988 ucontrol->value.integer.value[0] = 0;
989 break;
990 }
991
992 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
993 __func__, usb_rx_cfg.bit_format,
994 ucontrol->value.integer.value[0]);
995 return 0;
996}
997
998static int usb_audio_rx_format_put(struct snd_kcontrol *kcontrol,
999 struct snd_ctl_elem_value *ucontrol)
1000{
1001 int rc = 0;
1002
1003 switch (ucontrol->value.integer.value[0]) {
1004 case 3:
1005 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
1006 break;
1007 case 2:
1008 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1009 break;
1010 case 1:
1011 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
1012 break;
1013 case 0:
1014 default:
1015 usb_rx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
1016 break;
1017 }
1018 pr_debug("%s: usb_audio_rx_format = %d, ucontrol value = %ld\n",
1019 __func__, usb_rx_cfg.bit_format,
1020 ucontrol->value.integer.value[0]);
1021
1022 return rc;
1023}
1024
1025static int usb_audio_tx_format_get(struct snd_kcontrol *kcontrol,
1026 struct snd_ctl_elem_value *ucontrol)
1027{
1028 switch (usb_tx_cfg.bit_format) {
1029 case SNDRV_PCM_FORMAT_S32_LE:
1030 ucontrol->value.integer.value[0] = 3;
1031 break;
1032 case SNDRV_PCM_FORMAT_S24_3LE:
1033 ucontrol->value.integer.value[0] = 2;
1034 break;
1035 case SNDRV_PCM_FORMAT_S24_LE:
1036 ucontrol->value.integer.value[0] = 1;
1037 break;
1038 case SNDRV_PCM_FORMAT_S16_LE:
1039 default:
1040 ucontrol->value.integer.value[0] = 0;
1041 break;
1042 }
1043
1044 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
1045 __func__, usb_tx_cfg.bit_format,
1046 ucontrol->value.integer.value[0]);
1047 return 0;
1048}
1049
1050static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol,
1051 struct snd_ctl_elem_value *ucontrol)
1052{
1053 int rc = 0;
1054
1055 switch (ucontrol->value.integer.value[0]) {
1056 case 3:
1057 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S32_LE;
1058 break;
1059 case 2:
1060 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1061 break;
1062 case 1:
1063 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S24_LE;
1064 break;
1065 case 0:
1066 default:
1067 usb_tx_cfg.bit_format = SNDRV_PCM_FORMAT_S16_LE;
1068 break;
1069 }
1070 pr_debug("%s: usb_audio_tx_format = %d, ucontrol value = %ld\n",
1071 __func__, usb_tx_cfg.bit_format,
1072 ucontrol->value.integer.value[0]);
1073
1074 return rc;
1075}
1076
1077static int usb_audio_rx_ch_get(struct snd_kcontrol *kcontrol,
1078 struct snd_ctl_elem_value *ucontrol)
1079{
1080 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__,
1081 usb_rx_cfg.channels);
1082 ucontrol->value.integer.value[0] = usb_rx_cfg.channels - 1;
1083 return 0;
1084}
1085
1086static int usb_audio_rx_ch_put(struct snd_kcontrol *kcontrol,
1087 struct snd_ctl_elem_value *ucontrol)
1088{
1089 usb_rx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1090
1091 pr_debug("%s: usb_audio_rx_ch = %d\n", __func__, usb_rx_cfg.channels);
1092 return 1;
1093}
1094
1095static int usb_audio_tx_ch_get(struct snd_kcontrol *kcontrol,
1096 struct snd_ctl_elem_value *ucontrol)
1097{
1098 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__,
1099 usb_tx_cfg.channels);
1100 ucontrol->value.integer.value[0] = usb_tx_cfg.channels - 1;
1101 return 0;
1102}
1103
1104static int usb_audio_tx_ch_put(struct snd_kcontrol *kcontrol,
1105 struct snd_ctl_elem_value *ucontrol)
1106{
1107 usb_tx_cfg.channels = ucontrol->value.integer.value[0] + 1;
1108
1109 pr_debug("%s: usb_audio_tx_ch = %d\n", __func__, usb_tx_cfg.channels);
1110 return 1;
1111}
1112
Meng Wangd1db67c2019-04-17 12:41:34 +08001113static int msm_vi_feed_tx_ch_get(struct snd_kcontrol *kcontrol,
1114 struct snd_ctl_elem_value *ucontrol)
1115{
1116 ucontrol->value.integer.value[0] = msm_vi_feed_tx_ch - 1;
1117 pr_debug("%s: msm_vi_feed_tx_ch = %ld\n", __func__,
1118 ucontrol->value.integer.value[0]);
1119 return 0;
1120}
1121
1122static int msm_vi_feed_tx_ch_put(struct snd_kcontrol *kcontrol,
1123 struct snd_ctl_elem_value *ucontrol)
1124{
1125 msm_vi_feed_tx_ch = ucontrol->value.integer.value[0] + 1;
1126 pr_debug("%s: msm_vi_feed_tx_ch = %d\n", __func__, msm_vi_feed_tx_ch);
1127 return 1;
1128}
1129
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08001130static int ext_disp_get_port_idx(struct snd_kcontrol *kcontrol)
1131{
1132 int idx = 0;
1133
1134 if (strnstr(kcontrol->id.name, "Display Port RX",
1135 sizeof("Display Port RX"))) {
1136 idx = EXT_DISP_RX_IDX_DP;
1137 } else {
1138 pr_err("%s: unsupported BE: %s\n",
1139 __func__, kcontrol->id.name);
1140 idx = -EINVAL;
1141 }
1142
1143 return idx;
1144}
1145
1146static int ext_disp_rx_format_get(struct snd_kcontrol *kcontrol,
1147 struct snd_ctl_elem_value *ucontrol)
1148{
1149 int idx = ext_disp_get_port_idx(kcontrol);
1150
1151 if (idx < 0)
1152 return idx;
1153
1154 switch (ext_disp_rx_cfg[idx].bit_format) {
1155 case SNDRV_PCM_FORMAT_S24_3LE:
1156 ucontrol->value.integer.value[0] = 2;
1157 break;
1158 case SNDRV_PCM_FORMAT_S24_LE:
1159 ucontrol->value.integer.value[0] = 1;
1160 break;
1161 case SNDRV_PCM_FORMAT_S16_LE:
1162 default:
1163 ucontrol->value.integer.value[0] = 0;
1164 break;
1165 }
1166
1167 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
1168 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
1169 ucontrol->value.integer.value[0]);
1170 return 0;
1171}
1172
1173static int ext_disp_rx_format_put(struct snd_kcontrol *kcontrol,
1174 struct snd_ctl_elem_value *ucontrol)
1175{
1176 int idx = ext_disp_get_port_idx(kcontrol);
1177
1178 if (idx < 0)
1179 return idx;
1180
1181 switch (ucontrol->value.integer.value[0]) {
1182 case 2:
1183 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
1184 break;
1185 case 1:
1186 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE;
1187 break;
1188 case 0:
1189 default:
1190 ext_disp_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE;
1191 break;
1192 }
1193 pr_debug("%s: ext_disp_rx[%d].format = %d, ucontrol value = %ld\n",
1194 __func__, idx, ext_disp_rx_cfg[idx].bit_format,
1195 ucontrol->value.integer.value[0]);
1196
1197 return 0;
1198}
1199
1200static int ext_disp_rx_ch_get(struct snd_kcontrol *kcontrol,
1201 struct snd_ctl_elem_value *ucontrol)
1202{
1203 int idx = ext_disp_get_port_idx(kcontrol);
1204
1205 if (idx < 0)
1206 return idx;
1207
1208 ucontrol->value.integer.value[0] =
1209 ext_disp_rx_cfg[idx].channels - 2;
1210
1211 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
1212 idx, ext_disp_rx_cfg[idx].channels);
1213
1214 return 0;
1215}
1216
1217static int ext_disp_rx_ch_put(struct snd_kcontrol *kcontrol,
1218 struct snd_ctl_elem_value *ucontrol)
1219{
1220 int idx = ext_disp_get_port_idx(kcontrol);
1221
1222 if (idx < 0)
1223 return idx;
1224
1225 ext_disp_rx_cfg[idx].channels =
1226 ucontrol->value.integer.value[0] + 2;
1227
1228 pr_debug("%s: ext_disp_rx[%d].ch = %d\n", __func__,
1229 idx, ext_disp_rx_cfg[idx].channels);
1230 return 1;
1231}
1232
1233static int ext_disp_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1234 struct snd_ctl_elem_value *ucontrol)
1235{
1236 int sample_rate_val;
1237 int idx = ext_disp_get_port_idx(kcontrol);
1238
1239 if (idx < 0)
1240 return idx;
1241
1242 switch (ext_disp_rx_cfg[idx].sample_rate) {
1243 case SAMPLING_RATE_176P4KHZ:
1244 sample_rate_val = 6;
1245 break;
1246
1247 case SAMPLING_RATE_88P2KHZ:
1248 sample_rate_val = 5;
1249 break;
1250
1251 case SAMPLING_RATE_44P1KHZ:
1252 sample_rate_val = 4;
1253 break;
1254
1255 case SAMPLING_RATE_32KHZ:
1256 sample_rate_val = 3;
1257 break;
1258
1259 case SAMPLING_RATE_192KHZ:
1260 sample_rate_val = 2;
1261 break;
1262
1263 case SAMPLING_RATE_96KHZ:
1264 sample_rate_val = 1;
1265 break;
1266
1267 case SAMPLING_RATE_48KHZ:
1268 default:
1269 sample_rate_val = 0;
1270 break;
1271 }
1272
1273 ucontrol->value.integer.value[0] = sample_rate_val;
1274 pr_debug("%s: ext_disp_rx[%d].sample_rate = %d\n", __func__,
1275 idx, ext_disp_rx_cfg[idx].sample_rate);
1276
1277 return 0;
1278}
1279
1280static int ext_disp_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1281 struct snd_ctl_elem_value *ucontrol)
1282{
1283 int idx = ext_disp_get_port_idx(kcontrol);
1284
1285 if (idx < 0)
1286 return idx;
1287
1288 switch (ucontrol->value.integer.value[0]) {
1289 case 6:
1290 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ;
1291 break;
1292 case 5:
1293 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ;
1294 break;
1295 case 4:
1296 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ;
1297 break;
1298 case 3:
1299 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ;
1300 break;
1301 case 2:
1302 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ;
1303 break;
1304 case 1:
1305 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ;
1306 break;
1307 case 0:
1308 default:
1309 ext_disp_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ;
1310 break;
1311 }
1312
1313 pr_debug("%s: control value = %ld, ext_disp_rx[%d].sample_rate = %d\n",
1314 __func__, ucontrol->value.integer.value[0], idx,
1315 ext_disp_rx_cfg[idx].sample_rate);
1316 return 0;
1317}
1318
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001319static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol,
1320 struct snd_ctl_elem_value *ucontrol)
1321{
1322 pr_debug("%s: proxy_rx channels = %d\n",
1323 __func__, proxy_rx_cfg.channels);
1324 ucontrol->value.integer.value[0] = proxy_rx_cfg.channels - 2;
1325
1326 return 0;
1327}
1328
1329static int proxy_rx_ch_put(struct snd_kcontrol *kcontrol,
1330 struct snd_ctl_elem_value *ucontrol)
1331{
1332 proxy_rx_cfg.channels = ucontrol->value.integer.value[0] + 2;
1333 pr_debug("%s: proxy_rx channels = %d\n",
1334 __func__, proxy_rx_cfg.channels);
1335
1336 return 1;
1337}
1338
1339static int tdm_get_port_idx(struct snd_kcontrol *kcontrol,
1340 struct tdm_port *port)
1341{
1342 if (port) {
1343 if (strnstr(kcontrol->id.name, "PRI",
1344 sizeof(kcontrol->id.name))) {
1345 port->mode = TDM_PRI;
1346 } else if (strnstr(kcontrol->id.name, "SEC",
1347 sizeof(kcontrol->id.name))) {
1348 port->mode = TDM_SEC;
1349 } else if (strnstr(kcontrol->id.name, "TERT",
1350 sizeof(kcontrol->id.name))) {
1351 port->mode = TDM_TERT;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08001352 } else if (strnstr(kcontrol->id.name, "QUAT",
1353 sizeof(kcontrol->id.name))) {
1354 port->mode = TDM_QUAT;
1355 } else if (strnstr(kcontrol->id.name, "QUIN",
1356 sizeof(kcontrol->id.name))) {
1357 port->mode = TDM_QUIN;
1358 } else if (strnstr(kcontrol->id.name, "SEN",
1359 sizeof(kcontrol->id.name))) {
1360 port->mode = TDM_SEN;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001361 } else {
1362 pr_err("%s: unsupported mode in: %s\n",
1363 __func__, kcontrol->id.name);
1364 return -EINVAL;
1365 }
1366
1367 if (strnstr(kcontrol->id.name, "RX_0",
1368 sizeof(kcontrol->id.name)) ||
1369 strnstr(kcontrol->id.name, "TX_0",
1370 sizeof(kcontrol->id.name))) {
1371 port->channel = TDM_0;
1372 } else if (strnstr(kcontrol->id.name, "RX_1",
1373 sizeof(kcontrol->id.name)) ||
1374 strnstr(kcontrol->id.name, "TX_1",
1375 sizeof(kcontrol->id.name))) {
1376 port->channel = TDM_1;
1377 } else if (strnstr(kcontrol->id.name, "RX_2",
1378 sizeof(kcontrol->id.name)) ||
1379 strnstr(kcontrol->id.name, "TX_2",
1380 sizeof(kcontrol->id.name))) {
1381 port->channel = TDM_2;
1382 } else if (strnstr(kcontrol->id.name, "RX_3",
1383 sizeof(kcontrol->id.name)) ||
1384 strnstr(kcontrol->id.name, "TX_3",
1385 sizeof(kcontrol->id.name))) {
1386 port->channel = TDM_3;
1387 } else if (strnstr(kcontrol->id.name, "RX_4",
1388 sizeof(kcontrol->id.name)) ||
1389 strnstr(kcontrol->id.name, "TX_4",
1390 sizeof(kcontrol->id.name))) {
1391 port->channel = TDM_4;
1392 } else if (strnstr(kcontrol->id.name, "RX_5",
1393 sizeof(kcontrol->id.name)) ||
1394 strnstr(kcontrol->id.name, "TX_5",
1395 sizeof(kcontrol->id.name))) {
1396 port->channel = TDM_5;
1397 } else if (strnstr(kcontrol->id.name, "RX_6",
1398 sizeof(kcontrol->id.name)) ||
1399 strnstr(kcontrol->id.name, "TX_6",
1400 sizeof(kcontrol->id.name))) {
1401 port->channel = TDM_6;
1402 } else if (strnstr(kcontrol->id.name, "RX_7",
1403 sizeof(kcontrol->id.name)) ||
1404 strnstr(kcontrol->id.name, "TX_7",
1405 sizeof(kcontrol->id.name))) {
1406 port->channel = TDM_7;
1407 } else {
1408 pr_err("%s: unsupported channel in: %s\n",
1409 __func__, kcontrol->id.name);
1410 return -EINVAL;
1411 }
1412 } else {
1413 return -EINVAL;
1414 }
1415 return 0;
1416}
1417
1418static int tdm_get_sample_rate(int value)
1419{
1420 int sample_rate = 0;
1421
1422 switch (value) {
1423 case 0:
1424 sample_rate = SAMPLING_RATE_8KHZ;
1425 break;
1426 case 1:
1427 sample_rate = SAMPLING_RATE_16KHZ;
1428 break;
1429 case 2:
1430 sample_rate = SAMPLING_RATE_32KHZ;
1431 break;
1432 case 3:
1433 sample_rate = SAMPLING_RATE_48KHZ;
1434 break;
1435 case 4:
1436 sample_rate = SAMPLING_RATE_176P4KHZ;
1437 break;
1438 case 5:
1439 sample_rate = SAMPLING_RATE_352P8KHZ;
1440 break;
1441 default:
1442 sample_rate = SAMPLING_RATE_48KHZ;
1443 break;
1444 }
1445 return sample_rate;
1446}
1447
1448static int tdm_get_sample_rate_val(int sample_rate)
1449{
1450 int sample_rate_val = 0;
1451
1452 switch (sample_rate) {
1453 case SAMPLING_RATE_8KHZ:
1454 sample_rate_val = 0;
1455 break;
1456 case SAMPLING_RATE_16KHZ:
1457 sample_rate_val = 1;
1458 break;
1459 case SAMPLING_RATE_32KHZ:
1460 sample_rate_val = 2;
1461 break;
1462 case SAMPLING_RATE_48KHZ:
1463 sample_rate_val = 3;
1464 break;
1465 case SAMPLING_RATE_176P4KHZ:
1466 sample_rate_val = 4;
1467 break;
1468 case SAMPLING_RATE_352P8KHZ:
1469 sample_rate_val = 5;
1470 break;
1471 default:
1472 sample_rate_val = 3;
1473 break;
1474 }
1475 return sample_rate_val;
1476}
1477
1478static int tdm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1479 struct snd_ctl_elem_value *ucontrol)
1480{
1481 struct tdm_port port;
1482 int ret = tdm_get_port_idx(kcontrol, &port);
1483
1484 if (ret) {
1485 pr_err("%s: unsupported control: %s\n",
1486 __func__, kcontrol->id.name);
1487 } else {
1488 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
1489 tdm_rx_cfg[port.mode][port.channel].sample_rate);
1490
1491 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
1492 tdm_rx_cfg[port.mode][port.channel].sample_rate,
1493 ucontrol->value.enumerated.item[0]);
1494 }
1495 return ret;
1496}
1497
1498static int tdm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
1499 struct snd_ctl_elem_value *ucontrol)
1500{
1501 struct tdm_port port;
1502 int ret = tdm_get_port_idx(kcontrol, &port);
1503
1504 if (ret) {
1505 pr_err("%s: unsupported control: %s\n",
1506 __func__, kcontrol->id.name);
1507 } else {
1508 tdm_rx_cfg[port.mode][port.channel].sample_rate =
1509 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
1510
1511 pr_debug("%s: tdm_rx_sample_rate = %d, item = %d\n", __func__,
1512 tdm_rx_cfg[port.mode][port.channel].sample_rate,
1513 ucontrol->value.enumerated.item[0]);
1514 }
1515 return ret;
1516}
1517
1518static int tdm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1519 struct snd_ctl_elem_value *ucontrol)
1520{
1521 struct tdm_port port;
1522 int ret = tdm_get_port_idx(kcontrol, &port);
1523
1524 if (ret) {
1525 pr_err("%s: unsupported control: %s\n",
1526 __func__, kcontrol->id.name);
1527 } else {
1528 ucontrol->value.enumerated.item[0] = tdm_get_sample_rate_val(
1529 tdm_tx_cfg[port.mode][port.channel].sample_rate);
1530
1531 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
1532 tdm_tx_cfg[port.mode][port.channel].sample_rate,
1533 ucontrol->value.enumerated.item[0]);
1534 }
1535 return ret;
1536}
1537
1538static int tdm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1539 struct snd_ctl_elem_value *ucontrol)
1540{
1541 struct tdm_port port;
1542 int ret = tdm_get_port_idx(kcontrol, &port);
1543
1544 if (ret) {
1545 pr_err("%s: unsupported control: %s\n",
1546 __func__, kcontrol->id.name);
1547 } else {
1548 tdm_tx_cfg[port.mode][port.channel].sample_rate =
1549 tdm_get_sample_rate(ucontrol->value.enumerated.item[0]);
1550
1551 pr_debug("%s: tdm_tx_sample_rate = %d, item = %d\n", __func__,
1552 tdm_tx_cfg[port.mode][port.channel].sample_rate,
1553 ucontrol->value.enumerated.item[0]);
1554 }
1555 return ret;
1556}
1557
1558static int tdm_get_format(int value)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001559{
1560 int format = 0;
1561
1562 switch (value) {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001563 case 0:
1564 format = SNDRV_PCM_FORMAT_S16_LE;
1565 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001566 case 1:
1567 format = SNDRV_PCM_FORMAT_S24_LE;
1568 break;
1569 case 2:
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001570 format = SNDRV_PCM_FORMAT_S32_LE;
1571 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001572 default:
1573 format = SNDRV_PCM_FORMAT_S16_LE;
1574 break;
1575 }
1576 return format;
1577}
1578
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001579static int tdm_get_format_val(int format)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001580{
1581 int value = 0;
1582
1583 switch (format) {
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001584 case SNDRV_PCM_FORMAT_S16_LE:
1585 value = 0;
1586 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001587 case SNDRV_PCM_FORMAT_S24_LE:
1588 value = 1;
1589 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001590 case SNDRV_PCM_FORMAT_S32_LE:
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001591 value = 2;
1592 break;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001593 default:
1594 value = 0;
1595 break;
1596 }
1597 return value;
1598}
1599
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001600static int tdm_rx_format_get(struct snd_kcontrol *kcontrol,
1601 struct snd_ctl_elem_value *ucontrol)
1602{
1603 struct tdm_port port;
1604 int ret = tdm_get_port_idx(kcontrol, &port);
1605
1606 if (ret) {
1607 pr_err("%s: unsupported control: %s\n",
1608 __func__, kcontrol->id.name);
1609 } else {
1610 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
1611 tdm_rx_cfg[port.mode][port.channel].bit_format);
1612
1613 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
1614 tdm_rx_cfg[port.mode][port.channel].bit_format,
1615 ucontrol->value.enumerated.item[0]);
1616 }
1617 return ret;
1618}
1619
1620static int tdm_rx_format_put(struct snd_kcontrol *kcontrol,
1621 struct snd_ctl_elem_value *ucontrol)
1622{
1623 struct tdm_port port;
1624 int ret = tdm_get_port_idx(kcontrol, &port);
1625
1626 if (ret) {
1627 pr_err("%s: unsupported control: %s\n",
1628 __func__, kcontrol->id.name);
1629 } else {
1630 tdm_rx_cfg[port.mode][port.channel].bit_format =
1631 tdm_get_format(ucontrol->value.enumerated.item[0]);
1632
1633 pr_debug("%s: tdm_rx_bit_format = %d, item = %d\n", __func__,
1634 tdm_rx_cfg[port.mode][port.channel].bit_format,
1635 ucontrol->value.enumerated.item[0]);
1636 }
1637 return ret;
1638}
1639
1640static int tdm_tx_format_get(struct snd_kcontrol *kcontrol,
1641 struct snd_ctl_elem_value *ucontrol)
1642{
1643 struct tdm_port port;
1644 int ret = tdm_get_port_idx(kcontrol, &port);
1645
1646 if (ret) {
1647 pr_err("%s: unsupported control: %s\n",
1648 __func__, kcontrol->id.name);
1649 } else {
1650 ucontrol->value.enumerated.item[0] = tdm_get_format_val(
1651 tdm_tx_cfg[port.mode][port.channel].bit_format);
1652
1653 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
1654 tdm_tx_cfg[port.mode][port.channel].bit_format,
1655 ucontrol->value.enumerated.item[0]);
1656 }
1657 return ret;
1658}
1659
1660static int tdm_tx_format_put(struct snd_kcontrol *kcontrol,
1661 struct snd_ctl_elem_value *ucontrol)
1662{
1663 struct tdm_port port;
1664 int ret = tdm_get_port_idx(kcontrol, &port);
1665
1666 if (ret) {
1667 pr_err("%s: unsupported control: %s\n",
1668 __func__, kcontrol->id.name);
1669 } else {
1670 tdm_tx_cfg[port.mode][port.channel].bit_format =
1671 tdm_get_format(ucontrol->value.enumerated.item[0]);
1672
1673 pr_debug("%s: tdm_tx_bit_format = %d, item = %d\n", __func__,
1674 tdm_tx_cfg[port.mode][port.channel].bit_format,
1675 ucontrol->value.enumerated.item[0]);
1676 }
1677 return ret;
1678}
1679
1680static int tdm_rx_ch_get(struct snd_kcontrol *kcontrol,
1681 struct snd_ctl_elem_value *ucontrol)
1682{
1683 struct tdm_port port;
1684 int ret = tdm_get_port_idx(kcontrol, &port);
1685
1686 if (ret) {
1687 pr_err("%s: unsupported control: %s\n",
1688 __func__, kcontrol->id.name);
1689 } else {
1690
1691 ucontrol->value.enumerated.item[0] =
1692 tdm_rx_cfg[port.mode][port.channel].channels - 1;
1693
1694 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
1695 tdm_rx_cfg[port.mode][port.channel].channels - 1,
1696 ucontrol->value.enumerated.item[0]);
1697 }
1698 return ret;
1699}
1700
1701static int tdm_rx_ch_put(struct snd_kcontrol *kcontrol,
1702 struct snd_ctl_elem_value *ucontrol)
1703{
1704 struct tdm_port port;
1705 int ret = tdm_get_port_idx(kcontrol, &port);
1706
1707 if (ret) {
1708 pr_err("%s: unsupported control: %s\n",
1709 __func__, kcontrol->id.name);
1710 } else {
1711 tdm_rx_cfg[port.mode][port.channel].channels =
1712 ucontrol->value.enumerated.item[0] + 1;
1713
1714 pr_debug("%s: tdm_rx_ch = %d, item = %d\n", __func__,
1715 tdm_rx_cfg[port.mode][port.channel].channels,
1716 ucontrol->value.enumerated.item[0] + 1);
1717 }
1718 return ret;
1719}
1720
1721static int tdm_tx_ch_get(struct snd_kcontrol *kcontrol,
1722 struct snd_ctl_elem_value *ucontrol)
1723{
1724 struct tdm_port port;
1725 int ret = tdm_get_port_idx(kcontrol, &port);
1726
1727 if (ret) {
1728 pr_err("%s: unsupported control: %s\n",
1729 __func__, kcontrol->id.name);
1730 } else {
1731 ucontrol->value.enumerated.item[0] =
1732 tdm_tx_cfg[port.mode][port.channel].channels - 1;
1733
1734 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
1735 tdm_tx_cfg[port.mode][port.channel].channels - 1,
1736 ucontrol->value.enumerated.item[0]);
1737 }
1738 return ret;
1739}
1740
1741static int tdm_tx_ch_put(struct snd_kcontrol *kcontrol,
1742 struct snd_ctl_elem_value *ucontrol)
1743{
1744 struct tdm_port port;
1745 int ret = tdm_get_port_idx(kcontrol, &port);
1746
1747 if (ret) {
1748 pr_err("%s: unsupported control: %s\n",
1749 __func__, kcontrol->id.name);
1750 } else {
1751 tdm_tx_cfg[port.mode][port.channel].channels =
1752 ucontrol->value.enumerated.item[0] + 1;
1753
1754 pr_debug("%s: tdm_tx_ch = %d, item = %d\n", __func__,
1755 tdm_tx_cfg[port.mode][port.channel].channels,
1756 ucontrol->value.enumerated.item[0] + 1);
1757 }
1758 return ret;
1759}
1760
1761static int aux_pcm_get_port_idx(struct snd_kcontrol *kcontrol)
1762{
1763 int idx = 0;
1764
1765 if (strnstr(kcontrol->id.name, "PRIM_AUX_PCM",
1766 sizeof("PRIM_AUX_PCM"))) {
1767 idx = PRIM_AUX_PCM;
1768 } else if (strnstr(kcontrol->id.name, "SEC_AUX_PCM",
1769 sizeof("SEC_AUX_PCM"))) {
1770 idx = SEC_AUX_PCM;
1771 } else if (strnstr(kcontrol->id.name, "TERT_AUX_PCM",
1772 sizeof("TERT_AUX_PCM"))) {
1773 idx = TERT_AUX_PCM;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08001774 } else if (strnstr(kcontrol->id.name, "QUAT_AUX_PCM",
1775 sizeof("QUAT_AUX_PCM"))) {
1776 idx = QUAT_AUX_PCM;
1777 } else if (strnstr(kcontrol->id.name, "QUIN_AUX_PCM",
1778 sizeof("QUIN_AUX_PCM"))) {
1779 idx = QUIN_AUX_PCM;
1780 } else if (strnstr(kcontrol->id.name, "SEN_AUX_PCM",
1781 sizeof("SEN_AUX_PCM"))) {
1782 idx = SEN_AUX_PCM;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001783 } else {
1784 pr_err("%s: unsupported port: %s\n",
1785 __func__, kcontrol->id.name);
1786 idx = -EINVAL;
1787 }
1788
1789 return idx;
1790}
1791
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001792static int aux_pcm_get_sample_rate(int value)
1793{
1794 int sample_rate = 0;
1795
1796 switch (value) {
1797 case 1:
1798 sample_rate = SAMPLING_RATE_16KHZ;
1799 break;
1800 case 0:
1801 default:
1802 sample_rate = SAMPLING_RATE_8KHZ;
1803 break;
1804 }
1805 return sample_rate;
1806}
1807
1808static int aux_pcm_get_sample_rate_val(int sample_rate)
1809{
1810 int sample_rate_val = 0;
1811
1812 switch (sample_rate) {
1813 case SAMPLING_RATE_16KHZ:
1814 sample_rate_val = 1;
1815 break;
1816 case SAMPLING_RATE_8KHZ:
1817 default:
1818 sample_rate_val = 0;
1819 break;
1820 }
1821 return sample_rate_val;
1822}
1823
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001824static int mi2s_auxpcm_get_format(int value)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001825{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001826 int format = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001827
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001828 switch (value) {
1829 case 0:
1830 format = SNDRV_PCM_FORMAT_S16_LE;
1831 break;
1832 case 1:
1833 format = SNDRV_PCM_FORMAT_S24_LE;
1834 break;
1835 case 2:
1836 format = SNDRV_PCM_FORMAT_S24_3LE;
1837 break;
1838 case 3:
1839 format = SNDRV_PCM_FORMAT_S32_LE;
1840 break;
1841 default:
1842 format = SNDRV_PCM_FORMAT_S16_LE;
1843 break;
1844 }
1845 return format;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001846}
1847
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001848static int mi2s_auxpcm_get_format_value(int format)
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001849{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001850 int value = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001851
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001852 switch (format) {
1853 case SNDRV_PCM_FORMAT_S16_LE:
1854 value = 0;
1855 break;
1856 case SNDRV_PCM_FORMAT_S24_LE:
1857 value = 1;
1858 break;
1859 case SNDRV_PCM_FORMAT_S24_3LE:
1860 value = 2;
1861 break;
1862 case SNDRV_PCM_FORMAT_S32_LE:
1863 value = 3;
1864 break;
1865 default:
1866 value = 0;
1867 break;
1868 }
1869 return value;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001870}
1871
1872static int aux_pcm_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
1873 struct snd_ctl_elem_value *ucontrol)
1874{
1875 int idx = aux_pcm_get_port_idx(kcontrol);
1876
1877 if (idx < 0)
1878 return idx;
1879
1880 ucontrol->value.enumerated.item[0] =
1881 aux_pcm_get_sample_rate_val(aux_pcm_rx_cfg[idx].sample_rate);
1882
1883 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
1884 idx, aux_pcm_rx_cfg[idx].sample_rate,
1885 ucontrol->value.enumerated.item[0]);
1886
1887 return 0;
1888}
1889
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001890static int aux_pcm_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001891 struct snd_ctl_elem_value *ucontrol)
1892{
1893 int idx = aux_pcm_get_port_idx(kcontrol);
1894
1895 if (idx < 0)
1896 return idx;
1897
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001898 aux_pcm_rx_cfg[idx].sample_rate =
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001899 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
1900
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001901 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
1902 idx, aux_pcm_rx_cfg[idx].sample_rate,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07001903 ucontrol->value.enumerated.item[0]);
1904
1905 return 0;
1906}
1907
1908static int aux_pcm_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
1909 struct snd_ctl_elem_value *ucontrol)
1910{
1911 int idx = aux_pcm_get_port_idx(kcontrol);
1912
1913 if (idx < 0)
1914 return idx;
1915
1916 ucontrol->value.enumerated.item[0] =
1917 aux_pcm_get_sample_rate_val(aux_pcm_tx_cfg[idx].sample_rate);
1918
1919 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
1920 idx, aux_pcm_tx_cfg[idx].sample_rate,
1921 ucontrol->value.enumerated.item[0]);
1922
1923 return 0;
1924}
1925
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07001926static int aux_pcm_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
1927 struct snd_ctl_elem_value *ucontrol)
1928{
1929 int idx = aux_pcm_get_port_idx(kcontrol);
1930
1931 if (idx < 0)
1932 return idx;
1933
1934 aux_pcm_tx_cfg[idx].sample_rate =
1935 aux_pcm_get_sample_rate(ucontrol->value.enumerated.item[0]);
1936
1937 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
1938 idx, aux_pcm_tx_cfg[idx].sample_rate,
1939 ucontrol->value.enumerated.item[0]);
1940
1941 return 0;
1942}
1943
1944static int msm_aux_pcm_rx_format_get(struct snd_kcontrol *kcontrol,
1945 struct snd_ctl_elem_value *ucontrol)
1946{
1947 int idx = aux_pcm_get_port_idx(kcontrol);
1948
1949 if (idx < 0)
1950 return idx;
1951
1952 ucontrol->value.enumerated.item[0] =
1953 mi2s_auxpcm_get_format_value(aux_pcm_rx_cfg[idx].bit_format);
1954
1955 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
1956 idx, aux_pcm_rx_cfg[idx].bit_format,
1957 ucontrol->value.enumerated.item[0]);
1958
1959 return 0;
1960}
1961
1962static int msm_aux_pcm_rx_format_put(struct snd_kcontrol *kcontrol,
1963 struct snd_ctl_elem_value *ucontrol)
1964{
1965 int idx = aux_pcm_get_port_idx(kcontrol);
1966
1967 if (idx < 0)
1968 return idx;
1969
1970 aux_pcm_rx_cfg[idx].bit_format =
1971 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
1972
1973 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
1974 idx, aux_pcm_rx_cfg[idx].bit_format,
1975 ucontrol->value.enumerated.item[0]);
1976
1977 return 0;
1978}
1979
1980static int msm_aux_pcm_tx_format_get(struct snd_kcontrol *kcontrol,
1981 struct snd_ctl_elem_value *ucontrol)
1982{
1983 int idx = aux_pcm_get_port_idx(kcontrol);
1984
1985 if (idx < 0)
1986 return idx;
1987
1988 ucontrol->value.enumerated.item[0] =
1989 mi2s_auxpcm_get_format_value(aux_pcm_tx_cfg[idx].bit_format);
1990
1991 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
1992 idx, aux_pcm_tx_cfg[idx].bit_format,
1993 ucontrol->value.enumerated.item[0]);
1994
1995 return 0;
1996}
1997
1998static int msm_aux_pcm_tx_format_put(struct snd_kcontrol *kcontrol,
1999 struct snd_ctl_elem_value *ucontrol)
2000{
2001 int idx = aux_pcm_get_port_idx(kcontrol);
2002
2003 if (idx < 0)
2004 return idx;
2005
2006 aux_pcm_tx_cfg[idx].bit_format =
2007 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2008
2009 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2010 idx, aux_pcm_tx_cfg[idx].bit_format,
2011 ucontrol->value.enumerated.item[0]);
2012
2013 return 0;
2014}
2015
2016static int mi2s_get_port_idx(struct snd_kcontrol *kcontrol)
2017{
2018 int idx = 0;
2019
2020 if (strnstr(kcontrol->id.name, "PRIM_MI2S_RX",
2021 sizeof("PRIM_MI2S_RX"))) {
2022 idx = PRIM_MI2S;
2023 } else if (strnstr(kcontrol->id.name, "SEC_MI2S_RX",
2024 sizeof("SEC_MI2S_RX"))) {
2025 idx = SEC_MI2S;
2026 } else if (strnstr(kcontrol->id.name, "TERT_MI2S_RX",
2027 sizeof("TERT_MI2S_RX"))) {
2028 idx = TERT_MI2S;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002029 } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_RX",
2030 sizeof("QUAT_MI2S_RX"))) {
2031 idx = QUAT_MI2S;
2032 } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_RX",
2033 sizeof("QUIN_MI2S_RX"))) {
2034 idx = QUIN_MI2S;
2035 } else if (strnstr(kcontrol->id.name, "SEN_MI2S_RX",
2036 sizeof("SEN_MI2S_RX"))) {
2037 idx = SEN_MI2S;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002038 } else if (strnstr(kcontrol->id.name, "PRIM_MI2S_TX",
2039 sizeof("PRIM_MI2S_TX"))) {
2040 idx = PRIM_MI2S;
2041 } else if (strnstr(kcontrol->id.name, "SEC_MI2S_TX",
2042 sizeof("SEC_MI2S_TX"))) {
2043 idx = SEC_MI2S;
2044 } else if (strnstr(kcontrol->id.name, "TERT_MI2S_TX",
2045 sizeof("TERT_MI2S_TX"))) {
2046 idx = TERT_MI2S;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002047 } else if (strnstr(kcontrol->id.name, "QUAT_MI2S_TX",
2048 sizeof("QUAT_MI2S_TX"))) {
2049 idx = QUAT_MI2S;
2050 } else if (strnstr(kcontrol->id.name, "QUIN_MI2S_TX",
2051 sizeof("QUIN_MI2S_TX"))) {
2052 idx = QUIN_MI2S;
2053 } else if (strnstr(kcontrol->id.name, "SEN_MI2S_TX",
2054 sizeof("SEN_MI2S_TX"))) {
2055 idx = SEN_MI2S;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002056 } else {
2057 pr_err("%s: unsupported channel: %s\n",
2058 __func__, kcontrol->id.name);
2059 idx = -EINVAL;
2060 }
2061
2062 return idx;
2063}
2064
2065static int mi2s_get_sample_rate(int value)
2066{
2067 int sample_rate = 0;
2068
2069 switch (value) {
2070 case 0:
2071 sample_rate = SAMPLING_RATE_8KHZ;
2072 break;
2073 case 1:
2074 sample_rate = SAMPLING_RATE_11P025KHZ;
2075 break;
2076 case 2:
2077 sample_rate = SAMPLING_RATE_16KHZ;
2078 break;
2079 case 3:
2080 sample_rate = SAMPLING_RATE_22P05KHZ;
2081 break;
2082 case 4:
2083 sample_rate = SAMPLING_RATE_32KHZ;
2084 break;
2085 case 5:
2086 sample_rate = SAMPLING_RATE_44P1KHZ;
2087 break;
2088 case 6:
2089 sample_rate = SAMPLING_RATE_48KHZ;
2090 break;
2091 case 7:
2092 sample_rate = SAMPLING_RATE_96KHZ;
2093 break;
2094 case 8:
2095 sample_rate = SAMPLING_RATE_192KHZ;
2096 break;
2097 default:
2098 sample_rate = SAMPLING_RATE_48KHZ;
2099 break;
2100 }
2101 return sample_rate;
2102}
2103
2104static int mi2s_get_sample_rate_val(int sample_rate)
2105{
2106 int sample_rate_val = 0;
2107
2108 switch (sample_rate) {
2109 case SAMPLING_RATE_8KHZ:
2110 sample_rate_val = 0;
2111 break;
2112 case SAMPLING_RATE_11P025KHZ:
2113 sample_rate_val = 1;
2114 break;
2115 case SAMPLING_RATE_16KHZ:
2116 sample_rate_val = 2;
2117 break;
2118 case SAMPLING_RATE_22P05KHZ:
2119 sample_rate_val = 3;
2120 break;
2121 case SAMPLING_RATE_32KHZ:
2122 sample_rate_val = 4;
2123 break;
2124 case SAMPLING_RATE_44P1KHZ:
2125 sample_rate_val = 5;
2126 break;
2127 case SAMPLING_RATE_48KHZ:
2128 sample_rate_val = 6;
2129 break;
2130 case SAMPLING_RATE_96KHZ:
2131 sample_rate_val = 7;
2132 break;
2133 case SAMPLING_RATE_192KHZ:
2134 sample_rate_val = 8;
2135 break;
2136 default:
2137 sample_rate_val = 6;
2138 break;
2139 }
2140 return sample_rate_val;
2141}
2142
2143static int mi2s_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2144 struct snd_ctl_elem_value *ucontrol)
2145{
2146 int idx = mi2s_get_port_idx(kcontrol);
2147
2148 if (idx < 0)
2149 return idx;
2150
2151 ucontrol->value.enumerated.item[0] =
2152 mi2s_get_sample_rate_val(mi2s_rx_cfg[idx].sample_rate);
2153
2154 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2155 idx, mi2s_rx_cfg[idx].sample_rate,
2156 ucontrol->value.enumerated.item[0]);
2157
2158 return 0;
2159}
2160
2161static int mi2s_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2162 struct snd_ctl_elem_value *ucontrol)
2163{
2164 int idx = mi2s_get_port_idx(kcontrol);
2165
2166 if (idx < 0)
2167 return idx;
2168
2169 mi2s_rx_cfg[idx].sample_rate =
2170 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
2171
2172 pr_debug("%s: idx[%d]_rx_sample_rate = %d, item = %d\n", __func__,
2173 idx, mi2s_rx_cfg[idx].sample_rate,
2174 ucontrol->value.enumerated.item[0]);
2175
2176 return 0;
2177}
2178
2179static int mi2s_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2180 struct snd_ctl_elem_value *ucontrol)
2181{
2182 int idx = mi2s_get_port_idx(kcontrol);
2183
2184 if (idx < 0)
2185 return idx;
2186
2187 ucontrol->value.enumerated.item[0] =
2188 mi2s_get_sample_rate_val(mi2s_tx_cfg[idx].sample_rate);
2189
2190 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2191 idx, mi2s_tx_cfg[idx].sample_rate,
2192 ucontrol->value.enumerated.item[0]);
2193
2194 return 0;
2195}
2196
2197static int mi2s_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2198 struct snd_ctl_elem_value *ucontrol)
2199{
2200 int idx = mi2s_get_port_idx(kcontrol);
2201
2202 if (idx < 0)
2203 return idx;
2204
2205 mi2s_tx_cfg[idx].sample_rate =
2206 mi2s_get_sample_rate(ucontrol->value.enumerated.item[0]);
2207
2208 pr_debug("%s: idx[%d]_tx_sample_rate = %d, item = %d\n", __func__,
2209 idx, mi2s_tx_cfg[idx].sample_rate,
2210 ucontrol->value.enumerated.item[0]);
2211
2212 return 0;
2213}
2214
2215static int msm_mi2s_rx_format_get(struct snd_kcontrol *kcontrol,
2216 struct snd_ctl_elem_value *ucontrol)
2217{
2218 int idx = mi2s_get_port_idx(kcontrol);
2219
2220 if (idx < 0)
2221 return idx;
2222
2223 ucontrol->value.enumerated.item[0] =
2224 mi2s_auxpcm_get_format_value(mi2s_rx_cfg[idx].bit_format);
2225
2226 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
2227 idx, mi2s_rx_cfg[idx].bit_format,
2228 ucontrol->value.enumerated.item[0]);
2229
2230 return 0;
2231}
2232
2233static int msm_mi2s_rx_format_put(struct snd_kcontrol *kcontrol,
2234 struct snd_ctl_elem_value *ucontrol)
2235{
2236 int idx = mi2s_get_port_idx(kcontrol);
2237
2238 if (idx < 0)
2239 return idx;
2240
2241 mi2s_rx_cfg[idx].bit_format =
2242 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2243
2244 pr_debug("%s: idx[%d]_rx_format = %d, item = %d\n", __func__,
2245 idx, mi2s_rx_cfg[idx].bit_format,
2246 ucontrol->value.enumerated.item[0]);
2247
2248 return 0;
2249}
2250
2251static int msm_mi2s_tx_format_get(struct snd_kcontrol *kcontrol,
2252 struct snd_ctl_elem_value *ucontrol)
2253{
2254 int idx = mi2s_get_port_idx(kcontrol);
2255
2256 if (idx < 0)
2257 return idx;
2258
2259 ucontrol->value.enumerated.item[0] =
2260 mi2s_auxpcm_get_format_value(mi2s_tx_cfg[idx].bit_format);
2261
2262 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2263 idx, mi2s_tx_cfg[idx].bit_format,
2264 ucontrol->value.enumerated.item[0]);
2265
2266 return 0;
2267}
2268
2269static int msm_mi2s_tx_format_put(struct snd_kcontrol *kcontrol,
2270 struct snd_ctl_elem_value *ucontrol)
2271{
2272 int idx = mi2s_get_port_idx(kcontrol);
2273
2274 if (idx < 0)
2275 return idx;
2276
2277 mi2s_tx_cfg[idx].bit_format =
2278 mi2s_auxpcm_get_format(ucontrol->value.enumerated.item[0]);
2279
2280 pr_debug("%s: idx[%d]_tx_format = %d, item = %d\n", __func__,
2281 idx, mi2s_tx_cfg[idx].bit_format,
2282 ucontrol->value.enumerated.item[0]);
2283
2284 return 0;
2285}
2286static int msm_mi2s_rx_ch_get(struct snd_kcontrol *kcontrol,
2287 struct snd_ctl_elem_value *ucontrol)
2288{
2289 int idx = mi2s_get_port_idx(kcontrol);
2290
2291 if (idx < 0)
2292 return idx;
2293
2294 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
2295 idx, mi2s_rx_cfg[idx].channels);
2296 ucontrol->value.enumerated.item[0] = mi2s_rx_cfg[idx].channels - 1;
2297
2298 return 0;
2299}
2300
2301static int msm_mi2s_rx_ch_put(struct snd_kcontrol *kcontrol,
2302 struct snd_ctl_elem_value *ucontrol)
2303{
2304 int idx = mi2s_get_port_idx(kcontrol);
2305
2306 if (idx < 0)
2307 return idx;
2308
2309 mi2s_rx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
2310 pr_debug("%s: msm_mi2s_[%d]_rx_ch = %d\n", __func__,
2311 idx, mi2s_rx_cfg[idx].channels);
2312
2313 return 1;
2314}
2315
2316static int msm_mi2s_tx_ch_get(struct snd_kcontrol *kcontrol,
2317 struct snd_ctl_elem_value *ucontrol)
2318{
2319 int idx = mi2s_get_port_idx(kcontrol);
2320
2321 if (idx < 0)
2322 return idx;
2323
2324 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
2325 idx, mi2s_tx_cfg[idx].channels);
2326 ucontrol->value.enumerated.item[0] = mi2s_tx_cfg[idx].channels - 1;
2327
2328 return 0;
2329}
2330
2331static int msm_mi2s_tx_ch_put(struct snd_kcontrol *kcontrol,
2332 struct snd_ctl_elem_value *ucontrol)
2333{
2334 int idx = mi2s_get_port_idx(kcontrol);
2335
2336 if (idx < 0)
2337 return idx;
2338
2339 mi2s_tx_cfg[idx].channels = ucontrol->value.enumerated.item[0] + 1;
2340 pr_debug("%s: msm_mi2s_[%d]_tx_ch = %d\n", __func__,
2341 idx, mi2s_tx_cfg[idx].channels);
2342
2343 return 1;
2344}
2345
2346static int msm_get_port_id(int be_id)
2347{
2348 int afe_port_id = 0;
2349
2350 switch (be_id) {
2351 case MSM_BACKEND_DAI_PRI_MI2S_RX:
2352 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_RX;
2353 break;
2354 case MSM_BACKEND_DAI_PRI_MI2S_TX:
2355 afe_port_id = AFE_PORT_ID_PRIMARY_MI2S_TX;
2356 break;
2357 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
2358 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_RX;
2359 break;
2360 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
2361 afe_port_id = AFE_PORT_ID_SECONDARY_MI2S_TX;
2362 break;
2363 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
2364 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_RX;
2365 break;
2366 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
2367 afe_port_id = AFE_PORT_ID_TERTIARY_MI2S_TX;
2368 break;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08002369 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
2370 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_RX;
2371 break;
2372 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
2373 afe_port_id = AFE_PORT_ID_QUATERNARY_MI2S_TX;
2374 break;
2375 case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
2376 afe_port_id = AFE_PORT_ID_QUINARY_MI2S_RX;
2377 break;
2378 case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
2379 afe_port_id = AFE_PORT_ID_QUINARY_MI2S_TX;
2380 break;
2381 case MSM_BACKEND_DAI_SENARY_MI2S_RX:
2382 afe_port_id = AFE_PORT_ID_SENARY_MI2S_RX;
2383 break;
2384 case MSM_BACKEND_DAI_SENARY_MI2S_TX:
2385 afe_port_id = AFE_PORT_ID_SENARY_MI2S_TX;
2386 break;
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07002387 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
2388 afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_0;
2389 break;
2390 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
2391 afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_1;
2392 break;
2393 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
2394 afe_port_id = AFE_PORT_ID_VA_CODEC_DMA_TX_2;
2395 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07002396 default:
2397 pr_err("%s: Invalid BE id: %d\n", __func__, be_id);
2398 afe_port_id = -EINVAL;
2399 }
2400
2401 return afe_port_id;
2402}
2403
2404static u32 get_mi2s_bits_per_sample(u32 bit_format)
2405{
2406 u32 bit_per_sample = 0;
2407
2408 switch (bit_format) {
2409 case SNDRV_PCM_FORMAT_S32_LE:
2410 case SNDRV_PCM_FORMAT_S24_3LE:
2411 case SNDRV_PCM_FORMAT_S24_LE:
2412 bit_per_sample = 32;
2413 break;
2414 case SNDRV_PCM_FORMAT_S16_LE:
2415 default:
2416 bit_per_sample = 16;
2417 break;
2418 }
2419
2420 return bit_per_sample;
2421}
2422
2423static void update_mi2s_clk_val(int dai_id, int stream)
2424{
2425 u32 bit_per_sample = 0;
2426
2427 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
2428 bit_per_sample =
2429 get_mi2s_bits_per_sample(mi2s_rx_cfg[dai_id].bit_format);
2430 mi2s_clk[dai_id].clk_freq_in_hz =
2431 mi2s_rx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
2432 } else {
2433 bit_per_sample =
2434 get_mi2s_bits_per_sample(mi2s_tx_cfg[dai_id].bit_format);
2435 mi2s_clk[dai_id].clk_freq_in_hz =
2436 mi2s_tx_cfg[dai_id].sample_rate * 2 * bit_per_sample;
2437 }
2438}
2439
2440static int msm_mi2s_set_sclk(struct snd_pcm_substream *substream, bool enable)
2441{
2442 int ret = 0;
2443 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2444 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
2445 int port_id = 0;
2446 int index = cpu_dai->id;
2447
2448 port_id = msm_get_port_id(rtd->dai_link->id);
2449 if (port_id < 0) {
2450 dev_err(rtd->card->dev, "%s: Invalid port_id\n", __func__);
2451 ret = port_id;
2452 goto err;
2453 }
2454
2455 if (enable) {
2456 update_mi2s_clk_val(index, substream->stream);
2457 dev_dbg(rtd->card->dev, "%s: clock rate %ul\n", __func__,
2458 mi2s_clk[index].clk_freq_in_hz);
2459 }
2460
2461 mi2s_clk[index].enable = enable;
2462 ret = afe_set_lpass_clock_v2(port_id,
2463 &mi2s_clk[index]);
2464 if (ret < 0) {
2465 dev_err(rtd->card->dev,
2466 "%s: afe lpass clock failed for port 0x%x , err:%d\n",
2467 __func__, port_id, ret);
2468 goto err;
2469 }
2470
2471err:
2472 return ret;
2473}
2474
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002475static int cdc_dma_get_port_idx(struct snd_kcontrol *kcontrol)
2476{
2477 int idx = 0;
2478
2479 if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_0",
2480 sizeof("WSA_CDC_DMA_RX_0")))
2481 idx = WSA_CDC_DMA_RX_0;
2482 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_RX_1",
2483 sizeof("WSA_CDC_DMA_RX_0")))
2484 idx = WSA_CDC_DMA_RX_1;
2485 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_0",
2486 sizeof("RX_CDC_DMA_RX_0")))
2487 idx = RX_CDC_DMA_RX_0;
2488 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_1",
2489 sizeof("RX_CDC_DMA_RX_1")))
2490 idx = RX_CDC_DMA_RX_1;
2491 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_2",
2492 sizeof("RX_CDC_DMA_RX_2")))
2493 idx = RX_CDC_DMA_RX_2;
2494 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_3",
2495 sizeof("RX_CDC_DMA_RX_3")))
2496 idx = RX_CDC_DMA_RX_3;
2497 else if (strnstr(kcontrol->id.name, "RX_CDC_DMA_RX_5",
2498 sizeof("RX_CDC_DMA_RX_5")))
2499 idx = RX_CDC_DMA_RX_5;
2500 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_0",
2501 sizeof("WSA_CDC_DMA_TX_0")))
2502 idx = WSA_CDC_DMA_TX_0;
2503 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_1",
2504 sizeof("WSA_CDC_DMA_TX_1")))
2505 idx = WSA_CDC_DMA_TX_1;
2506 else if (strnstr(kcontrol->id.name, "WSA_CDC_DMA_TX_2",
2507 sizeof("WSA_CDC_DMA_TX_2")))
2508 idx = WSA_CDC_DMA_TX_2;
2509 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_0",
2510 sizeof("TX_CDC_DMA_TX_0")))
2511 idx = TX_CDC_DMA_TX_0;
2512 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_3",
2513 sizeof("TX_CDC_DMA_TX_3")))
2514 idx = TX_CDC_DMA_TX_3;
2515 else if (strnstr(kcontrol->id.name, "TX_CDC_DMA_TX_4",
2516 sizeof("TX_CDC_DMA_TX_4")))
2517 idx = TX_CDC_DMA_TX_4;
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08002518 else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_0",
2519 sizeof("VA_CDC_DMA_TX_0")))
2520 idx = VA_CDC_DMA_TX_0;
2521 else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_1",
2522 sizeof("VA_CDC_DMA_TX_1")))
2523 idx = VA_CDC_DMA_TX_1;
2524 else if (strnstr(kcontrol->id.name, "VA_CDC_DMA_TX_2",
2525 sizeof("VA_CDC_DMA_TX_2")))
2526 idx = VA_CDC_DMA_TX_2;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002527 else {
2528 pr_err("%s: unsupported channel: %s\n",
2529 __func__, kcontrol->id.name);
2530 return -EINVAL;
2531 }
2532
2533 return idx;
2534}
2535
2536static int cdc_dma_rx_ch_get(struct snd_kcontrol *kcontrol,
2537 struct snd_ctl_elem_value *ucontrol)
2538{
2539 int ch_num = cdc_dma_get_port_idx(kcontrol);
2540
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002541 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002542 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2543 return ch_num;
2544 }
2545
2546 pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__,
2547 cdc_dma_rx_cfg[ch_num].channels - 1);
2548 ucontrol->value.integer.value[0] = cdc_dma_rx_cfg[ch_num].channels - 1;
2549 return 0;
2550}
2551
2552static int cdc_dma_rx_ch_put(struct snd_kcontrol *kcontrol,
2553 struct snd_ctl_elem_value *ucontrol)
2554{
2555 int ch_num = cdc_dma_get_port_idx(kcontrol);
2556
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002557 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002558 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2559 return ch_num;
2560 }
2561
2562 cdc_dma_rx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1;
2563
2564 pr_debug("%s: cdc_dma_rx_ch = %d\n", __func__,
2565 cdc_dma_rx_cfg[ch_num].channels);
2566 return 1;
2567}
2568
2569static int cdc_dma_rx_format_get(struct snd_kcontrol *kcontrol,
2570 struct snd_ctl_elem_value *ucontrol)
2571{
2572 int ch_num = cdc_dma_get_port_idx(kcontrol);
2573
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002574 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002575 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2576 return ch_num;
2577 }
2578
2579 switch (cdc_dma_rx_cfg[ch_num].bit_format) {
2580 case SNDRV_PCM_FORMAT_S32_LE:
2581 ucontrol->value.integer.value[0] = 3;
2582 break;
2583 case SNDRV_PCM_FORMAT_S24_3LE:
2584 ucontrol->value.integer.value[0] = 2;
2585 break;
2586 case SNDRV_PCM_FORMAT_S24_LE:
2587 ucontrol->value.integer.value[0] = 1;
2588 break;
2589 case SNDRV_PCM_FORMAT_S16_LE:
2590 default:
2591 ucontrol->value.integer.value[0] = 0;
2592 break;
2593 }
2594
2595 pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n",
2596 __func__, cdc_dma_rx_cfg[ch_num].bit_format,
2597 ucontrol->value.integer.value[0]);
2598 return 0;
2599}
2600
2601static int cdc_dma_rx_format_put(struct snd_kcontrol *kcontrol,
2602 struct snd_ctl_elem_value *ucontrol)
2603{
2604 int rc = 0;
2605 int ch_num = cdc_dma_get_port_idx(kcontrol);
2606
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002607 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002608 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2609 return ch_num;
2610 }
2611
2612 switch (ucontrol->value.integer.value[0]) {
2613 case 3:
2614 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE;
2615 break;
2616 case 2:
2617 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
2618 break;
2619 case 1:
2620 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE;
2621 break;
2622 case 0:
2623 default:
2624 cdc_dma_rx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE;
2625 break;
2626 }
2627 pr_debug("%s: cdc_dma_rx_format = %d, ucontrol value = %ld\n",
2628 __func__, cdc_dma_rx_cfg[ch_num].bit_format,
2629 ucontrol->value.integer.value[0]);
2630
2631 return rc;
2632}
2633
2634
2635static int cdc_dma_get_sample_rate_val(int sample_rate)
2636{
2637 int sample_rate_val = 0;
2638
2639 switch (sample_rate) {
2640 case SAMPLING_RATE_8KHZ:
2641 sample_rate_val = 0;
2642 break;
2643 case SAMPLING_RATE_11P025KHZ:
2644 sample_rate_val = 1;
2645 break;
2646 case SAMPLING_RATE_16KHZ:
2647 sample_rate_val = 2;
2648 break;
2649 case SAMPLING_RATE_22P05KHZ:
2650 sample_rate_val = 3;
2651 break;
2652 case SAMPLING_RATE_32KHZ:
2653 sample_rate_val = 4;
2654 break;
2655 case SAMPLING_RATE_44P1KHZ:
2656 sample_rate_val = 5;
2657 break;
2658 case SAMPLING_RATE_48KHZ:
2659 sample_rate_val = 6;
2660 break;
2661 case SAMPLING_RATE_88P2KHZ:
2662 sample_rate_val = 7;
2663 break;
2664 case SAMPLING_RATE_96KHZ:
2665 sample_rate_val = 8;
2666 break;
2667 case SAMPLING_RATE_176P4KHZ:
2668 sample_rate_val = 9;
2669 break;
2670 case SAMPLING_RATE_192KHZ:
2671 sample_rate_val = 10;
2672 break;
2673 case SAMPLING_RATE_352P8KHZ:
2674 sample_rate_val = 11;
2675 break;
2676 case SAMPLING_RATE_384KHZ:
2677 sample_rate_val = 12;
2678 break;
2679 default:
2680 sample_rate_val = 6;
2681 break;
2682 }
2683 return sample_rate_val;
2684}
2685
2686static int cdc_dma_get_sample_rate(int value)
2687{
2688 int sample_rate = 0;
2689
2690 switch (value) {
2691 case 0:
2692 sample_rate = SAMPLING_RATE_8KHZ;
2693 break;
2694 case 1:
2695 sample_rate = SAMPLING_RATE_11P025KHZ;
2696 break;
2697 case 2:
2698 sample_rate = SAMPLING_RATE_16KHZ;
2699 break;
2700 case 3:
2701 sample_rate = SAMPLING_RATE_22P05KHZ;
2702 break;
2703 case 4:
2704 sample_rate = SAMPLING_RATE_32KHZ;
2705 break;
2706 case 5:
2707 sample_rate = SAMPLING_RATE_44P1KHZ;
2708 break;
2709 case 6:
2710 sample_rate = SAMPLING_RATE_48KHZ;
2711 break;
2712 case 7:
2713 sample_rate = SAMPLING_RATE_88P2KHZ;
2714 break;
2715 case 8:
2716 sample_rate = SAMPLING_RATE_96KHZ;
2717 break;
2718 case 9:
2719 sample_rate = SAMPLING_RATE_176P4KHZ;
2720 break;
2721 case 10:
2722 sample_rate = SAMPLING_RATE_192KHZ;
2723 break;
2724 case 11:
2725 sample_rate = SAMPLING_RATE_352P8KHZ;
2726 break;
2727 case 12:
2728 sample_rate = SAMPLING_RATE_384KHZ;
2729 break;
2730 default:
2731 sample_rate = SAMPLING_RATE_48KHZ;
2732 break;
2733 }
2734 return sample_rate;
2735}
2736
2737static int cdc_dma_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
2738 struct snd_ctl_elem_value *ucontrol)
2739{
2740 int ch_num = cdc_dma_get_port_idx(kcontrol);
2741
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002742 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002743 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2744 return ch_num;
2745 }
2746
2747 ucontrol->value.enumerated.item[0] =
2748 cdc_dma_get_sample_rate_val(cdc_dma_rx_cfg[ch_num].sample_rate);
2749
2750 pr_debug("%s: cdc_dma_rx_sample_rate = %d\n", __func__,
2751 cdc_dma_rx_cfg[ch_num].sample_rate);
2752 return 0;
2753}
2754
2755static int cdc_dma_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
2756 struct snd_ctl_elem_value *ucontrol)
2757{
2758 int ch_num = cdc_dma_get_port_idx(kcontrol);
2759
Vignesh Kulothungan9e17da02019-03-21 12:15:59 -07002760 if (ch_num < 0 || ch_num >= CDC_DMA_RX_MAX) {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07002761 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2762 return ch_num;
2763 }
2764
2765 cdc_dma_rx_cfg[ch_num].sample_rate =
2766 cdc_dma_get_sample_rate(ucontrol->value.enumerated.item[0]);
2767
2768
2769 pr_debug("%s: control value = %d, cdc_dma_rx_sample_rate = %d\n",
2770 __func__, ucontrol->value.enumerated.item[0],
2771 cdc_dma_rx_cfg[ch_num].sample_rate);
2772 return 0;
2773}
2774
2775static int cdc_dma_tx_ch_get(struct snd_kcontrol *kcontrol,
2776 struct snd_ctl_elem_value *ucontrol)
2777{
2778 int ch_num = cdc_dma_get_port_idx(kcontrol);
2779
2780 if (ch_num < 0) {
2781 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2782 return ch_num;
2783 }
2784
2785 pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__,
2786 cdc_dma_tx_cfg[ch_num].channels);
2787 ucontrol->value.integer.value[0] = cdc_dma_tx_cfg[ch_num].channels - 1;
2788 return 0;
2789}
2790
2791static int cdc_dma_tx_ch_put(struct snd_kcontrol *kcontrol,
2792 struct snd_ctl_elem_value *ucontrol)
2793{
2794 int ch_num = cdc_dma_get_port_idx(kcontrol);
2795
2796 if (ch_num < 0) {
2797 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2798 return ch_num;
2799 }
2800
2801 cdc_dma_tx_cfg[ch_num].channels = ucontrol->value.integer.value[0] + 1;
2802
2803 pr_debug("%s: cdc_dma_tx_ch = %d\n", __func__,
2804 cdc_dma_tx_cfg[ch_num].channels);
2805 return 1;
2806}
2807
2808static int cdc_dma_tx_sample_rate_get(struct snd_kcontrol *kcontrol,
2809 struct snd_ctl_elem_value *ucontrol)
2810{
2811 int sample_rate_val;
2812 int ch_num = cdc_dma_get_port_idx(kcontrol);
2813
2814 if (ch_num < 0) {
2815 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2816 return ch_num;
2817 }
2818
2819 switch (cdc_dma_tx_cfg[ch_num].sample_rate) {
2820 case SAMPLING_RATE_384KHZ:
2821 sample_rate_val = 12;
2822 break;
2823 case SAMPLING_RATE_352P8KHZ:
2824 sample_rate_val = 11;
2825 break;
2826 case SAMPLING_RATE_192KHZ:
2827 sample_rate_val = 10;
2828 break;
2829 case SAMPLING_RATE_176P4KHZ:
2830 sample_rate_val = 9;
2831 break;
2832 case SAMPLING_RATE_96KHZ:
2833 sample_rate_val = 8;
2834 break;
2835 case SAMPLING_RATE_88P2KHZ:
2836 sample_rate_val = 7;
2837 break;
2838 case SAMPLING_RATE_48KHZ:
2839 sample_rate_val = 6;
2840 break;
2841 case SAMPLING_RATE_44P1KHZ:
2842 sample_rate_val = 5;
2843 break;
2844 case SAMPLING_RATE_32KHZ:
2845 sample_rate_val = 4;
2846 break;
2847 case SAMPLING_RATE_22P05KHZ:
2848 sample_rate_val = 3;
2849 break;
2850 case SAMPLING_RATE_16KHZ:
2851 sample_rate_val = 2;
2852 break;
2853 case SAMPLING_RATE_11P025KHZ:
2854 sample_rate_val = 1;
2855 break;
2856 case SAMPLING_RATE_8KHZ:
2857 sample_rate_val = 0;
2858 break;
2859 default:
2860 sample_rate_val = 6;
2861 break;
2862 }
2863
2864 ucontrol->value.integer.value[0] = sample_rate_val;
2865 pr_debug("%s: cdc_dma_tx_sample_rate = %d\n", __func__,
2866 cdc_dma_tx_cfg[ch_num].sample_rate);
2867 return 0;
2868}
2869
2870static int cdc_dma_tx_sample_rate_put(struct snd_kcontrol *kcontrol,
2871 struct snd_ctl_elem_value *ucontrol)
2872{
2873 int ch_num = cdc_dma_get_port_idx(kcontrol);
2874
2875 if (ch_num < 0) {
2876 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2877 return ch_num;
2878 }
2879
2880 switch (ucontrol->value.integer.value[0]) {
2881 case 12:
2882 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_384KHZ;
2883 break;
2884 case 11:
2885 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_352P8KHZ;
2886 break;
2887 case 10:
2888 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_192KHZ;
2889 break;
2890 case 9:
2891 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_176P4KHZ;
2892 break;
2893 case 8:
2894 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_96KHZ;
2895 break;
2896 case 7:
2897 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_88P2KHZ;
2898 break;
2899 case 6:
2900 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ;
2901 break;
2902 case 5:
2903 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_44P1KHZ;
2904 break;
2905 case 4:
2906 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_32KHZ;
2907 break;
2908 case 3:
2909 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_22P05KHZ;
2910 break;
2911 case 2:
2912 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_16KHZ;
2913 break;
2914 case 1:
2915 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_11P025KHZ;
2916 break;
2917 case 0:
2918 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_8KHZ;
2919 break;
2920 default:
2921 cdc_dma_tx_cfg[ch_num].sample_rate = SAMPLING_RATE_48KHZ;
2922 break;
2923 }
2924
2925 pr_debug("%s: control value = %ld, cdc_dma_tx_sample_rate = %d\n",
2926 __func__, ucontrol->value.integer.value[0],
2927 cdc_dma_tx_cfg[ch_num].sample_rate);
2928 return 0;
2929}
2930
2931static int cdc_dma_tx_format_get(struct snd_kcontrol *kcontrol,
2932 struct snd_ctl_elem_value *ucontrol)
2933{
2934 int ch_num = cdc_dma_get_port_idx(kcontrol);
2935
2936 if (ch_num < 0) {
2937 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2938 return ch_num;
2939 }
2940
2941 switch (cdc_dma_tx_cfg[ch_num].bit_format) {
2942 case SNDRV_PCM_FORMAT_S32_LE:
2943 ucontrol->value.integer.value[0] = 3;
2944 break;
2945 case SNDRV_PCM_FORMAT_S24_3LE:
2946 ucontrol->value.integer.value[0] = 2;
2947 break;
2948 case SNDRV_PCM_FORMAT_S24_LE:
2949 ucontrol->value.integer.value[0] = 1;
2950 break;
2951 case SNDRV_PCM_FORMAT_S16_LE:
2952 default:
2953 ucontrol->value.integer.value[0] = 0;
2954 break;
2955 }
2956
2957 pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n",
2958 __func__, cdc_dma_tx_cfg[ch_num].bit_format,
2959 ucontrol->value.integer.value[0]);
2960 return 0;
2961}
2962
2963static int cdc_dma_tx_format_put(struct snd_kcontrol *kcontrol,
2964 struct snd_ctl_elem_value *ucontrol)
2965{
2966 int rc = 0;
2967 int ch_num = cdc_dma_get_port_idx(kcontrol);
2968
2969 if (ch_num < 0) {
2970 pr_err("%s: ch_num: %d is invalid\n", __func__, ch_num);
2971 return ch_num;
2972 }
2973
2974 switch (ucontrol->value.integer.value[0]) {
2975 case 3:
2976 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S32_LE;
2977 break;
2978 case 2:
2979 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_3LE;
2980 break;
2981 case 1:
2982 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S24_LE;
2983 break;
2984 case 0:
2985 default:
2986 cdc_dma_tx_cfg[ch_num].bit_format = SNDRV_PCM_FORMAT_S16_LE;
2987 break;
2988 }
2989 pr_debug("%s: cdc_dma_tx_format = %d, ucontrol value = %ld\n",
2990 __func__, cdc_dma_tx_cfg[ch_num].bit_format,
2991 ucontrol->value.integer.value[0]);
2992
2993 return rc;
2994}
2995
2996static int msm_cdc_dma_get_idx_from_beid(int32_t be_id)
2997{
2998 int idx = 0;
2999
3000 switch (be_id) {
3001 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
3002 idx = WSA_CDC_DMA_RX_0;
3003 break;
3004 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
3005 idx = WSA_CDC_DMA_TX_0;
3006 break;
3007 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
3008 idx = WSA_CDC_DMA_RX_1;
3009 break;
3010 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
3011 idx = WSA_CDC_DMA_TX_1;
3012 break;
3013 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
3014 idx = WSA_CDC_DMA_TX_2;
3015 break;
3016 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
3017 idx = RX_CDC_DMA_RX_0;
3018 break;
3019 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
3020 idx = RX_CDC_DMA_RX_1;
3021 break;
3022 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
3023 idx = RX_CDC_DMA_RX_2;
3024 break;
3025 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
3026 idx = RX_CDC_DMA_RX_3;
3027 break;
3028 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5:
3029 idx = RX_CDC_DMA_RX_5;
3030 break;
3031 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
3032 idx = TX_CDC_DMA_TX_0;
3033 break;
3034 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
3035 idx = TX_CDC_DMA_TX_3;
3036 break;
3037 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
3038 idx = TX_CDC_DMA_TX_4;
3039 break;
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003040 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
3041 idx = VA_CDC_DMA_TX_0;
3042 break;
3043 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
3044 idx = VA_CDC_DMA_TX_1;
3045 break;
3046 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
3047 idx = VA_CDC_DMA_TX_2;
3048 break;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003049 default:
3050 idx = RX_CDC_DMA_RX_0;
3051 break;
3052 }
3053
3054 return idx;
3055}
3056
Banajit Goswami83a370d2019-03-05 16:15:21 -08003057static int msm_bt_sample_rate_get(struct snd_kcontrol *kcontrol,
3058 struct snd_ctl_elem_value *ucontrol)
3059{
3060 /*
3061 * Slimbus_7_Rx/Tx sample rate values should always be in sync (same)
3062 * when used for BT_SCO use case. Return either Rx or Tx sample rate
3063 * value.
3064 */
3065 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
3066 case SAMPLING_RATE_96KHZ:
3067 ucontrol->value.integer.value[0] = 5;
3068 break;
3069 case SAMPLING_RATE_88P2KHZ:
3070 ucontrol->value.integer.value[0] = 4;
3071 break;
3072 case SAMPLING_RATE_48KHZ:
3073 ucontrol->value.integer.value[0] = 3;
3074 break;
3075 case SAMPLING_RATE_44P1KHZ:
3076 ucontrol->value.integer.value[0] = 2;
3077 break;
3078 case SAMPLING_RATE_16KHZ:
3079 ucontrol->value.integer.value[0] = 1;
3080 break;
3081 case SAMPLING_RATE_8KHZ:
3082 default:
3083 ucontrol->value.integer.value[0] = 0;
3084 break;
3085 }
3086 pr_debug("%s: sample rate = %d\n", __func__,
3087 slim_rx_cfg[SLIM_RX_7].sample_rate);
3088
3089 return 0;
3090}
3091
3092static int msm_bt_sample_rate_put(struct snd_kcontrol *kcontrol,
3093 struct snd_ctl_elem_value *ucontrol)
3094{
3095 switch (ucontrol->value.integer.value[0]) {
3096 case 1:
3097 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
3098 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
3099 break;
3100 case 2:
3101 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3102 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3103 break;
3104 case 3:
3105 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
3106 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
3107 break;
3108 case 4:
3109 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3110 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3111 break;
3112 case 5:
3113 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
3114 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
3115 break;
3116 case 0:
3117 default:
3118 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
3119 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
3120 break;
3121 }
3122 pr_debug("%s: sample rates: slim7_rx = %d, slim7_tx = %d, value = %d\n",
3123 __func__,
3124 slim_rx_cfg[SLIM_RX_7].sample_rate,
3125 slim_tx_cfg[SLIM_TX_7].sample_rate,
3126 ucontrol->value.enumerated.item[0]);
3127
3128 return 0;
3129}
3130
3131static int msm_bt_sample_rate_rx_get(struct snd_kcontrol *kcontrol,
3132 struct snd_ctl_elem_value *ucontrol)
3133{
3134 switch (slim_rx_cfg[SLIM_RX_7].sample_rate) {
3135 case SAMPLING_RATE_96KHZ:
3136 ucontrol->value.integer.value[0] = 5;
3137 break;
3138 case SAMPLING_RATE_88P2KHZ:
3139 ucontrol->value.integer.value[0] = 4;
3140 break;
3141 case SAMPLING_RATE_48KHZ:
3142 ucontrol->value.integer.value[0] = 3;
3143 break;
3144 case SAMPLING_RATE_44P1KHZ:
3145 ucontrol->value.integer.value[0] = 2;
3146 break;
3147 case SAMPLING_RATE_16KHZ:
3148 ucontrol->value.integer.value[0] = 1;
3149 break;
3150 case SAMPLING_RATE_8KHZ:
3151 default:
3152 ucontrol->value.integer.value[0] = 0;
3153 break;
3154 }
3155 pr_debug("%s: sample rate rx = %d\n", __func__,
3156 slim_rx_cfg[SLIM_RX_7].sample_rate);
3157
3158 return 0;
3159}
3160
3161static int msm_bt_sample_rate_rx_put(struct snd_kcontrol *kcontrol,
3162 struct snd_ctl_elem_value *ucontrol)
3163{
3164 switch (ucontrol->value.integer.value[0]) {
3165 case 1:
3166 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_16KHZ;
3167 break;
3168 case 2:
3169 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3170 break;
3171 case 3:
3172 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_48KHZ;
3173 break;
3174 case 4:
3175 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3176 break;
3177 case 5:
3178 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_96KHZ;
3179 break;
3180 case 0:
3181 default:
3182 slim_rx_cfg[SLIM_RX_7].sample_rate = SAMPLING_RATE_8KHZ;
3183 break;
3184 }
3185 pr_debug("%s: sample rate: slim7_rx = %d, value = %d\n",
3186 __func__,
3187 slim_rx_cfg[SLIM_RX_7].sample_rate,
3188 ucontrol->value.enumerated.item[0]);
3189
3190 return 0;
3191}
3192
3193static int msm_bt_sample_rate_tx_get(struct snd_kcontrol *kcontrol,
3194 struct snd_ctl_elem_value *ucontrol)
3195{
3196 switch (slim_tx_cfg[SLIM_TX_7].sample_rate) {
3197 case SAMPLING_RATE_96KHZ:
3198 ucontrol->value.integer.value[0] = 5;
3199 break;
3200 case SAMPLING_RATE_88P2KHZ:
3201 ucontrol->value.integer.value[0] = 4;
3202 break;
3203 case SAMPLING_RATE_48KHZ:
3204 ucontrol->value.integer.value[0] = 3;
3205 break;
3206 case SAMPLING_RATE_44P1KHZ:
3207 ucontrol->value.integer.value[0] = 2;
3208 break;
3209 case SAMPLING_RATE_16KHZ:
3210 ucontrol->value.integer.value[0] = 1;
3211 break;
3212 case SAMPLING_RATE_8KHZ:
3213 default:
3214 ucontrol->value.integer.value[0] = 0;
3215 break;
3216 }
3217 pr_debug("%s: sample rate tx = %d\n", __func__,
3218 slim_tx_cfg[SLIM_TX_7].sample_rate);
3219
3220 return 0;
3221}
3222
3223static int msm_bt_sample_rate_tx_put(struct snd_kcontrol *kcontrol,
3224 struct snd_ctl_elem_value *ucontrol)
3225{
3226 switch (ucontrol->value.integer.value[0]) {
3227 case 1:
3228 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_16KHZ;
3229 break;
3230 case 2:
3231 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_44P1KHZ;
3232 break;
3233 case 3:
3234 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_48KHZ;
3235 break;
3236 case 4:
3237 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_88P2KHZ;
3238 break;
3239 case 5:
3240 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_96KHZ;
3241 break;
3242 case 0:
3243 default:
3244 slim_tx_cfg[SLIM_TX_7].sample_rate = SAMPLING_RATE_8KHZ;
3245 break;
3246 }
3247 pr_debug("%s: sample rate: slim7_tx = %d, value = %d\n",
3248 __func__,
3249 slim_tx_cfg[SLIM_TX_7].sample_rate,
3250 ucontrol->value.enumerated.item[0]);
3251
3252 return 0;
3253}
3254
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003255static const struct snd_kcontrol_new msm_int_snd_controls[] = {
3256 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Channels", wsa_cdc_dma_rx_0_chs,
3257 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3258 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Channels", wsa_cdc_dma_rx_1_chs,
3259 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3260 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Channels", rx_cdc_dma_rx_0_chs,
3261 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3262 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Channels", rx_cdc_dma_rx_1_chs,
3263 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3264 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Channels", rx_cdc_dma_rx_2_chs,
3265 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3266 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Channels", rx_cdc_dma_rx_3_chs,
3267 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3268 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Channels", rx_cdc_dma_rx_5_chs,
3269 cdc_dma_rx_ch_get, cdc_dma_rx_ch_put),
3270 SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 Channels", wsa_cdc_dma_tx_0_chs,
3271 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3272 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Channels", wsa_cdc_dma_tx_1_chs,
3273 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3274 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Channels", wsa_cdc_dma_tx_2_chs,
3275 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3276 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Channels", tx_cdc_dma_tx_0_chs,
3277 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3278 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Channels", tx_cdc_dma_tx_3_chs,
3279 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3280 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Channels", tx_cdc_dma_tx_4_chs,
3281 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003282 SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Channels", va_cdc_dma_tx_0_chs,
3283 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3284 SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Channels", va_cdc_dma_tx_1_chs,
3285 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
3286 SOC_ENUM_EXT("VA_CDC_DMA_TX_2 Channels", va_cdc_dma_tx_2_chs,
3287 cdc_dma_tx_ch_get, cdc_dma_tx_ch_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003288 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 Format", wsa_cdc_dma_rx_0_format,
3289 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3290 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 Format", wsa_cdc_dma_rx_1_format,
3291 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3292 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 Format", rx_cdc_dma_rx_0_format,
3293 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3294 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 Format", rx_cdc_dma_rx_1_format,
3295 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3296 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 Format", rx_cdc_dma_rx_2_format,
3297 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3298 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 Format", rx_cdc_dma_rx_3_format,
3299 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3300 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 Format", rx_cdc_dma_rx_5_format,
3301 cdc_dma_rx_format_get, cdc_dma_rx_format_put),
3302 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 Format", wsa_cdc_dma_tx_1_format,
3303 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3304 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 Format", wsa_cdc_dma_tx_2_format,
3305 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3306 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 Format", tx_cdc_dma_tx_0_format,
3307 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3308 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 Format", tx_cdc_dma_tx_3_format,
3309 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3310 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 Format", tx_cdc_dma_tx_4_format,
3311 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003312 SOC_ENUM_EXT("VA_CDC_DMA_TX_0 Format", va_cdc_dma_tx_0_format,
3313 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3314 SOC_ENUM_EXT("VA_CDC_DMA_TX_1 Format", va_cdc_dma_tx_1_format,
3315 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
3316 SOC_ENUM_EXT("VA_CDC_DMA_TX_2 Format", va_cdc_dma_tx_2_format,
3317 cdc_dma_tx_format_get, cdc_dma_tx_format_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003318 SOC_ENUM_EXT("WSA_CDC_DMA_RX_0 SampleRate",
3319 wsa_cdc_dma_rx_0_sample_rate,
3320 cdc_dma_rx_sample_rate_get,
3321 cdc_dma_rx_sample_rate_put),
3322 SOC_ENUM_EXT("WSA_CDC_DMA_RX_1 SampleRate",
3323 wsa_cdc_dma_rx_1_sample_rate,
3324 cdc_dma_rx_sample_rate_get,
3325 cdc_dma_rx_sample_rate_put),
3326 SOC_ENUM_EXT("RX_CDC_DMA_RX_0 SampleRate",
3327 rx_cdc_dma_rx_0_sample_rate,
3328 cdc_dma_rx_sample_rate_get,
3329 cdc_dma_rx_sample_rate_put),
3330 SOC_ENUM_EXT("RX_CDC_DMA_RX_1 SampleRate",
3331 rx_cdc_dma_rx_1_sample_rate,
3332 cdc_dma_rx_sample_rate_get,
3333 cdc_dma_rx_sample_rate_put),
3334 SOC_ENUM_EXT("RX_CDC_DMA_RX_2 SampleRate",
3335 rx_cdc_dma_rx_2_sample_rate,
3336 cdc_dma_rx_sample_rate_get,
3337 cdc_dma_rx_sample_rate_put),
3338 SOC_ENUM_EXT("RX_CDC_DMA_RX_3 SampleRate",
3339 rx_cdc_dma_rx_3_sample_rate,
3340 cdc_dma_rx_sample_rate_get,
3341 cdc_dma_rx_sample_rate_put),
3342 SOC_ENUM_EXT("RX_CDC_DMA_RX_5 SampleRate",
3343 rx_cdc_dma_rx_5_sample_rate,
3344 cdc_dma_rx_sample_rate_get,
3345 cdc_dma_rx_sample_rate_put),
3346 SOC_ENUM_EXT("WSA_CDC_DMA_TX_0 SampleRate",
3347 wsa_cdc_dma_tx_0_sample_rate,
3348 cdc_dma_tx_sample_rate_get,
3349 cdc_dma_tx_sample_rate_put),
3350 SOC_ENUM_EXT("WSA_CDC_DMA_TX_1 SampleRate",
3351 wsa_cdc_dma_tx_1_sample_rate,
3352 cdc_dma_tx_sample_rate_get,
3353 cdc_dma_tx_sample_rate_put),
3354 SOC_ENUM_EXT("WSA_CDC_DMA_TX_2 SampleRate",
3355 wsa_cdc_dma_tx_2_sample_rate,
3356 cdc_dma_tx_sample_rate_get,
3357 cdc_dma_tx_sample_rate_put),
3358 SOC_ENUM_EXT("TX_CDC_DMA_TX_0 SampleRate",
3359 tx_cdc_dma_tx_0_sample_rate,
3360 cdc_dma_tx_sample_rate_get,
3361 cdc_dma_tx_sample_rate_put),
3362 SOC_ENUM_EXT("TX_CDC_DMA_TX_3 SampleRate",
3363 tx_cdc_dma_tx_3_sample_rate,
3364 cdc_dma_tx_sample_rate_get,
3365 cdc_dma_tx_sample_rate_put),
3366 SOC_ENUM_EXT("TX_CDC_DMA_TX_4 SampleRate",
3367 tx_cdc_dma_tx_4_sample_rate,
3368 cdc_dma_tx_sample_rate_get,
3369 cdc_dma_tx_sample_rate_put),
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08003370 SOC_ENUM_EXT("VA_CDC_DMA_TX_0 SampleRate",
3371 va_cdc_dma_tx_0_sample_rate,
3372 cdc_dma_tx_sample_rate_get,
3373 cdc_dma_tx_sample_rate_put),
3374 SOC_ENUM_EXT("VA_CDC_DMA_TX_1 SampleRate",
3375 va_cdc_dma_tx_1_sample_rate,
3376 cdc_dma_tx_sample_rate_get,
3377 cdc_dma_tx_sample_rate_put),
3378 SOC_ENUM_EXT("VA_CDC_DMA_TX_2 SampleRate",
3379 va_cdc_dma_tx_2_sample_rate,
3380 cdc_dma_tx_sample_rate_get,
3381 cdc_dma_tx_sample_rate_put),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07003382};
3383
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003384static const struct snd_kcontrol_new msm_common_snd_controls[] = {
3385 SOC_ENUM_EXT("USB_AUDIO_RX SampleRate", usb_rx_sample_rate,
3386 usb_audio_rx_sample_rate_get,
3387 usb_audio_rx_sample_rate_put),
3388 SOC_ENUM_EXT("USB_AUDIO_TX SampleRate", usb_tx_sample_rate,
3389 usb_audio_tx_sample_rate_get,
3390 usb_audio_tx_sample_rate_put),
3391 SOC_ENUM_EXT("PRI_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3392 tdm_rx_sample_rate_get,
3393 tdm_rx_sample_rate_put),
3394 SOC_ENUM_EXT("SEC_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3395 tdm_rx_sample_rate_get,
3396 tdm_rx_sample_rate_put),
3397 SOC_ENUM_EXT("TERT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3398 tdm_rx_sample_rate_get,
3399 tdm_rx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003400 SOC_ENUM_EXT("QUAT_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3401 tdm_rx_sample_rate_get,
3402 tdm_rx_sample_rate_put),
3403 SOC_ENUM_EXT("QUIN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3404 tdm_rx_sample_rate_get,
3405 tdm_rx_sample_rate_put),
3406 SOC_ENUM_EXT("SEN_TDM_RX_0 SampleRate", tdm_rx_sample_rate,
3407 tdm_rx_sample_rate_get,
3408 tdm_rx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003409 SOC_ENUM_EXT("PRI_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3410 tdm_tx_sample_rate_get,
3411 tdm_tx_sample_rate_put),
3412 SOC_ENUM_EXT("SEC_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3413 tdm_tx_sample_rate_get,
3414 tdm_tx_sample_rate_put),
3415 SOC_ENUM_EXT("TERT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3416 tdm_tx_sample_rate_get,
3417 tdm_tx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003418 SOC_ENUM_EXT("QUAT_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3419 tdm_tx_sample_rate_get,
3420 tdm_tx_sample_rate_put),
3421 SOC_ENUM_EXT("QUIN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3422 tdm_tx_sample_rate_get,
3423 tdm_tx_sample_rate_put),
3424 SOC_ENUM_EXT("SEN_TDM_TX_0 SampleRate", tdm_tx_sample_rate,
3425 tdm_tx_sample_rate_get,
3426 tdm_tx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003427 SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
3428 aux_pcm_rx_sample_rate_get,
3429 aux_pcm_rx_sample_rate_put),
3430 SOC_ENUM_EXT("SEC_AUX_PCM_RX SampleRate", sec_aux_pcm_rx_sample_rate,
3431 aux_pcm_rx_sample_rate_get,
3432 aux_pcm_rx_sample_rate_put),
3433 SOC_ENUM_EXT("TERT_AUX_PCM_RX SampleRate", tert_aux_pcm_rx_sample_rate,
3434 aux_pcm_rx_sample_rate_get,
3435 aux_pcm_rx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003436 SOC_ENUM_EXT("QUAT_AUX_PCM_RX SampleRate", quat_aux_pcm_rx_sample_rate,
3437 aux_pcm_rx_sample_rate_get,
3438 aux_pcm_rx_sample_rate_put),
3439 SOC_ENUM_EXT("QUIN_AUX_PCM_RX SampleRate", quin_aux_pcm_rx_sample_rate,
3440 aux_pcm_rx_sample_rate_get,
3441 aux_pcm_rx_sample_rate_put),
3442 SOC_ENUM_EXT("SEN_AUX_PCM_RX SampleRate", sen_aux_pcm_rx_sample_rate,
3443 aux_pcm_rx_sample_rate_get,
3444 aux_pcm_rx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003445 SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
3446 aux_pcm_tx_sample_rate_get,
3447 aux_pcm_tx_sample_rate_put),
3448 SOC_ENUM_EXT("SEC_AUX_PCM_TX SampleRate", sec_aux_pcm_tx_sample_rate,
3449 aux_pcm_tx_sample_rate_get,
3450 aux_pcm_tx_sample_rate_put),
3451 SOC_ENUM_EXT("TERT_AUX_PCM_TX SampleRate", tert_aux_pcm_tx_sample_rate,
3452 aux_pcm_tx_sample_rate_get,
3453 aux_pcm_tx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003454 SOC_ENUM_EXT("QUAT_AUX_PCM_TX SampleRate", quat_aux_pcm_tx_sample_rate,
3455 aux_pcm_tx_sample_rate_get,
3456 aux_pcm_tx_sample_rate_put),
3457 SOC_ENUM_EXT("QUIN_AUX_PCM_TX SampleRate", quin_aux_pcm_tx_sample_rate,
3458 aux_pcm_tx_sample_rate_get,
3459 aux_pcm_tx_sample_rate_put),
3460 SOC_ENUM_EXT("SEN_AUX_PCM_TX SampleRate", sen_aux_pcm_tx_sample_rate,
3461 aux_pcm_tx_sample_rate_get,
3462 aux_pcm_tx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003463 SOC_ENUM_EXT("PRIM_MI2S_RX SampleRate", prim_mi2s_rx_sample_rate,
3464 mi2s_rx_sample_rate_get,
3465 mi2s_rx_sample_rate_put),
3466 SOC_ENUM_EXT("SEC_MI2S_RX SampleRate", sec_mi2s_rx_sample_rate,
3467 mi2s_rx_sample_rate_get,
3468 mi2s_rx_sample_rate_put),
3469 SOC_ENUM_EXT("TERT_MI2S_RX SampleRate", tert_mi2s_rx_sample_rate,
3470 mi2s_rx_sample_rate_get,
3471 mi2s_rx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003472 SOC_ENUM_EXT("QUAT_MI2S_RX SampleRate", quat_mi2s_rx_sample_rate,
3473 mi2s_rx_sample_rate_get,
3474 mi2s_rx_sample_rate_put),
3475 SOC_ENUM_EXT("QUIN_MI2S_RX SampleRate", quin_mi2s_rx_sample_rate,
3476 mi2s_rx_sample_rate_get,
3477 mi2s_rx_sample_rate_put),
3478 SOC_ENUM_EXT("SEN_MI2S_RX SampleRate", sen_mi2s_rx_sample_rate,
3479 mi2s_rx_sample_rate_get,
3480 mi2s_rx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003481 SOC_ENUM_EXT("PRIM_MI2S_TX SampleRate", prim_mi2s_tx_sample_rate,
3482 mi2s_tx_sample_rate_get,
3483 mi2s_tx_sample_rate_put),
3484 SOC_ENUM_EXT("SEC_MI2S_TX SampleRate", sec_mi2s_tx_sample_rate,
3485 mi2s_tx_sample_rate_get,
3486 mi2s_tx_sample_rate_put),
3487 SOC_ENUM_EXT("TERT_MI2S_TX SampleRate", tert_mi2s_tx_sample_rate,
3488 mi2s_tx_sample_rate_get,
3489 mi2s_tx_sample_rate_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003490 SOC_ENUM_EXT("QUAT_MI2S_TX SampleRate", quat_mi2s_tx_sample_rate,
3491 mi2s_tx_sample_rate_get,
3492 mi2s_tx_sample_rate_put),
3493 SOC_ENUM_EXT("QUIN_MI2S_TX SampleRate", quin_mi2s_tx_sample_rate,
3494 mi2s_tx_sample_rate_get,
3495 mi2s_tx_sample_rate_put),
3496 SOC_ENUM_EXT("SEN_MI2S_TX SampleRate", sen_mi2s_tx_sample_rate,
3497 mi2s_tx_sample_rate_get,
3498 mi2s_tx_sample_rate_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003499 SOC_ENUM_EXT("USB_AUDIO_RX Format", usb_rx_format,
3500 usb_audio_rx_format_get, usb_audio_rx_format_put),
3501 SOC_ENUM_EXT("USB_AUDIO_TX Format", usb_tx_format,
3502 usb_audio_tx_format_get, usb_audio_tx_format_put),
3503 SOC_ENUM_EXT("PRI_TDM_RX_0 Format", tdm_rx_format,
3504 tdm_rx_format_get,
3505 tdm_rx_format_put),
3506 SOC_ENUM_EXT("SEC_TDM_RX_0 Format", tdm_rx_format,
3507 tdm_rx_format_get,
3508 tdm_rx_format_put),
3509 SOC_ENUM_EXT("TERT_TDM_RX_0 Format", tdm_rx_format,
3510 tdm_rx_format_get,
3511 tdm_rx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003512 SOC_ENUM_EXT("QUAT_TDM_RX_0 Format", tdm_rx_format,
3513 tdm_rx_format_get,
3514 tdm_rx_format_put),
3515 SOC_ENUM_EXT("QUIN_TDM_RX_0 Format", tdm_rx_format,
3516 tdm_rx_format_get,
3517 tdm_rx_format_put),
3518 SOC_ENUM_EXT("SEN_TDM_RX_0 Format", tdm_rx_format,
3519 tdm_rx_format_get,
3520 tdm_rx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003521 SOC_ENUM_EXT("PRI_TDM_TX_0 Format", tdm_tx_format,
3522 tdm_tx_format_get,
3523 tdm_tx_format_put),
3524 SOC_ENUM_EXT("SEC_TDM_TX_0 Format", tdm_tx_format,
3525 tdm_tx_format_get,
3526 tdm_tx_format_put),
3527 SOC_ENUM_EXT("TERT_TDM_TX_0 Format", tdm_tx_format,
3528 tdm_tx_format_get,
3529 tdm_tx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003530 SOC_ENUM_EXT("QUAT_TDM_TX_0 Format", tdm_tx_format,
3531 tdm_tx_format_get,
3532 tdm_tx_format_put),
3533 SOC_ENUM_EXT("QUIN_TDM_TX_0 Format", tdm_tx_format,
3534 tdm_tx_format_get,
3535 tdm_tx_format_put),
3536 SOC_ENUM_EXT("SEN_TDM_TX_0 Format", tdm_tx_format,
3537 tdm_tx_format_get,
3538 tdm_tx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003539 SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
3540 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3541 SOC_ENUM_EXT("SEC_AUX_PCM_RX Format", aux_pcm_rx_format,
3542 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3543 SOC_ENUM_EXT("TERT_AUX_PCM_RX Format", aux_pcm_rx_format,
3544 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003545 SOC_ENUM_EXT("QUAT_AUX_PCM_RX Format", aux_pcm_rx_format,
3546 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3547 SOC_ENUM_EXT("QUIN_AUX_PCM_RX Format", aux_pcm_rx_format,
3548 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3549 SOC_ENUM_EXT("SEN_AUX_PCM_RX Format", aux_pcm_rx_format,
3550 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003551 SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
3552 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3553 SOC_ENUM_EXT("SEC_AUX_PCM_TX Format", aux_pcm_tx_format,
3554 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3555 SOC_ENUM_EXT("TERT_AUX_PCM_TX Format", aux_pcm_tx_format,
3556 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003557 SOC_ENUM_EXT("QUAT_AUX_PCM_TX Format", aux_pcm_tx_format,
3558 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3559 SOC_ENUM_EXT("QUIN_AUX_PCM_TX Format", aux_pcm_tx_format,
3560 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3561 SOC_ENUM_EXT("SEN_AUX_PCM_TX Format", aux_pcm_tx_format,
3562 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003563 SOC_ENUM_EXT("PRIM_MI2S_RX Format", mi2s_rx_format,
3564 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3565 SOC_ENUM_EXT("SEC_MI2S_RX Format", mi2s_rx_format,
3566 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3567 SOC_ENUM_EXT("TERT_MI2S_RX Format", mi2s_rx_format,
3568 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003569 SOC_ENUM_EXT("QUAT_MI2S_RX Format", mi2s_rx_format,
3570 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3571 SOC_ENUM_EXT("QUIN_MI2S_RX Format", mi2s_rx_format,
3572 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
3573 SOC_ENUM_EXT("SEN_MI2S_RX Format", mi2s_rx_format,
3574 msm_mi2s_rx_format_get, msm_mi2s_rx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003575 SOC_ENUM_EXT("PRIM_MI2S_TX Format", mi2s_tx_format,
3576 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3577 SOC_ENUM_EXT("SEC_MI2S_TX Format", mi2s_tx_format,
3578 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3579 SOC_ENUM_EXT("TERT_MI2S_TX Format", mi2s_tx_format,
3580 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003581 SOC_ENUM_EXT("QUAT_MI2S_TX Format", mi2s_tx_format,
3582 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3583 SOC_ENUM_EXT("QUIN_MI2S_TX Format", mi2s_tx_format,
3584 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
3585 SOC_ENUM_EXT("SEN_MI2S_TX Format", mi2s_tx_format,
3586 msm_mi2s_tx_format_get, msm_mi2s_tx_format_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003587 SOC_ENUM_EXT("USB_AUDIO_RX Channels", usb_rx_chs,
3588 usb_audio_rx_ch_get, usb_audio_rx_ch_put),
3589 SOC_ENUM_EXT("USB_AUDIO_TX Channels", usb_tx_chs,
3590 usb_audio_tx_ch_get, usb_audio_tx_ch_put),
3591 SOC_ENUM_EXT("PROXY_RX Channels", proxy_rx_chs,
3592 proxy_rx_ch_get, proxy_rx_ch_put),
3593 SOC_ENUM_EXT("PRI_TDM_RX_0 Channels", tdm_rx_chs,
3594 tdm_rx_ch_get,
3595 tdm_rx_ch_put),
3596 SOC_ENUM_EXT("SEC_TDM_RX_0 Channels", tdm_rx_chs,
3597 tdm_rx_ch_get,
3598 tdm_rx_ch_put),
3599 SOC_ENUM_EXT("TERT_TDM_RX_0 Channels", tdm_rx_chs,
3600 tdm_rx_ch_get,
3601 tdm_rx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003602 SOC_ENUM_EXT("QUAT_TDM_RX_0 Channels", tdm_rx_chs,
3603 tdm_rx_ch_get,
3604 tdm_rx_ch_put),
3605 SOC_ENUM_EXT("QUIN_TDM_RX_0 Channels", tdm_rx_chs,
3606 tdm_rx_ch_get,
3607 tdm_rx_ch_put),
3608 SOC_ENUM_EXT("SEN_TDM_RX_0 Channels", tdm_rx_chs,
3609 tdm_rx_ch_get,
3610 tdm_rx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003611 SOC_ENUM_EXT("PRI_TDM_TX_0 Channels", tdm_tx_chs,
3612 tdm_tx_ch_get,
3613 tdm_tx_ch_put),
3614 SOC_ENUM_EXT("SEC_TDM_TX_0 Channels", tdm_tx_chs,
3615 tdm_tx_ch_get,
3616 tdm_tx_ch_put),
3617 SOC_ENUM_EXT("TERT_TDM_TX_0 Channels", tdm_tx_chs,
3618 tdm_tx_ch_get,
3619 tdm_tx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003620 SOC_ENUM_EXT("QUAT_TDM_TX_0 Channels", tdm_tx_chs,
3621 tdm_tx_ch_get,
3622 tdm_tx_ch_put),
3623 SOC_ENUM_EXT("QUIN_TDM_TX_0 Channels", tdm_tx_chs,
3624 tdm_tx_ch_get,
3625 tdm_tx_ch_put),
3626 SOC_ENUM_EXT("SEN_TDM_TX_0 Channels", tdm_tx_chs,
3627 tdm_tx_ch_get,
3628 tdm_tx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003629 SOC_ENUM_EXT("PRIM_MI2S_RX Channels", prim_mi2s_rx_chs,
3630 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3631 SOC_ENUM_EXT("SEC_MI2S_RX Channels", sec_mi2s_rx_chs,
3632 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3633 SOC_ENUM_EXT("TERT_MI2S_RX Channels", tert_mi2s_rx_chs,
3634 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003635 SOC_ENUM_EXT("QUAT_MI2S_RX Channels", quat_mi2s_rx_chs,
3636 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3637 SOC_ENUM_EXT("QUIN_MI2S_RX Channels", quin_mi2s_rx_chs,
3638 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
3639 SOC_ENUM_EXT("SEN_MI2S_RX Channels", sen_mi2s_rx_chs,
3640 msm_mi2s_rx_ch_get, msm_mi2s_rx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003641 SOC_ENUM_EXT("PRIM_MI2S_TX Channels", prim_mi2s_tx_chs,
3642 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3643 SOC_ENUM_EXT("SEC_MI2S_TX Channels", sec_mi2s_tx_chs,
3644 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3645 SOC_ENUM_EXT("TERT_MI2S_TX Channels", tert_mi2s_tx_chs,
3646 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003647 SOC_ENUM_EXT("QUAT_MI2S_TX Channels", quat_mi2s_tx_chs,
3648 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3649 SOC_ENUM_EXT("QUIN_MI2S_TX Channels", quin_mi2s_tx_chs,
3650 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
3651 SOC_ENUM_EXT("SEN_MI2S_TX Channels", sen_mi2s_tx_chs,
3652 msm_mi2s_tx_ch_get, msm_mi2s_tx_ch_put),
Banajit Goswamib4347d52019-02-28 20:11:49 -08003653 SOC_ENUM_EXT("Display Port RX Channels", ext_disp_rx_chs,
3654 ext_disp_rx_ch_get, ext_disp_rx_ch_put),
3655 SOC_ENUM_EXT("Display Port RX Bit Format", ext_disp_rx_format,
3656 ext_disp_rx_format_get, ext_disp_rx_format_put),
3657 SOC_ENUM_EXT("Display Port RX SampleRate", ext_disp_rx_sample_rate,
3658 ext_disp_rx_sample_rate_get,
3659 ext_disp_rx_sample_rate_put),
Banajit Goswami83a370d2019-03-05 16:15:21 -08003660 SOC_ENUM_EXT("BT SampleRate", bt_sample_rate,
3661 msm_bt_sample_rate_get,
3662 msm_bt_sample_rate_put),
3663 SOC_ENUM_EXT("BT SampleRate RX", bt_sample_rate_rx,
3664 msm_bt_sample_rate_rx_get,
3665 msm_bt_sample_rate_rx_put),
3666 SOC_ENUM_EXT("BT SampleRate TX", bt_sample_rate_tx,
3667 msm_bt_sample_rate_tx_get,
3668 msm_bt_sample_rate_tx_put),
Meng Wange8e53822019-03-18 10:49:50 +08003669 SOC_ENUM_EXT("AFE_LOOPBACK_TX Channels", afe_loopback_tx_chs,
3670 afe_loopback_tx_ch_get, afe_loopback_tx_ch_put),
Meng Wangd1db67c2019-04-17 12:41:34 +08003671 SOC_ENUM_EXT("VI_FEED_TX Channels", vi_feed_tx_chs,
3672 msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put),
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003673};
3674
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07003675static const struct snd_kcontrol_new msm_snd_controls[] = {
3676 SOC_ENUM_EXT("PRIM_AUX_PCM_RX Format", aux_pcm_rx_format,
3677 msm_aux_pcm_rx_format_get, msm_aux_pcm_rx_format_put),
3678 SOC_ENUM_EXT("PRIM_AUX_PCM_TX Format", aux_pcm_tx_format,
3679 msm_aux_pcm_tx_format_get, msm_aux_pcm_tx_format_put),
3680 SOC_ENUM_EXT("PRIM_AUX_PCM_RX SampleRate", prim_aux_pcm_rx_sample_rate,
3681 aux_pcm_rx_sample_rate_get,
3682 aux_pcm_rx_sample_rate_put),
3683 SOC_ENUM_EXT("PRIM_AUX_PCM_TX SampleRate", prim_aux_pcm_tx_sample_rate,
3684 aux_pcm_tx_sample_rate_get,
3685 aux_pcm_tx_sample_rate_put),
3686};
3687
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08003688static int msm_ext_disp_get_idx_from_beid(int32_t be_id)
3689{
3690 int idx;
3691
3692 switch (be_id) {
3693 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
3694 idx = EXT_DISP_RX_IDX_DP;
3695 break;
3696 default:
3697 pr_err("%s: Incorrect ext_disp BE id %d\n", __func__, be_id);
3698 idx = -EINVAL;
3699 break;
3700 }
3701
3702 return idx;
3703}
3704
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07003705static int kona_send_island_va_config(int32_t be_id)
3706{
3707 int rc = 0;
3708 int port_id = 0xFFFF;
3709
3710 port_id = msm_get_port_id(be_id);
3711 if (port_id < 0) {
3712 pr_err("%s: Invalid island interface, be_id: %d\n",
3713 __func__, be_id);
3714 rc = -EINVAL;
3715 } else {
3716 /*
3717 * send island mode config
3718 * This should be the first configuration
3719 */
3720 rc = afe_send_port_island_mode(port_id);
3721 if (rc)
3722 pr_err("%s: afe send island mode failed %d\n",
3723 __func__, rc);
3724 }
3725
3726 return rc;
3727}
3728
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003729static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
3730 struct snd_pcm_hw_params *params)
3731{
3732 struct snd_soc_dai_link *dai_link = rtd->dai_link;
3733 struct snd_interval *rate = hw_param_interval(params,
3734 SNDRV_PCM_HW_PARAM_RATE);
3735 struct snd_interval *channels = hw_param_interval(params,
3736 SNDRV_PCM_HW_PARAM_CHANNELS);
Meng Wange8e53822019-03-18 10:49:50 +08003737 int idx = 0, rc = 0;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003738
3739 pr_debug("%s: format = %d, rate = %d\n",
3740 __func__, params_format(params), params_rate(params));
3741
3742 switch (dai_link->id) {
3743 case MSM_BACKEND_DAI_USB_RX:
3744 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3745 usb_rx_cfg.bit_format);
3746 rate->min = rate->max = usb_rx_cfg.sample_rate;
3747 channels->min = channels->max = usb_rx_cfg.channels;
3748 break;
3749
3750 case MSM_BACKEND_DAI_USB_TX:
3751 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3752 usb_tx_cfg.bit_format);
3753 rate->min = rate->max = usb_tx_cfg.sample_rate;
3754 channels->min = channels->max = usb_tx_cfg.channels;
3755 break;
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08003756
3757 case MSM_BACKEND_DAI_DISPLAY_PORT_RX:
3758 idx = msm_ext_disp_get_idx_from_beid(dai_link->id);
3759 if (idx < 0) {
3760 pr_err("%s: Incorrect ext disp idx %d\n",
3761 __func__, idx);
3762 rc = idx;
3763 goto done;
3764 }
3765
3766 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3767 ext_disp_rx_cfg[idx].bit_format);
3768 rate->min = rate->max = ext_disp_rx_cfg[idx].sample_rate;
3769 channels->min = channels->max = ext_disp_rx_cfg[idx].channels;
3770 break;
3771
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003772 case MSM_BACKEND_DAI_AFE_PCM_RX:
3773 channels->min = channels->max = proxy_rx_cfg.channels;
3774 rate->min = rate->max = SAMPLING_RATE_48KHZ;
3775 break;
3776
3777 case MSM_BACKEND_DAI_PRI_TDM_RX_0:
3778 channels->min = channels->max =
3779 tdm_rx_cfg[TDM_PRI][TDM_0].channels;
3780 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3781 tdm_rx_cfg[TDM_PRI][TDM_0].bit_format);
3782 rate->min = rate->max = tdm_rx_cfg[TDM_PRI][TDM_0].sample_rate;
3783 break;
3784
3785 case MSM_BACKEND_DAI_PRI_TDM_TX_0:
3786 channels->min = channels->max =
3787 tdm_tx_cfg[TDM_PRI][TDM_0].channels;
3788 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3789 tdm_tx_cfg[TDM_PRI][TDM_0].bit_format);
3790 rate->min = rate->max = tdm_tx_cfg[TDM_PRI][TDM_0].sample_rate;
3791 break;
3792
3793 case MSM_BACKEND_DAI_SEC_TDM_RX_0:
3794 channels->min = channels->max =
3795 tdm_rx_cfg[TDM_SEC][TDM_0].channels;
3796 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3797 tdm_rx_cfg[TDM_SEC][TDM_0].bit_format);
3798 rate->min = rate->max = tdm_rx_cfg[TDM_SEC][TDM_0].sample_rate;
3799 break;
3800
3801 case MSM_BACKEND_DAI_SEC_TDM_TX_0:
3802 channels->min = channels->max =
3803 tdm_tx_cfg[TDM_SEC][TDM_0].channels;
3804 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3805 tdm_tx_cfg[TDM_SEC][TDM_0].bit_format);
3806 rate->min = rate->max = tdm_tx_cfg[TDM_SEC][TDM_0].sample_rate;
3807 break;
3808
3809 case MSM_BACKEND_DAI_TERT_TDM_RX_0:
3810 channels->min = channels->max =
3811 tdm_rx_cfg[TDM_TERT][TDM_0].channels;
3812 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3813 tdm_rx_cfg[TDM_TERT][TDM_0].bit_format);
3814 rate->min = rate->max = tdm_rx_cfg[TDM_TERT][TDM_0].sample_rate;
3815 break;
3816
3817 case MSM_BACKEND_DAI_TERT_TDM_TX_0:
3818 channels->min = channels->max =
3819 tdm_tx_cfg[TDM_TERT][TDM_0].channels;
3820 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3821 tdm_tx_cfg[TDM_TERT][TDM_0].bit_format);
3822 rate->min = rate->max = tdm_tx_cfg[TDM_TERT][TDM_0].sample_rate;
3823 break;
3824
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003825 case MSM_BACKEND_DAI_QUAT_TDM_RX_0:
3826 channels->min = channels->max =
3827 tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
3828 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3829 tdm_rx_cfg[TDM_QUAT][TDM_0].bit_format);
3830 rate->min = rate->max = tdm_rx_cfg[TDM_QUAT][TDM_0].sample_rate;
3831 break;
3832
3833 case MSM_BACKEND_DAI_QUAT_TDM_TX_0:
3834 channels->min = channels->max =
3835 tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
3836 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3837 tdm_tx_cfg[TDM_QUAT][TDM_0].bit_format);
3838 rate->min = rate->max = tdm_tx_cfg[TDM_QUAT][TDM_0].sample_rate;
3839 break;
3840
3841 case MSM_BACKEND_DAI_QUIN_TDM_RX_0:
3842 channels->min = channels->max =
3843 tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
3844 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3845 tdm_rx_cfg[TDM_QUIN][TDM_0].bit_format);
3846 rate->min = rate->max = tdm_rx_cfg[TDM_QUIN][TDM_0].sample_rate;
3847 break;
3848
3849 case MSM_BACKEND_DAI_QUIN_TDM_TX_0:
3850 channels->min = channels->max =
3851 tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
3852 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3853 tdm_tx_cfg[TDM_QUIN][TDM_0].bit_format);
3854 rate->min = rate->max = tdm_tx_cfg[TDM_QUIN][TDM_0].sample_rate;
3855 break;
3856
3857 case MSM_BACKEND_DAI_SEN_TDM_RX_0:
3858 channels->min = channels->max =
3859 tdm_rx_cfg[TDM_SEN][TDM_0].channels;
3860 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3861 tdm_rx_cfg[TDM_SEN][TDM_0].bit_format);
3862 rate->min = rate->max = tdm_rx_cfg[TDM_SEN][TDM_0].sample_rate;
3863 break;
3864
3865 case MSM_BACKEND_DAI_SEN_TDM_TX_0:
3866 channels->min = channels->max =
3867 tdm_tx_cfg[TDM_SEN][TDM_0].channels;
3868 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3869 tdm_tx_cfg[TDM_SEN][TDM_0].bit_format);
3870 rate->min = rate->max = tdm_tx_cfg[TDM_SEN][TDM_0].sample_rate;
3871 break;
3872
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003873 case MSM_BACKEND_DAI_AUXPCM_RX:
3874 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3875 aux_pcm_rx_cfg[PRIM_AUX_PCM].bit_format);
3876 rate->min = rate->max =
3877 aux_pcm_rx_cfg[PRIM_AUX_PCM].sample_rate;
3878 channels->min = channels->max =
3879 aux_pcm_rx_cfg[PRIM_AUX_PCM].channels;
3880 break;
3881
3882 case MSM_BACKEND_DAI_AUXPCM_TX:
3883 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3884 aux_pcm_tx_cfg[PRIM_AUX_PCM].bit_format);
3885 rate->min = rate->max =
3886 aux_pcm_tx_cfg[PRIM_AUX_PCM].sample_rate;
3887 channels->min = channels->max =
3888 aux_pcm_tx_cfg[PRIM_AUX_PCM].channels;
3889 break;
3890
3891 case MSM_BACKEND_DAI_SEC_AUXPCM_RX:
3892 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3893 aux_pcm_rx_cfg[SEC_AUX_PCM].bit_format);
3894 rate->min = rate->max =
3895 aux_pcm_rx_cfg[SEC_AUX_PCM].sample_rate;
3896 channels->min = channels->max =
3897 aux_pcm_rx_cfg[SEC_AUX_PCM].channels;
3898 break;
3899
3900 case MSM_BACKEND_DAI_SEC_AUXPCM_TX:
3901 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3902 aux_pcm_tx_cfg[SEC_AUX_PCM].bit_format);
3903 rate->min = rate->max =
3904 aux_pcm_tx_cfg[SEC_AUX_PCM].sample_rate;
3905 channels->min = channels->max =
3906 aux_pcm_tx_cfg[SEC_AUX_PCM].channels;
3907 break;
3908
3909 case MSM_BACKEND_DAI_TERT_AUXPCM_RX:
3910 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3911 aux_pcm_rx_cfg[TERT_AUX_PCM].bit_format);
3912 rate->min = rate->max =
3913 aux_pcm_rx_cfg[TERT_AUX_PCM].sample_rate;
3914 channels->min = channels->max =
3915 aux_pcm_rx_cfg[TERT_AUX_PCM].channels;
3916 break;
3917
3918 case MSM_BACKEND_DAI_TERT_AUXPCM_TX:
3919 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3920 aux_pcm_tx_cfg[TERT_AUX_PCM].bit_format);
3921 rate->min = rate->max =
3922 aux_pcm_tx_cfg[TERT_AUX_PCM].sample_rate;
3923 channels->min = channels->max =
3924 aux_pcm_tx_cfg[TERT_AUX_PCM].channels;
3925 break;
3926
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08003927 case MSM_BACKEND_DAI_QUAT_AUXPCM_RX:
3928 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3929 aux_pcm_rx_cfg[QUAT_AUX_PCM].bit_format);
3930 rate->min = rate->max =
3931 aux_pcm_rx_cfg[QUAT_AUX_PCM].sample_rate;
3932 channels->min = channels->max =
3933 aux_pcm_rx_cfg[QUAT_AUX_PCM].channels;
3934 break;
3935
3936 case MSM_BACKEND_DAI_QUAT_AUXPCM_TX:
3937 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3938 aux_pcm_tx_cfg[QUAT_AUX_PCM].bit_format);
3939 rate->min = rate->max =
3940 aux_pcm_tx_cfg[QUAT_AUX_PCM].sample_rate;
3941 channels->min = channels->max =
3942 aux_pcm_tx_cfg[QUAT_AUX_PCM].channels;
3943 break;
3944
3945 case MSM_BACKEND_DAI_QUIN_AUXPCM_RX:
3946 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3947 aux_pcm_rx_cfg[QUIN_AUX_PCM].bit_format);
3948 rate->min = rate->max =
3949 aux_pcm_rx_cfg[QUIN_AUX_PCM].sample_rate;
3950 channels->min = channels->max =
3951 aux_pcm_rx_cfg[QUIN_AUX_PCM].channels;
3952 break;
3953
3954 case MSM_BACKEND_DAI_QUIN_AUXPCM_TX:
3955 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3956 aux_pcm_tx_cfg[QUIN_AUX_PCM].bit_format);
3957 rate->min = rate->max =
3958 aux_pcm_tx_cfg[QUIN_AUX_PCM].sample_rate;
3959 channels->min = channels->max =
3960 aux_pcm_tx_cfg[QUIN_AUX_PCM].channels;
3961 break;
3962
3963 case MSM_BACKEND_DAI_SEN_AUXPCM_RX:
3964 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3965 aux_pcm_rx_cfg[SEN_AUX_PCM].bit_format);
3966 rate->min = rate->max =
3967 aux_pcm_rx_cfg[SEN_AUX_PCM].sample_rate;
3968 channels->min = channels->max =
3969 aux_pcm_rx_cfg[SEN_AUX_PCM].channels;
3970 break;
3971
3972 case MSM_BACKEND_DAI_SEN_AUXPCM_TX:
3973 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3974 aux_pcm_tx_cfg[SEN_AUX_PCM].bit_format);
3975 rate->min = rate->max =
3976 aux_pcm_tx_cfg[SEN_AUX_PCM].sample_rate;
3977 channels->min = channels->max =
3978 aux_pcm_tx_cfg[SEN_AUX_PCM].channels;
3979 break;
3980
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07003981 case MSM_BACKEND_DAI_PRI_MI2S_RX:
3982 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3983 mi2s_rx_cfg[PRIM_MI2S].bit_format);
3984 rate->min = rate->max = mi2s_rx_cfg[PRIM_MI2S].sample_rate;
3985 channels->min = channels->max =
3986 mi2s_rx_cfg[PRIM_MI2S].channels;
3987 break;
3988
3989 case MSM_BACKEND_DAI_PRI_MI2S_TX:
3990 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3991 mi2s_tx_cfg[PRIM_MI2S].bit_format);
3992 rate->min = rate->max = mi2s_tx_cfg[PRIM_MI2S].sample_rate;
3993 channels->min = channels->max =
3994 mi2s_tx_cfg[PRIM_MI2S].channels;
3995 break;
3996
3997 case MSM_BACKEND_DAI_SECONDARY_MI2S_RX:
3998 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
3999 mi2s_rx_cfg[SEC_MI2S].bit_format);
4000 rate->min = rate->max = mi2s_rx_cfg[SEC_MI2S].sample_rate;
4001 channels->min = channels->max =
4002 mi2s_rx_cfg[SEC_MI2S].channels;
4003 break;
4004
4005 case MSM_BACKEND_DAI_SECONDARY_MI2S_TX:
4006 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4007 mi2s_tx_cfg[SEC_MI2S].bit_format);
4008 rate->min = rate->max = mi2s_tx_cfg[SEC_MI2S].sample_rate;
4009 channels->min = channels->max =
4010 mi2s_tx_cfg[SEC_MI2S].channels;
4011 break;
4012
4013 case MSM_BACKEND_DAI_TERTIARY_MI2S_RX:
4014 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4015 mi2s_rx_cfg[TERT_MI2S].bit_format);
4016 rate->min = rate->max = mi2s_rx_cfg[TERT_MI2S].sample_rate;
4017 channels->min = channels->max =
4018 mi2s_rx_cfg[TERT_MI2S].channels;
4019 break;
4020
4021 case MSM_BACKEND_DAI_TERTIARY_MI2S_TX:
4022 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4023 mi2s_tx_cfg[TERT_MI2S].bit_format);
4024 rate->min = rate->max = mi2s_tx_cfg[TERT_MI2S].sample_rate;
4025 channels->min = channels->max =
4026 mi2s_tx_cfg[TERT_MI2S].channels;
4027 break;
4028
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004029 case MSM_BACKEND_DAI_QUATERNARY_MI2S_RX:
4030 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4031 mi2s_rx_cfg[QUAT_MI2S].bit_format);
4032 rate->min = rate->max = mi2s_rx_cfg[QUAT_MI2S].sample_rate;
4033 channels->min = channels->max =
4034 mi2s_rx_cfg[QUAT_MI2S].channels;
4035 break;
4036
4037 case MSM_BACKEND_DAI_QUATERNARY_MI2S_TX:
4038 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4039 mi2s_tx_cfg[QUAT_MI2S].bit_format);
4040 rate->min = rate->max = mi2s_tx_cfg[QUAT_MI2S].sample_rate;
4041 channels->min = channels->max =
4042 mi2s_tx_cfg[QUAT_MI2S].channels;
4043 break;
4044
4045 case MSM_BACKEND_DAI_QUINARY_MI2S_RX:
4046 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4047 mi2s_rx_cfg[QUIN_MI2S].bit_format);
4048 rate->min = rate->max = mi2s_rx_cfg[QUIN_MI2S].sample_rate;
4049 channels->min = channels->max =
4050 mi2s_rx_cfg[QUIN_MI2S].channels;
4051 break;
4052
4053 case MSM_BACKEND_DAI_QUINARY_MI2S_TX:
4054 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4055 mi2s_tx_cfg[QUIN_MI2S].bit_format);
4056 rate->min = rate->max = mi2s_tx_cfg[QUIN_MI2S].sample_rate;
4057 channels->min = channels->max =
4058 mi2s_tx_cfg[QUIN_MI2S].channels;
4059 break;
4060
4061 case MSM_BACKEND_DAI_SENARY_MI2S_RX:
4062 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4063 mi2s_rx_cfg[SEN_MI2S].bit_format);
4064 rate->min = rate->max = mi2s_rx_cfg[SEN_MI2S].sample_rate;
4065 channels->min = channels->max =
4066 mi2s_rx_cfg[SEN_MI2S].channels;
4067 break;
4068
4069 case MSM_BACKEND_DAI_SENARY_MI2S_TX:
4070 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4071 mi2s_tx_cfg[SEN_MI2S].bit_format);
4072 rate->min = rate->max = mi2s_tx_cfg[SEN_MI2S].sample_rate;
4073 channels->min = channels->max =
4074 mi2s_tx_cfg[SEN_MI2S].channels;
4075 break;
4076
Meng Wang574f4942019-02-18 12:59:41 +08004077 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
4078 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
4079 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
4080 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
4081 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
4082 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
4083 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4084 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4085 cdc_dma_rx_cfg[idx].bit_format);
4086 rate->min = rate->max = cdc_dma_rx_cfg[idx].sample_rate;
4087 channels->min = channels->max = cdc_dma_rx_cfg[idx].channels;
4088 break;
4089
4090 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
4091 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
4092 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
4093 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
4094 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08004095 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
4096 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
4097 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
4098 idx = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4099 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
Meng Wang574f4942019-02-18 12:59:41 +08004100 cdc_dma_tx_cfg[idx].bit_format);
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08004101 rate->min = rate->max = cdc_dma_tx_cfg[idx].sample_rate;
4102 channels->min = channels->max = cdc_dma_tx_cfg[idx].channels;
4103 break;
4104
Meng Wang574f4942019-02-18 12:59:41 +08004105 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
4106 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4107 SNDRV_PCM_FORMAT_S32_LE);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004108 rate->min = rate->max = SAMPLING_RATE_8KHZ;
Meng Wang574f4942019-02-18 12:59:41 +08004109 channels->min = channels->max = msm_vi_feed_tx_ch;
4110 break;
4111
Banajit Goswami83a370d2019-03-05 16:15:21 -08004112 case MSM_BACKEND_DAI_SLIMBUS_7_RX:
4113 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4114 slim_rx_cfg[SLIM_RX_7].bit_format);
4115 rate->min = rate->max = slim_rx_cfg[SLIM_RX_7].sample_rate;
4116 channels->min = channels->max =
4117 slim_rx_cfg[SLIM_RX_7].channels;
4118 break;
4119
4120 case MSM_BACKEND_DAI_SLIMBUS_7_TX:
4121 rate->min = rate->max = slim_tx_cfg[SLIM_TX_7].sample_rate;
4122 channels->min = channels->max =
4123 slim_tx_cfg[SLIM_TX_7].channels;
4124 break;
4125
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05304126 case MSM_BACKEND_DAI_SLIMBUS_8_TX:
4127 rate->min = rate->max = slim_tx_cfg[SLIM_TX_8].sample_rate;
4128 channels->min = channels->max =
4129 slim_tx_cfg[SLIM_TX_8].channels;
4130 break;
4131
Meng Wange8e53822019-03-18 10:49:50 +08004132 case MSM_BACKEND_DAI_AFE_LOOPBACK_TX:
4133 param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
4134 afe_loopback_tx_cfg[idx].bit_format);
4135 rate->min = rate->max = afe_loopback_tx_cfg[idx].sample_rate;
4136 channels->min = channels->max =
4137 afe_loopback_tx_cfg[idx].channels;
4138 break;
4139
Meng Wang574f4942019-02-18 12:59:41 +08004140 default:
4141 rate->min = rate->max = SAMPLING_RATE_48KHZ;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004142 break;
4143 }
4144
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004145done:
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004146 return rc;
4147}
4148
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08004149static bool msm_usbc_swap_gnd_mic(struct snd_soc_component *component, bool active)
4150{
4151 struct snd_soc_card *card = component->card;
4152 struct msm_asoc_mach_data *pdata =
4153 snd_soc_card_get_drvdata(card);
4154
4155 if (!pdata->fsa_handle)
4156 return false;
4157
4158 return fsa4480_switch_event(pdata->fsa_handle, FSA_MIC_GND_SWAP);
4159}
4160
4161static bool msm_swap_gnd_mic(struct snd_soc_component *component, bool active)
4162{
4163 int value = 0;
4164 bool ret = false;
4165 struct snd_soc_card *card;
4166 struct msm_asoc_mach_data *pdata;
4167
4168 if (!component) {
4169 pr_err("%s component is NULL\n", __func__);
4170 return false;
4171 }
4172 card = component->card;
4173 pdata = snd_soc_card_get_drvdata(card);
4174
4175 if (!pdata)
4176 return false;
4177
4178 if (wcd_mbhc_cfg.enable_usbc_analog)
4179 return msm_usbc_swap_gnd_mic(component, active);
4180
4181 /* if usbc is not defined, swap using us_euro_gpio_p */
4182 if (pdata->us_euro_gpio_p) {
4183 value = msm_cdc_pinctrl_get_state(
4184 pdata->us_euro_gpio_p);
4185 if (value)
4186 msm_cdc_pinctrl_select_sleep_state(
4187 pdata->us_euro_gpio_p);
4188 else
4189 msm_cdc_pinctrl_select_active_state(
4190 pdata->us_euro_gpio_p);
4191 dev_dbg(component->dev, "%s: swap select switch %d to %d\n",
4192 __func__, value, !value);
4193 ret = true;
4194 }
4195
4196 return ret;
4197}
4198
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004199static int kona_tdm_snd_hw_params(struct snd_pcm_substream *substream,
4200 struct snd_pcm_hw_params *params)
4201{
4202 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4203 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4204 int ret = 0;
4205 int slot_width = 32;
4206 int channels, slots;
4207 unsigned int slot_mask, rate, clk_freq;
4208 unsigned int slot_offset[8] = {0, 4, 8, 12, 16, 20, 24, 28};
4209
4210 pr_debug("%s: dai id = 0x%x\n", __func__, cpu_dai->id);
4211
4212 /* currently only supporting TDM_RX_0 and TDM_TX_0 */
4213 switch (cpu_dai->id) {
4214 case AFE_PORT_ID_PRIMARY_TDM_RX:
4215 slots = tdm_rx_cfg[TDM_PRI][TDM_0].channels;
4216 break;
4217 case AFE_PORT_ID_SECONDARY_TDM_RX:
4218 slots = tdm_rx_cfg[TDM_SEC][TDM_0].channels;
4219 break;
4220 case AFE_PORT_ID_TERTIARY_TDM_RX:
4221 slots = tdm_rx_cfg[TDM_TERT][TDM_0].channels;
4222 break;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004223 case AFE_PORT_ID_QUATERNARY_TDM_RX:
4224 slots = tdm_rx_cfg[TDM_QUAT][TDM_0].channels;
4225 break;
4226 case AFE_PORT_ID_QUINARY_TDM_RX:
4227 slots = tdm_rx_cfg[TDM_QUIN][TDM_0].channels;
4228 break;
4229 case AFE_PORT_ID_SENARY_TDM_RX:
4230 slots = tdm_rx_cfg[TDM_SEN][TDM_0].channels;
4231 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004232 case AFE_PORT_ID_PRIMARY_TDM_TX:
4233 slots = tdm_tx_cfg[TDM_PRI][TDM_0].channels;
4234 break;
4235 case AFE_PORT_ID_SECONDARY_TDM_TX:
4236 slots = tdm_tx_cfg[TDM_SEC][TDM_0].channels;
4237 break;
4238 case AFE_PORT_ID_TERTIARY_TDM_TX:
4239 slots = tdm_tx_cfg[TDM_TERT][TDM_0].channels;
4240 break;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004241 case AFE_PORT_ID_QUATERNARY_TDM_TX:
4242 slots = tdm_tx_cfg[TDM_QUAT][TDM_0].channels;
4243 break;
4244 case AFE_PORT_ID_QUINARY_TDM_TX:
4245 slots = tdm_tx_cfg[TDM_QUIN][TDM_0].channels;
4246 break;
4247 case AFE_PORT_ID_SENARY_TDM_TX:
4248 slots = tdm_tx_cfg[TDM_SEN][TDM_0].channels;
4249 break;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004250
4251 default:
4252 pr_err("%s: dai id 0x%x not supported\n",
4253 __func__, cpu_dai->id);
4254 return -EINVAL;
4255 }
4256
4257 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4258 /*2 slot config - bits 0 and 1 set for the first two slots */
4259 slot_mask = 0x0000FFFF >> (16 - slots);
4260 channels = slots;
4261
4262 pr_debug("%s: tdm rx slot_width %d slots %d\n",
4263 __func__, slot_width, slots);
4264
4265 ret = snd_soc_dai_set_tdm_slot(cpu_dai, 0, slot_mask,
4266 slots, slot_width);
4267 if (ret < 0) {
4268 pr_err("%s: failed to set tdm rx slot, err:%d\n",
4269 __func__, ret);
4270 goto end;
4271 }
4272
4273 ret = snd_soc_dai_set_channel_map(cpu_dai,
4274 0, NULL, channels, slot_offset);
4275 if (ret < 0) {
4276 pr_err("%s: failed to set tdm rx channel map, err:%d\n",
4277 __func__, ret);
4278 goto end;
4279 }
4280 } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
4281 /*2 slot config - bits 0 and 1 set for the first two slots */
4282 slot_mask = 0x0000FFFF >> (16 - slots);
4283 channels = slots;
4284
4285 pr_debug("%s: tdm tx slot_width %d slots %d\n",
4286 __func__, slot_width, slots);
4287
4288 ret = snd_soc_dai_set_tdm_slot(cpu_dai, slot_mask, 0,
4289 slots, slot_width);
4290 if (ret < 0) {
4291 pr_err("%s: failed to set tdm tx slot, err:%d\n",
4292 __func__, ret);
4293 goto end;
4294 }
4295
4296 ret = snd_soc_dai_set_channel_map(cpu_dai,
4297 channels, slot_offset, 0, NULL);
4298 if (ret < 0) {
4299 pr_err("%s: failed to set tdm tx channel map, err:%d\n",
4300 __func__, ret);
4301 goto end;
4302 }
4303 } else {
4304 ret = -EINVAL;
4305 pr_err("%s: invalid use case, err:%d\n",
4306 __func__, ret);
4307 goto end;
4308 }
4309
4310 rate = params_rate(params);
4311 clk_freq = rate * slot_width * slots;
4312 ret = snd_soc_dai_set_sysclk(cpu_dai, 0, clk_freq, SND_SOC_CLOCK_OUT);
4313 if (ret < 0)
4314 pr_err("%s: failed to set tdm clk, err:%d\n",
4315 __func__, ret);
4316
4317end:
4318 return ret;
4319}
4320
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004321static int msm_get_tdm_mode(u32 port_id)
4322{
4323 int tdm_mode;
4324
4325 switch (port_id) {
4326 case AFE_PORT_ID_PRIMARY_TDM_RX:
4327 case AFE_PORT_ID_PRIMARY_TDM_TX:
4328 tdm_mode = TDM_PRI;
4329 break;
4330 case AFE_PORT_ID_SECONDARY_TDM_RX:
4331 case AFE_PORT_ID_SECONDARY_TDM_TX:
4332 tdm_mode = TDM_SEC;
4333 break;
4334 case AFE_PORT_ID_TERTIARY_TDM_RX:
4335 case AFE_PORT_ID_TERTIARY_TDM_TX:
4336 tdm_mode = TDM_TERT;
4337 break;
4338 case AFE_PORT_ID_QUATERNARY_TDM_RX:
4339 case AFE_PORT_ID_QUATERNARY_TDM_TX:
4340 tdm_mode = TDM_QUAT;
4341 break;
4342 case AFE_PORT_ID_QUINARY_TDM_RX:
4343 case AFE_PORT_ID_QUINARY_TDM_TX:
4344 tdm_mode = TDM_QUIN;
4345 break;
4346 case AFE_PORT_ID_SENARY_TDM_RX:
4347 case AFE_PORT_ID_SENARY_TDM_TX:
4348 tdm_mode = TDM_SEN;
4349 break;
4350 default:
4351 pr_err("%s: Invalid port id: %d\n", __func__, port_id);
4352 tdm_mode = -EINVAL;
4353 }
4354 return tdm_mode;
4355}
4356
4357static int kona_tdm_snd_startup(struct snd_pcm_substream *substream)
4358{
4359 int ret = 0;
4360 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4361 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4362 struct snd_soc_card *card = rtd->card;
4363 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4364 int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
4365
4366 if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) {
4367 ret = -EINVAL;
4368 pr_err("%s: Invalid TDM interface %d\n",
4369 __func__, ret);
4370 return ret;
4371 }
4372
4373 if (pdata->mi2s_gpio_p[tdm_mode]) {
4374 if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode]))
4375 == 0) {
4376 ret = msm_cdc_pinctrl_select_active_state(
4377 pdata->mi2s_gpio_p[tdm_mode]);
4378 if (ret) {
4379 pr_err("%s: TDM GPIO pinctrl set active failed with %d\n",
4380 __func__, ret);
4381 goto done;
4382 }
4383 }
4384 atomic_inc(&(pdata->mi2s_gpio_ref_count[tdm_mode]));
4385 }
4386
4387done:
4388 return ret;
4389}
4390
4391static void kona_tdm_snd_shutdown(struct snd_pcm_substream *substream)
4392{
4393 int ret = 0;
4394 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4395 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4396 struct snd_soc_card *card = rtd->card;
4397 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4398 int tdm_mode = msm_get_tdm_mode(cpu_dai->id);
4399
4400 if (tdm_mode >= TDM_INTERFACE_MAX || tdm_mode < 0) {
4401 ret = -EINVAL;
4402 pr_err("%s: Invalid TDM interface %d\n",
4403 __func__, ret);
4404 return;
4405 }
4406
4407 if (pdata->mi2s_gpio_p[tdm_mode]) {
4408 atomic_dec(&(pdata->mi2s_gpio_ref_count[tdm_mode]));
4409 if (atomic_read(&(pdata->mi2s_gpio_ref_count[tdm_mode]))
4410 == 0) {
4411 ret = msm_cdc_pinctrl_select_sleep_state(
4412 pdata->mi2s_gpio_p[tdm_mode]);
4413 if (ret)
4414 pr_err("%s: TDM GPIO pinctrl set sleep failed with %d\n",
4415 __func__, ret);
4416 }
4417 }
4418}
4419
4420static int kona_aux_snd_startup(struct snd_pcm_substream *substream)
4421{
4422 int ret = 0;
4423 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4424 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4425 struct snd_soc_card *card = rtd->card;
4426 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4427 u32 aux_mode = cpu_dai->id - 1;
4428
4429 if (aux_mode >= AUX_PCM_MAX) {
4430 ret = -EINVAL;
4431 pr_err("%s: Invalid AUX interface %d\n",
4432 __func__, ret);
4433 return ret;
4434 }
4435
4436 if (pdata->mi2s_gpio_p[aux_mode]) {
4437 if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode]))
4438 == 0) {
4439 ret = msm_cdc_pinctrl_select_active_state(
4440 pdata->mi2s_gpio_p[aux_mode]);
4441 if (ret) {
4442 pr_err("%s: AUX GPIO pinctrl set active failed with %d\n",
4443 __func__, ret);
4444 goto done;
4445 }
4446 }
4447 atomic_inc(&(pdata->mi2s_gpio_ref_count[aux_mode]));
4448 }
4449
4450done:
4451 return ret;
4452}
4453
4454static void kona_aux_snd_shutdown(struct snd_pcm_substream *substream)
4455{
4456 int ret = 0;
4457 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4458 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4459 struct snd_soc_card *card = rtd->card;
4460 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
4461 u32 aux_mode = cpu_dai->id - 1;
4462
4463 if (aux_mode >= AUX_PCM_MAX) {
4464 pr_err("%s: Invalid AUX interface %d\n",
4465 __func__, ret);
4466 return;
4467 }
4468
4469 if (pdata->mi2s_gpio_p[aux_mode]) {
4470 atomic_dec(&(pdata->mi2s_gpio_ref_count[aux_mode]));
4471 if (atomic_read(&(pdata->mi2s_gpio_ref_count[aux_mode]))
4472 == 0) {
4473 ret = msm_cdc_pinctrl_select_sleep_state(
4474 pdata->mi2s_gpio_p[aux_mode]);
4475 if (ret)
4476 pr_err("%s: AUX GPIO pinctrl set sleep failed with %d\n",
4477 __func__, ret);
4478 }
4479 }
4480}
4481
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07004482static int msm_snd_cdc_dma_startup(struct snd_pcm_substream *substream)
4483{
4484 int ret = 0;
4485 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4486 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4487
4488 switch (dai_link->id) {
4489 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
4490 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
4491 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
4492 ret = kona_send_island_va_config(dai_link->id);
4493 if (ret)
4494 pr_err("%s: send island va cfg failed, err: %d\n",
4495 __func__, ret);
4496 break;
4497 }
4498
4499 return ret;
4500}
4501
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004502static int msm_snd_cdc_dma_hw_params(struct snd_pcm_substream *substream,
4503 struct snd_pcm_hw_params *params)
4504{
4505 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4506 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4507 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4508 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4509
4510 int ret = 0;
4511 u32 rx_ch_cdc_dma, tx_ch_cdc_dma;
4512 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
4513 u32 user_set_tx_ch = 0;
4514 u32 user_set_rx_ch = 0;
4515 u32 ch_id;
4516
4517 ret = snd_soc_dai_get_channel_map(codec_dai,
4518 &tx_ch_cnt, &tx_ch_cdc_dma, &rx_ch_cnt,
4519 &rx_ch_cdc_dma);
4520 if (ret < 0) {
4521 pr_err("%s: failed to get codec chan map, err:%d\n",
4522 __func__, ret);
4523 goto err;
4524 }
4525
4526 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
4527 switch (dai_link->id) {
4528 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0:
4529 case MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1:
4530 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_0:
4531 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_1:
4532 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_2:
4533 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_3:
4534 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_4:
4535 case MSM_BACKEND_DAI_RX_CDC_DMA_RX_5:
4536 {
4537 ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4538 pr_debug("%s: id %d rx_ch=%d\n", __func__,
4539 ch_id, cdc_dma_rx_cfg[ch_id].channels);
4540 user_set_rx_ch = cdc_dma_rx_cfg[ch_id].channels;
4541 ret = snd_soc_dai_set_channel_map(cpu_dai, 0, 0,
4542 user_set_rx_ch, &rx_ch_cdc_dma);
4543 if (ret < 0) {
4544 pr_err("%s: failed to set cpu chan map, err:%d\n",
4545 __func__, ret);
4546 goto err;
4547 }
4548
4549 }
4550 break;
4551 }
4552 } else {
4553 switch (dai_link->id) {
4554 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0:
4555 {
4556 user_set_tx_ch = msm_vi_feed_tx_ch;
4557 }
4558 break;
4559 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1:
4560 case MSM_BACKEND_DAI_WSA_CDC_DMA_TX_2:
4561 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_0:
4562 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_3:
4563 case MSM_BACKEND_DAI_TX_CDC_DMA_TX_4:
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08004564 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_0:
4565 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_1:
4566 case MSM_BACKEND_DAI_VA_CDC_DMA_TX_2:
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004567 {
4568 ch_id = msm_cdc_dma_get_idx_from_beid(dai_link->id);
4569 pr_debug("%s: id %d tx_ch=%d\n", __func__,
4570 ch_id, cdc_dma_tx_cfg[ch_id].channels);
4571 user_set_tx_ch = cdc_dma_tx_cfg[ch_id].channels;
4572 }
4573 break;
4574 }
4575
4576 ret = snd_soc_dai_set_channel_map(cpu_dai, user_set_tx_ch,
4577 &tx_ch_cdc_dma, 0, 0);
4578 if (ret < 0) {
4579 pr_err("%s: failed to set cpu chan map, err:%d\n",
4580 __func__, ret);
4581 goto err;
4582 }
4583 }
4584
4585err:
4586 return ret;
4587}
4588
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004589static int msm_fe_qos_prepare(struct snd_pcm_substream *substream)
4590{
4591 cpumask_t mask;
4592
4593 if (pm_qos_request_active(&substream->latency_pm_qos_req))
4594 pm_qos_remove_request(&substream->latency_pm_qos_req);
4595
4596 cpumask_clear(&mask);
4597 cpumask_set_cpu(1, &mask); /* affine to core 1 */
4598 cpumask_set_cpu(2, &mask); /* affine to core 2 */
4599 cpumask_copy(&substream->latency_pm_qos_req.cpus_affine, &mask);
4600
4601 substream->latency_pm_qos_req.type = PM_QOS_REQ_AFFINE_CORES;
4602
4603 pm_qos_add_request(&substream->latency_pm_qos_req,
4604 PM_QOS_CPU_DMA_LATENCY,
4605 MSM_LL_QOS_VALUE);
4606 return 0;
4607}
4608
4609static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
4610{
4611 int ret = 0;
4612 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4613 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4614 int index = cpu_dai->id;
4615 unsigned int fmt = SND_SOC_DAIFMT_CBS_CFS;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004616 struct snd_soc_card *card = rtd->card;
4617 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004618
4619 dev_dbg(rtd->card->dev,
4620 "%s: substream = %s stream = %d, dai name %s, dai ID %d\n",
4621 __func__, substream->name, substream->stream,
4622 cpu_dai->name, cpu_dai->id);
4623
4624 if (index < PRIM_MI2S || index >= MI2S_MAX) {
4625 ret = -EINVAL;
4626 dev_err(rtd->card->dev,
4627 "%s: CPU DAI id (%d) out of range\n",
4628 __func__, cpu_dai->id);
4629 goto err;
4630 }
4631 /*
4632 * Mutex protection in case the same MI2S
4633 * interface using for both TX and RX so
4634 * that the same clock won't be enable twice.
4635 */
4636 mutex_lock(&mi2s_intf_conf[index].lock);
4637 if (++mi2s_intf_conf[index].ref_cnt == 1) {
4638 /* Check if msm needs to provide the clock to the interface */
4639 if (!mi2s_intf_conf[index].msm_is_mi2s_master) {
4640 mi2s_clk[index].clk_id = mi2s_ebit_clk[index];
4641 fmt = SND_SOC_DAIFMT_CBM_CFM;
4642 }
4643 ret = msm_mi2s_set_sclk(substream, true);
4644 if (ret < 0) {
4645 dev_err(rtd->card->dev,
4646 "%s: afe lpass clock failed to enable MI2S clock, err:%d\n",
4647 __func__, ret);
4648 goto clean_up;
4649 }
4650
4651 ret = snd_soc_dai_set_fmt(cpu_dai, fmt);
4652 if (ret < 0) {
4653 pr_err("%s: set fmt cpu dai failed for MI2S (%d), err:%d\n",
4654 __func__, index, ret);
4655 goto clk_off;
4656 }
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004657 if (pdata->mi2s_gpio_p[index]) {
4658 if (atomic_read(&(pdata->mi2s_gpio_ref_count[index]))
4659 == 0) {
4660 ret = msm_cdc_pinctrl_select_active_state(
4661 pdata->mi2s_gpio_p[index]);
4662 if (ret) {
4663 pr_err("%s: MI2S GPIO pinctrl set active failed with %d\n",
4664 __func__, ret);
4665 goto clk_off;
4666 }
4667 }
4668 atomic_inc(&(pdata->mi2s_gpio_ref_count[index]));
4669 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004670 }
4671clk_off:
4672 if (ret < 0)
4673 msm_mi2s_set_sclk(substream, false);
4674clean_up:
4675 if (ret < 0)
4676 mi2s_intf_conf[index].ref_cnt--;
4677 mutex_unlock(&mi2s_intf_conf[index].lock);
4678err:
4679 return ret;
4680}
4681
4682static void msm_mi2s_snd_shutdown(struct snd_pcm_substream *substream)
4683{
4684 int ret = 0;
4685 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4686 int index = rtd->cpu_dai->id;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004687 struct snd_soc_card *card = rtd->card;
4688 struct msm_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004689
4690 pr_debug("%s(): substream = %s stream = %d\n", __func__,
4691 substream->name, substream->stream);
4692 if (index < PRIM_MI2S || index >= MI2S_MAX) {
4693 pr_err("%s:invalid MI2S DAI(%d)\n", __func__, index);
4694 return;
4695 }
4696
4697 mutex_lock(&mi2s_intf_conf[index].lock);
4698 if (--mi2s_intf_conf[index].ref_cnt == 0) {
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004699 if (pdata->mi2s_gpio_p[index]) {
4700 atomic_dec(&(pdata->mi2s_gpio_ref_count[index]));
4701 if (atomic_read(&(pdata->mi2s_gpio_ref_count[index]))
4702 == 0) {
4703 ret = msm_cdc_pinctrl_select_sleep_state(
4704 pdata->mi2s_gpio_p[index]);
4705 if (ret)
4706 pr_err("%s: MI2S GPIO pinctrl set sleep failed with %d\n",
4707 __func__, ret);
4708 }
4709 }
4710
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004711 ret = msm_mi2s_set_sclk(substream, false);
4712 if (ret < 0)
4713 pr_err("%s:clock disable failed for MI2S (%d); ret=%d\n",
4714 __func__, index, ret);
4715 }
4716 mutex_unlock(&mi2s_intf_conf[index].lock);
4717}
4718
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05304719static int msm_wcn_hw_params_lito(struct snd_pcm_substream *substream,
4720 struct snd_pcm_hw_params *params)
4721{
4722 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4723 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4724 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4725 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4726 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO];
4727 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
4728 int ret = 0;
4729
4730 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
4731 codec_dai->name, codec_dai->id);
4732 ret = snd_soc_dai_get_channel_map(codec_dai,
4733 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
4734 if (ret) {
4735 dev_err(rtd->dev,
4736 "%s: failed to get BTFM codec chan map\n, err:%d\n",
4737 __func__, ret);
4738 goto err;
4739 }
4740
4741 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n",
4742 __func__, tx_ch_cnt, dai_link->id);
4743
4744 ret = snd_soc_dai_set_channel_map(cpu_dai,
4745 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
4746 if (ret)
4747 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
4748 __func__, ret);
4749
4750err:
4751 return ret;
4752}
4753
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004754static int msm_wcn_hw_params(struct snd_pcm_substream *substream,
4755 struct snd_pcm_hw_params *params)
4756{
4757 struct snd_soc_pcm_runtime *rtd = substream->private_data;
4758 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4759 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
4760 struct snd_soc_dai_link *dai_link = rtd->dai_link;
4761 u32 rx_ch[WCN_CDC_SLIM_RX_CH_MAX], tx_ch[WCN_CDC_SLIM_TX_CH_MAX];
4762 u32 rx_ch_cnt = 0, tx_ch_cnt = 0;
4763 int ret = 0;
4764
4765 dev_dbg(rtd->dev, "%s: %s_tx_dai_id_%d\n", __func__,
4766 codec_dai->name, codec_dai->id);
4767 ret = snd_soc_dai_get_channel_map(codec_dai,
4768 &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
4769 if (ret) {
4770 dev_err(rtd->dev,
4771 "%s: failed to get BTFM codec chan map\n, err:%d\n",
4772 __func__, ret);
4773 goto err;
4774 }
4775
4776 dev_dbg(rtd->dev, "%s: tx_ch_cnt(%d) BE id %d\n",
4777 __func__, tx_ch_cnt, dai_link->id);
4778
4779 ret = snd_soc_dai_set_channel_map(cpu_dai,
4780 tx_ch_cnt, tx_ch, rx_ch_cnt, rx_ch);
4781 if (ret)
4782 dev_err(rtd->dev, "%s: failed to set cpu chan map, err:%d\n",
4783 __func__, ret);
4784
4785err:
4786 return ret;
4787}
4788
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004789static struct snd_soc_ops kona_aux_be_ops = {
4790 .startup = kona_aux_snd_startup,
4791 .shutdown = kona_aux_snd_shutdown
4792};
4793
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004794static struct snd_soc_ops kona_tdm_be_ops = {
4795 .hw_params = kona_tdm_snd_hw_params,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08004796 .startup = kona_tdm_snd_startup,
4797 .shutdown = kona_tdm_snd_shutdown
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07004798};
4799
4800static struct snd_soc_ops msm_mi2s_be_ops = {
4801 .startup = msm_mi2s_snd_startup,
4802 .shutdown = msm_mi2s_snd_shutdown,
4803};
4804
4805static struct snd_soc_ops msm_fe_qos_ops = {
4806 .prepare = msm_fe_qos_prepare,
4807};
4808
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004809static struct snd_soc_ops msm_cdc_dma_be_ops = {
Xiaoyu Yeffbdc9f2019-05-17 15:02:39 -07004810 .startup = msm_snd_cdc_dma_startup,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004811 .hw_params = msm_snd_cdc_dma_hw_params,
4812};
4813
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004814static struct snd_soc_ops msm_wcn_ops = {
4815 .hw_params = msm_wcn_hw_params,
4816};
4817
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05304818static struct snd_soc_ops msm_wcn_ops_lito = {
4819 .hw_params = msm_wcn_hw_params_lito,
4820};
4821
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004822static int msm_dmic_event(struct snd_soc_dapm_widget *w,
4823 struct snd_kcontrol *kcontrol, int event)
4824{
4825 struct msm_asoc_mach_data *pdata = NULL;
4826 struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
4827 int ret = 0;
4828 u32 dmic_idx;
4829 int *dmic_gpio_cnt;
4830 struct device_node *dmic_gpio;
4831 char *wname;
4832
4833 wname = strpbrk(w->name, "012345");
4834 if (!wname) {
4835 dev_err(component->dev, "%s: widget not found\n", __func__);
4836 return -EINVAL;
4837 }
4838
4839 ret = kstrtouint(wname, 10, &dmic_idx);
4840 if (ret < 0) {
4841 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
4842 __func__);
4843 return -EINVAL;
4844 }
4845
4846 pdata = snd_soc_card_get_drvdata(component->card);
4847
4848 switch (dmic_idx) {
4849 case 0:
4850 case 1:
4851 dmic_gpio_cnt = &dmic_0_1_gpio_cnt;
4852 dmic_gpio = pdata->dmic01_gpio_p;
4853 break;
4854 case 2:
4855 case 3:
4856 dmic_gpio_cnt = &dmic_2_3_gpio_cnt;
4857 dmic_gpio = pdata->dmic23_gpio_p;
4858 break;
4859 case 4:
4860 case 5:
4861 dmic_gpio_cnt = &dmic_4_5_gpio_cnt;
4862 dmic_gpio = pdata->dmic45_gpio_p;
4863 break;
4864 default:
4865 dev_err(component->dev, "%s: Invalid DMIC Selection\n",
4866 __func__);
4867 return -EINVAL;
4868 }
4869
4870 dev_dbg(component->dev, "%s: event %d DMIC%d dmic_gpio_cnt %d\n",
4871 __func__, event, dmic_idx, *dmic_gpio_cnt);
4872
4873 switch (event) {
4874 case SND_SOC_DAPM_PRE_PMU:
4875 (*dmic_gpio_cnt)++;
4876 if (*dmic_gpio_cnt == 1) {
4877 ret = msm_cdc_pinctrl_select_active_state(
4878 dmic_gpio);
4879 if (ret < 0) {
4880 pr_err("%s: gpio set cannot be activated %sd",
4881 __func__, "dmic_gpio");
4882 return ret;
4883 }
4884 }
4885
4886 break;
4887 case SND_SOC_DAPM_POST_PMD:
4888 (*dmic_gpio_cnt)--;
4889 if (*dmic_gpio_cnt == 0) {
4890 ret = msm_cdc_pinctrl_select_sleep_state(
4891 dmic_gpio);
4892 if (ret < 0) {
4893 pr_err("%s: gpio set cannot be de-activated %sd",
4894 __func__, "dmic_gpio");
4895 return ret;
4896 }
4897 }
4898 break;
4899 default:
4900 pr_err("%s: invalid DAPM event %d\n", __func__, event);
4901 return -EINVAL;
4902 }
4903 return 0;
4904}
4905
4906static const struct snd_soc_dapm_widget msm_int_dapm_widgets[] = {
4907 SND_SOC_DAPM_MIC("Analog Mic1", NULL),
4908 SND_SOC_DAPM_MIC("Analog Mic2", NULL),
4909 SND_SOC_DAPM_MIC("Analog Mic3", NULL),
4910 SND_SOC_DAPM_MIC("Analog Mic4", NULL),
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08004911 SND_SOC_DAPM_MIC("Analog Mic5", NULL),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004912 SND_SOC_DAPM_MIC("Digital Mic0", msm_dmic_event),
4913 SND_SOC_DAPM_MIC("Digital Mic1", msm_dmic_event),
4914 SND_SOC_DAPM_MIC("Digital Mic2", msm_dmic_event),
4915 SND_SOC_DAPM_MIC("Digital Mic3", msm_dmic_event),
4916 SND_SOC_DAPM_MIC("Digital Mic4", msm_dmic_event),
4917 SND_SOC_DAPM_MIC("Digital Mic5", msm_dmic_event),
Laxminath Kasamdb79e5f2019-07-18 13:47:57 +05304918 SND_SOC_DAPM_MIC("Digital Mic6", NULL),
4919 SND_SOC_DAPM_MIC("Digital Mic7", NULL),
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004920};
4921
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08004922static int msm_wcn_init(struct snd_soc_pcm_runtime *rtd)
4923{
4924 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
4925 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX] = {159, 160};
4926 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4927
4928 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
4929 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
4930}
4931
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05304932static int msm_wcn_init_lito(struct snd_soc_pcm_runtime *rtd)
4933{
4934 unsigned int rx_ch[WCN_CDC_SLIM_RX_CH_MAX] = {157, 158};
4935 unsigned int tx_ch[WCN_CDC_SLIM_TX_CH_MAX_LITO] = {159, 160, 161};
4936 struct snd_soc_dai *codec_dai = rtd->codec_dai;
4937
4938 return snd_soc_dai_set_channel_map(codec_dai, ARRAY_SIZE(tx_ch),
4939 tx_ch, ARRAY_SIZE(rx_ch), rx_ch);
4940}
4941
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004942static int msm_int_audrx_init(struct snd_soc_pcm_runtime *rtd)
4943{
4944 int ret = -EINVAL;
4945 struct snd_soc_component *component;
4946 struct snd_soc_dapm_context *dapm;
4947 struct snd_card *card;
4948 struct snd_info_entry *entry;
4949 struct snd_soc_component *aux_comp;
4950 struct msm_asoc_mach_data *pdata =
4951 snd_soc_card_get_drvdata(rtd->card);
4952
4953 component = snd_soc_rtdcom_lookup(rtd, "bolero_codec");
4954 if (!component) {
4955 pr_err("%s: could not find component for bolero_codec\n",
4956 __func__);
4957 return ret;
4958 }
4959
4960 dapm = snd_soc_component_get_dapm(component);
4961
4962 ret = snd_soc_add_component_controls(component, msm_int_snd_controls,
4963 ARRAY_SIZE(msm_int_snd_controls));
4964 if (ret < 0) {
4965 pr_err("%s: add_component_controls failed: %d\n",
4966 __func__, ret);
4967 return ret;
4968 }
4969 ret = snd_soc_add_component_controls(component, msm_common_snd_controls,
4970 ARRAY_SIZE(msm_common_snd_controls));
4971 if (ret < 0) {
4972 pr_err("%s: add common snd controls failed: %d\n",
4973 __func__, ret);
4974 return ret;
4975 }
4976
4977 snd_soc_dapm_new_controls(dapm, msm_int_dapm_widgets,
4978 ARRAY_SIZE(msm_int_dapm_widgets));
4979
4980 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic0");
4981 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic1");
4982 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic2");
4983 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic3");
Sudheer Papothi3fc2d772019-05-11 14:11:29 +05304984 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic4");
4985 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic5");
Laxminath Kasamdb79e5f2019-07-18 13:47:57 +05304986 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic6");
4987 snd_soc_dapm_ignore_suspend(dapm, "Digital Mic7");
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004988
4989 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic1");
4990 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic2");
4991 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic3");
4992 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic4");
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08004993 snd_soc_dapm_ignore_suspend(dapm, "Analog Mic5");
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07004994
4995 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK1 OUT");
4996 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPK2 OUT");
4997 snd_soc_dapm_ignore_suspend(dapm, "WSA AIF VI");
4998 snd_soc_dapm_ignore_suspend(dapm, "VIINPUT_WSA");
4999
5000 snd_soc_dapm_sync(dapm);
5001
5002 /*
5003 * Send speaker configuration only for WSA8810.
5004 * Default configuration is for WSA8815.
5005 */
5006 dev_dbg(component->dev, "%s: Number of aux devices: %d\n",
5007 __func__, rtd->card->num_aux_devs);
5008 if (rtd->card->num_aux_devs &&
5009 !list_empty(&rtd->card->component_dev_list)) {
Meng Wangbb5e0e92019-06-05 15:24:39 +08005010 list_for_each_entry(aux_comp,
5011 &rtd->card->aux_comp_list,
5012 card_aux_list) {
5013 if (aux_comp->name != NULL && (
5014 !strcmp(aux_comp->name, WSA8810_NAME_1) ||
5015 !strcmp(aux_comp->name, WSA8810_NAME_2))) {
5016 wsa_macro_set_spkr_mode(component,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005017 WSA_MACRO_SPKR_MODE_1);
Meng Wangbb5e0e92019-06-05 15:24:39 +08005018 wsa_macro_set_spkr_gain_offset(component,
5019 WSA_MACRO_GAIN_OFFSET_M1P5_DB);
5020 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005021 }
Karthikeyan Mani7eef68e2018-12-13 17:45:02 -08005022 bolero_set_port_map(component, ARRAY_SIZE(sm_port_map),
5023 sm_port_map);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005024 }
5025 card = rtd->card->snd_card;
5026 if (!pdata->codec_root) {
5027 entry = snd_info_create_subdir(card->module, "codecs",
5028 card->proc_root);
5029 if (!entry) {
5030 pr_debug("%s: Cannot create codecs module entry\n",
5031 __func__);
5032 ret = 0;
5033 goto err;
5034 }
5035 pdata->codec_root = entry;
5036 }
5037 bolero_info_create_codec_entry(pdata->codec_root, component);
Karthikeyan Mani664bd4a2019-02-21 13:30:34 -08005038 bolero_register_wake_irq(component, false);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005039 codec_reg_done = true;
5040 return 0;
5041err:
5042 return ret;
5043}
5044
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08005045static void *def_wcd_mbhc_cal(void)
5046{
5047 void *wcd_mbhc_cal;
5048 struct wcd_mbhc_btn_detect_cfg *btn_cfg;
5049 u16 *btn_high;
5050
5051 wcd_mbhc_cal = kzalloc(WCD_MBHC_CAL_SIZE(WCD_MBHC_DEF_BUTTONS,
5052 WCD9XXX_MBHC_DEF_RLOADS), GFP_KERNEL);
5053 if (!wcd_mbhc_cal)
5054 return NULL;
5055
5056 WCD_MBHC_CAL_PLUG_TYPE_PTR(wcd_mbhc_cal)->v_hs_max = WCD_MBHC_HS_V_MAX;
5057 WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal)->num_btn = WCD_MBHC_DEF_BUTTONS;
5058 btn_cfg = WCD_MBHC_CAL_BTN_DET_PTR(wcd_mbhc_cal);
5059 btn_high = ((void *)&btn_cfg->_v_btn_low) +
5060 (sizeof(btn_cfg->_v_btn_low[0]) * btn_cfg->num_btn);
5061
5062 btn_high[0] = 75;
5063 btn_high[1] = 150;
5064 btn_high[2] = 237;
5065 btn_high[3] = 500;
5066 btn_high[4] = 500;
5067 btn_high[5] = 500;
5068 btn_high[6] = 500;
5069 btn_high[7] = 500;
5070
5071 return wcd_mbhc_cal;
5072}
5073
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005074/* Digital audio interface glue - connects codec <---> CPU */
5075static struct snd_soc_dai_link msm_common_dai_links[] = {
5076 /* FrontEnd DAI Links */
5077 {/* hw:x,0 */
5078 .name = MSM_DAILINK_NAME(Media1),
5079 .stream_name = "MultiMedia1",
5080 .cpu_dai_name = "MultiMedia1",
5081 .platform_name = "msm-pcm-dsp.0",
5082 .dynamic = 1,
5083 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
5084 .dpcm_playback = 1,
5085 .dpcm_capture = 1,
5086 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5087 SND_SOC_DPCM_TRIGGER_POST},
5088 .codec_dai_name = "snd-soc-dummy-dai",
5089 .codec_name = "snd-soc-dummy",
5090 .ignore_suspend = 1,
5091 /* this dainlink has playback support */
5092 .ignore_pmdown_time = 1,
5093 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
5094 },
5095 {/* hw:x,1 */
5096 .name = MSM_DAILINK_NAME(Media2),
5097 .stream_name = "MultiMedia2",
5098 .cpu_dai_name = "MultiMedia2",
5099 .platform_name = "msm-pcm-dsp.0",
5100 .dynamic = 1,
5101 .dpcm_playback = 1,
5102 .dpcm_capture = 1,
5103 .codec_dai_name = "snd-soc-dummy-dai",
5104 .codec_name = "snd-soc-dummy",
5105 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5106 SND_SOC_DPCM_TRIGGER_POST},
5107 .ignore_suspend = 1,
5108 /* this dainlink has playback support */
5109 .ignore_pmdown_time = 1,
5110 .id = MSM_FRONTEND_DAI_MULTIMEDIA2,
5111 },
5112 {/* hw:x,2 */
5113 .name = "VoiceMMode1",
5114 .stream_name = "VoiceMMode1",
5115 .cpu_dai_name = "VoiceMMode1",
5116 .platform_name = "msm-pcm-voice",
5117 .dynamic = 1,
5118 .dpcm_playback = 1,
5119 .dpcm_capture = 1,
5120 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5121 SND_SOC_DPCM_TRIGGER_POST},
5122 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5123 .ignore_suspend = 1,
5124 .ignore_pmdown_time = 1,
5125 .codec_dai_name = "snd-soc-dummy-dai",
5126 .codec_name = "snd-soc-dummy",
5127 .id = MSM_FRONTEND_DAI_VOICEMMODE1,
5128 },
5129 {/* hw:x,3 */
5130 .name = "MSM VoIP",
5131 .stream_name = "VoIP",
5132 .cpu_dai_name = "VoIP",
5133 .platform_name = "msm-voip-dsp",
5134 .dynamic = 1,
5135 .dpcm_playback = 1,
5136 .dpcm_capture = 1,
5137 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5138 SND_SOC_DPCM_TRIGGER_POST},
5139 .codec_dai_name = "snd-soc-dummy-dai",
5140 .codec_name = "snd-soc-dummy",
5141 .ignore_suspend = 1,
5142 /* this dainlink has playback support */
5143 .ignore_pmdown_time = 1,
5144 .id = MSM_FRONTEND_DAI_VOIP,
5145 },
5146 {/* hw:x,4 */
5147 .name = MSM_DAILINK_NAME(ULL),
5148 .stream_name = "MultiMedia3",
5149 .cpu_dai_name = "MultiMedia3",
5150 .platform_name = "msm-pcm-dsp.2",
5151 .dynamic = 1,
5152 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
5153 .dpcm_playback = 1,
5154 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5155 SND_SOC_DPCM_TRIGGER_POST},
5156 .codec_dai_name = "snd-soc-dummy-dai",
5157 .codec_name = "snd-soc-dummy",
5158 .ignore_suspend = 1,
5159 /* this dainlink has playback support */
5160 .ignore_pmdown_time = 1,
5161 .id = MSM_FRONTEND_DAI_MULTIMEDIA3,
5162 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005163 {/* hw:x,5 */
5164 .name = "MSM AFE-PCM RX",
5165 .stream_name = "AFE-PROXY RX",
5166 .cpu_dai_name = "msm-dai-q6-dev.241",
5167 .codec_name = "msm-stub-codec.1",
5168 .codec_dai_name = "msm-stub-rx",
5169 .platform_name = "msm-pcm-afe",
5170 .dpcm_playback = 1,
5171 .ignore_suspend = 1,
5172 /* this dainlink has playback support */
5173 .ignore_pmdown_time = 1,
5174 },
5175 {/* hw:x,6 */
5176 .name = "MSM AFE-PCM TX",
5177 .stream_name = "AFE-PROXY TX",
5178 .cpu_dai_name = "msm-dai-q6-dev.240",
5179 .codec_name = "msm-stub-codec.1",
5180 .codec_dai_name = "msm-stub-tx",
5181 .platform_name = "msm-pcm-afe",
5182 .dpcm_capture = 1,
5183 .ignore_suspend = 1,
5184 },
5185 {/* hw:x,7 */
5186 .name = MSM_DAILINK_NAME(Compress1),
5187 .stream_name = "Compress1",
5188 .cpu_dai_name = "MultiMedia4",
5189 .platform_name = "msm-compress-dsp",
5190 .dynamic = 1,
5191 .async_ops = ASYNC_DPCM_SND_SOC_HW_PARAMS,
5192 .dpcm_playback = 1,
5193 .dpcm_capture = 1,
5194 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5195 SND_SOC_DPCM_TRIGGER_POST},
5196 .codec_dai_name = "snd-soc-dummy-dai",
5197 .codec_name = "snd-soc-dummy",
5198 .ignore_suspend = 1,
5199 .ignore_pmdown_time = 1,
5200 /* this dainlink has playback support */
5201 .id = MSM_FRONTEND_DAI_MULTIMEDIA4,
5202 },
Meng Wang197cb302019-03-01 13:54:38 +08005203 /* Hostless PCM purpose */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005204 {/* hw:x,8 */
5205 .name = "AUXPCM Hostless",
5206 .stream_name = "AUXPCM Hostless",
5207 .cpu_dai_name = "AUXPCM_HOSTLESS",
5208 .platform_name = "msm-pcm-hostless",
5209 .dynamic = 1,
5210 .dpcm_playback = 1,
5211 .dpcm_capture = 1,
5212 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5213 SND_SOC_DPCM_TRIGGER_POST},
5214 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5215 .ignore_suspend = 1,
5216 /* this dainlink has playback support */
5217 .ignore_pmdown_time = 1,
5218 .codec_dai_name = "snd-soc-dummy-dai",
5219 .codec_name = "snd-soc-dummy",
5220 },
5221 {/* hw:x,9 */
5222 .name = MSM_DAILINK_NAME(LowLatency),
5223 .stream_name = "MultiMedia5",
5224 .cpu_dai_name = "MultiMedia5",
5225 .platform_name = "msm-pcm-dsp.1",
5226 .dynamic = 1,
5227 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
5228 .dpcm_playback = 1,
5229 .dpcm_capture = 1,
5230 .codec_dai_name = "snd-soc-dummy-dai",
5231 .codec_name = "snd-soc-dummy",
5232 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5233 SND_SOC_DPCM_TRIGGER_POST},
5234 .ignore_suspend = 1,
5235 /* this dainlink has playback support */
5236 .ignore_pmdown_time = 1,
5237 .id = MSM_FRONTEND_DAI_MULTIMEDIA5,
5238 .ops = &msm_fe_qos_ops,
5239 },
5240 {/* hw:x,10 */
5241 .name = "Listen 1 Audio Service",
5242 .stream_name = "Listen 1 Audio Service",
5243 .cpu_dai_name = "LSM1",
5244 .platform_name = "msm-lsm-client",
5245 .dynamic = 1,
5246 .dpcm_capture = 1,
5247 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5248 SND_SOC_DPCM_TRIGGER_POST },
5249 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5250 .ignore_suspend = 1,
5251 .codec_dai_name = "snd-soc-dummy-dai",
5252 .codec_name = "snd-soc-dummy",
5253 .id = MSM_FRONTEND_DAI_LSM1,
5254 },
5255 /* Multiple Tunnel instances */
5256 {/* hw:x,11 */
5257 .name = MSM_DAILINK_NAME(Compress2),
5258 .stream_name = "Compress2",
5259 .cpu_dai_name = "MultiMedia7",
5260 .platform_name = "msm-compress-dsp",
5261 .dynamic = 1,
5262 .dpcm_playback = 1,
5263 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5264 SND_SOC_DPCM_TRIGGER_POST},
5265 .codec_dai_name = "snd-soc-dummy-dai",
5266 .codec_name = "snd-soc-dummy",
5267 .ignore_suspend = 1,
5268 .ignore_pmdown_time = 1,
5269 /* this dainlink has playback support */
5270 .id = MSM_FRONTEND_DAI_MULTIMEDIA7,
5271 },
5272 {/* hw:x,12 */
5273 .name = MSM_DAILINK_NAME(MultiMedia10),
5274 .stream_name = "MultiMedia10",
5275 .cpu_dai_name = "MultiMedia10",
5276 .platform_name = "msm-pcm-dsp.1",
5277 .dynamic = 1,
5278 .dpcm_playback = 1,
5279 .dpcm_capture = 1,
5280 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5281 SND_SOC_DPCM_TRIGGER_POST},
5282 .codec_dai_name = "snd-soc-dummy-dai",
5283 .codec_name = "snd-soc-dummy",
5284 .ignore_suspend = 1,
5285 .ignore_pmdown_time = 1,
5286 /* this dainlink has playback support */
5287 .id = MSM_FRONTEND_DAI_MULTIMEDIA10,
5288 },
5289 {/* hw:x,13 */
5290 .name = MSM_DAILINK_NAME(ULL_NOIRQ),
5291 .stream_name = "MM_NOIRQ",
5292 .cpu_dai_name = "MultiMedia8",
5293 .platform_name = "msm-pcm-dsp-noirq",
5294 .dynamic = 1,
5295 .dpcm_playback = 1,
5296 .dpcm_capture = 1,
5297 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5298 SND_SOC_DPCM_TRIGGER_POST},
5299 .codec_dai_name = "snd-soc-dummy-dai",
5300 .codec_name = "snd-soc-dummy",
5301 .ignore_suspend = 1,
5302 .ignore_pmdown_time = 1,
5303 /* this dainlink has playback support */
5304 .id = MSM_FRONTEND_DAI_MULTIMEDIA8,
5305 .ops = &msm_fe_qos_ops,
5306 },
5307 /* HDMI Hostless */
5308 {/* hw:x,14 */
5309 .name = "HDMI_RX_HOSTLESS",
5310 .stream_name = "HDMI_RX_HOSTLESS",
5311 .cpu_dai_name = "HDMI_HOSTLESS",
5312 .platform_name = "msm-pcm-hostless",
5313 .dynamic = 1,
5314 .dpcm_playback = 1,
5315 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5316 SND_SOC_DPCM_TRIGGER_POST},
5317 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5318 .ignore_suspend = 1,
5319 .ignore_pmdown_time = 1,
5320 .codec_dai_name = "snd-soc-dummy-dai",
5321 .codec_name = "snd-soc-dummy",
5322 },
5323 {/* hw:x,15 */
5324 .name = "VoiceMMode2",
5325 .stream_name = "VoiceMMode2",
5326 .cpu_dai_name = "VoiceMMode2",
5327 .platform_name = "msm-pcm-voice",
5328 .dynamic = 1,
5329 .dpcm_playback = 1,
5330 .dpcm_capture = 1,
5331 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5332 SND_SOC_DPCM_TRIGGER_POST},
5333 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5334 .ignore_suspend = 1,
5335 .ignore_pmdown_time = 1,
5336 .codec_dai_name = "snd-soc-dummy-dai",
5337 .codec_name = "snd-soc-dummy",
5338 .id = MSM_FRONTEND_DAI_VOICEMMODE2,
5339 },
5340 /* LSM FE */
5341 {/* hw:x,16 */
5342 .name = "Listen 2 Audio Service",
5343 .stream_name = "Listen 2 Audio Service",
5344 .cpu_dai_name = "LSM2",
5345 .platform_name = "msm-lsm-client",
5346 .dynamic = 1,
5347 .dpcm_capture = 1,
5348 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5349 SND_SOC_DPCM_TRIGGER_POST },
5350 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5351 .ignore_suspend = 1,
5352 .codec_dai_name = "snd-soc-dummy-dai",
5353 .codec_name = "snd-soc-dummy",
5354 .id = MSM_FRONTEND_DAI_LSM2,
5355 },
5356 {/* hw:x,17 */
5357 .name = "Listen 3 Audio Service",
5358 .stream_name = "Listen 3 Audio Service",
5359 .cpu_dai_name = "LSM3",
5360 .platform_name = "msm-lsm-client",
5361 .dynamic = 1,
5362 .dpcm_capture = 1,
5363 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5364 SND_SOC_DPCM_TRIGGER_POST },
5365 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5366 .ignore_suspend = 1,
5367 .codec_dai_name = "snd-soc-dummy-dai",
5368 .codec_name = "snd-soc-dummy",
5369 .id = MSM_FRONTEND_DAI_LSM3,
5370 },
5371 {/* hw:x,18 */
5372 .name = "Listen 4 Audio Service",
5373 .stream_name = "Listen 4 Audio Service",
5374 .cpu_dai_name = "LSM4",
5375 .platform_name = "msm-lsm-client",
5376 .dynamic = 1,
5377 .dpcm_capture = 1,
5378 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5379 SND_SOC_DPCM_TRIGGER_POST },
5380 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5381 .ignore_suspend = 1,
5382 .codec_dai_name = "snd-soc-dummy-dai",
5383 .codec_name = "snd-soc-dummy",
5384 .id = MSM_FRONTEND_DAI_LSM4,
5385 },
5386 {/* hw:x,19 */
5387 .name = "Listen 5 Audio Service",
5388 .stream_name = "Listen 5 Audio Service",
5389 .cpu_dai_name = "LSM5",
5390 .platform_name = "msm-lsm-client",
5391 .dynamic = 1,
5392 .dpcm_capture = 1,
5393 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5394 SND_SOC_DPCM_TRIGGER_POST },
5395 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5396 .ignore_suspend = 1,
5397 .codec_dai_name = "snd-soc-dummy-dai",
5398 .codec_name = "snd-soc-dummy",
5399 .id = MSM_FRONTEND_DAI_LSM5,
5400 },
5401 {/* hw:x,20 */
5402 .name = "Listen 6 Audio Service",
5403 .stream_name = "Listen 6 Audio Service",
5404 .cpu_dai_name = "LSM6",
5405 .platform_name = "msm-lsm-client",
5406 .dynamic = 1,
5407 .dpcm_capture = 1,
5408 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5409 SND_SOC_DPCM_TRIGGER_POST },
5410 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5411 .ignore_suspend = 1,
5412 .codec_dai_name = "snd-soc-dummy-dai",
5413 .codec_name = "snd-soc-dummy",
5414 .id = MSM_FRONTEND_DAI_LSM6,
5415 },
5416 {/* hw:x,21 */
5417 .name = "Listen 7 Audio Service",
5418 .stream_name = "Listen 7 Audio Service",
5419 .cpu_dai_name = "LSM7",
5420 .platform_name = "msm-lsm-client",
5421 .dynamic = 1,
5422 .dpcm_capture = 1,
5423 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5424 SND_SOC_DPCM_TRIGGER_POST },
5425 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5426 .ignore_suspend = 1,
5427 .codec_dai_name = "snd-soc-dummy-dai",
5428 .codec_name = "snd-soc-dummy",
5429 .id = MSM_FRONTEND_DAI_LSM7,
5430 },
5431 {/* hw:x,22 */
5432 .name = "Listen 8 Audio Service",
5433 .stream_name = "Listen 8 Audio Service",
5434 .cpu_dai_name = "LSM8",
5435 .platform_name = "msm-lsm-client",
5436 .dynamic = 1,
5437 .dpcm_capture = 1,
5438 .trigger = { SND_SOC_DPCM_TRIGGER_POST,
5439 SND_SOC_DPCM_TRIGGER_POST },
5440 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5441 .ignore_suspend = 1,
5442 .codec_dai_name = "snd-soc-dummy-dai",
5443 .codec_name = "snd-soc-dummy",
5444 .id = MSM_FRONTEND_DAI_LSM8,
5445 },
5446 {/* hw:x,23 */
5447 .name = MSM_DAILINK_NAME(Media9),
5448 .stream_name = "MultiMedia9",
5449 .cpu_dai_name = "MultiMedia9",
5450 .platform_name = "msm-pcm-dsp.0",
5451 .dynamic = 1,
5452 .dpcm_playback = 1,
5453 .dpcm_capture = 1,
5454 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5455 SND_SOC_DPCM_TRIGGER_POST},
5456 .codec_dai_name = "snd-soc-dummy-dai",
5457 .codec_name = "snd-soc-dummy",
5458 .ignore_suspend = 1,
5459 /* this dainlink has playback support */
5460 .ignore_pmdown_time = 1,
5461 .id = MSM_FRONTEND_DAI_MULTIMEDIA9,
5462 },
5463 {/* hw:x,24 */
5464 .name = MSM_DAILINK_NAME(Compress4),
5465 .stream_name = "Compress4",
5466 .cpu_dai_name = "MultiMedia11",
5467 .platform_name = "msm-compress-dsp",
5468 .dynamic = 1,
5469 .dpcm_playback = 1,
5470 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5471 SND_SOC_DPCM_TRIGGER_POST},
5472 .codec_dai_name = "snd-soc-dummy-dai",
5473 .codec_name = "snd-soc-dummy",
5474 .ignore_suspend = 1,
5475 .ignore_pmdown_time = 1,
5476 /* this dainlink has playback support */
5477 .id = MSM_FRONTEND_DAI_MULTIMEDIA11,
5478 },
5479 {/* hw:x,25 */
5480 .name = MSM_DAILINK_NAME(Compress5),
5481 .stream_name = "Compress5",
5482 .cpu_dai_name = "MultiMedia12",
5483 .platform_name = "msm-compress-dsp",
5484 .dynamic = 1,
5485 .dpcm_playback = 1,
5486 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5487 SND_SOC_DPCM_TRIGGER_POST},
5488 .codec_dai_name = "snd-soc-dummy-dai",
5489 .codec_name = "snd-soc-dummy",
5490 .ignore_suspend = 1,
5491 .ignore_pmdown_time = 1,
5492 /* this dainlink has playback support */
5493 .id = MSM_FRONTEND_DAI_MULTIMEDIA12,
5494 },
5495 {/* hw:x,26 */
5496 .name = MSM_DAILINK_NAME(Compress6),
5497 .stream_name = "Compress6",
5498 .cpu_dai_name = "MultiMedia13",
5499 .platform_name = "msm-compress-dsp",
5500 .dynamic = 1,
5501 .dpcm_playback = 1,
5502 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5503 SND_SOC_DPCM_TRIGGER_POST},
5504 .codec_dai_name = "snd-soc-dummy-dai",
5505 .codec_name = "snd-soc-dummy",
5506 .ignore_suspend = 1,
5507 .ignore_pmdown_time = 1,
5508 /* this dainlink has playback support */
5509 .id = MSM_FRONTEND_DAI_MULTIMEDIA13,
5510 },
5511 {/* hw:x,27 */
5512 .name = MSM_DAILINK_NAME(Compress7),
5513 .stream_name = "Compress7",
5514 .cpu_dai_name = "MultiMedia14",
5515 .platform_name = "msm-compress-dsp",
5516 .dynamic = 1,
5517 .dpcm_playback = 1,
5518 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5519 SND_SOC_DPCM_TRIGGER_POST},
5520 .codec_dai_name = "snd-soc-dummy-dai",
5521 .codec_name = "snd-soc-dummy",
5522 .ignore_suspend = 1,
5523 .ignore_pmdown_time = 1,
5524 /* this dainlink has playback support */
5525 .id = MSM_FRONTEND_DAI_MULTIMEDIA14,
5526 },
5527 {/* hw:x,28 */
5528 .name = MSM_DAILINK_NAME(Compress8),
5529 .stream_name = "Compress8",
5530 .cpu_dai_name = "MultiMedia15",
5531 .platform_name = "msm-compress-dsp",
5532 .dynamic = 1,
5533 .dpcm_playback = 1,
5534 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5535 SND_SOC_DPCM_TRIGGER_POST},
5536 .codec_dai_name = "snd-soc-dummy-dai",
5537 .codec_name = "snd-soc-dummy",
5538 .ignore_suspend = 1,
5539 .ignore_pmdown_time = 1,
5540 /* this dainlink has playback support */
5541 .id = MSM_FRONTEND_DAI_MULTIMEDIA15,
5542 },
5543 {/* hw:x,29 */
5544 .name = MSM_DAILINK_NAME(ULL_NOIRQ_2),
5545 .stream_name = "MM_NOIRQ_2",
5546 .cpu_dai_name = "MultiMedia16",
5547 .platform_name = "msm-pcm-dsp-noirq",
5548 .dynamic = 1,
5549 .dpcm_playback = 1,
5550 .dpcm_capture = 1,
5551 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5552 SND_SOC_DPCM_TRIGGER_POST},
5553 .codec_dai_name = "snd-soc-dummy-dai",
5554 .codec_name = "snd-soc-dummy",
5555 .ignore_suspend = 1,
5556 .ignore_pmdown_time = 1,
5557 /* this dainlink has playback support */
5558 .id = MSM_FRONTEND_DAI_MULTIMEDIA16,
5559 },
5560 {/* hw:x,30 */
5561 .name = "CDC_DMA Hostless",
5562 .stream_name = "CDC_DMA Hostless",
5563 .cpu_dai_name = "CDC_DMA_HOSTLESS",
5564 .platform_name = "msm-pcm-hostless",
5565 .dynamic = 1,
5566 .dpcm_playback = 1,
5567 .dpcm_capture = 1,
5568 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5569 SND_SOC_DPCM_TRIGGER_POST},
5570 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5571 .ignore_suspend = 1,
5572 /* this dailink has playback support */
5573 .ignore_pmdown_time = 1,
5574 .codec_dai_name = "snd-soc-dummy-dai",
5575 .codec_name = "snd-soc-dummy",
5576 },
5577 {/* hw:x,31 */
5578 .name = "TX3_CDC_DMA Hostless",
5579 .stream_name = "TX3_CDC_DMA Hostless",
5580 .cpu_dai_name = "TX3_CDC_DMA_HOSTLESS",
5581 .platform_name = "msm-pcm-hostless",
5582 .dynamic = 1,
5583 .dpcm_capture = 1,
5584 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5585 SND_SOC_DPCM_TRIGGER_POST},
5586 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5587 .ignore_suspend = 1,
5588 .codec_dai_name = "snd-soc-dummy-dai",
5589 .codec_name = "snd-soc-dummy",
5590 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08005591 {/* hw:x,32 */
5592 .name = "Tertiary MI2S TX_Hostless",
5593 .stream_name = "Tertiary MI2S_TX Hostless Capture",
5594 .cpu_dai_name = "TERT_MI2S_TX_HOSTLESS",
5595 .platform_name = "msm-pcm-hostless",
5596 .dynamic = 1,
5597 .dpcm_capture = 1,
5598 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5599 SND_SOC_DPCM_TRIGGER_POST},
5600 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5601 .ignore_suspend = 1,
5602 .ignore_pmdown_time = 1,
5603 .codec_dai_name = "snd-soc-dummy-dai",
5604 .codec_name = "snd-soc-dummy",
5605 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005606};
5607
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005608static struct snd_soc_dai_link msm_bolero_fe_dai_links[] = {
Karthikeyan Manif0de7562019-03-04 16:39:41 -08005609 {/* hw:x,33 */
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07005610 .name = LPASS_BE_WSA_CDC_DMA_TX_0,
5611 .stream_name = "WSA CDC DMA0 Capture",
5612 .cpu_dai_name = "msm-dai-cdc-dma-dev.45057",
5613 .platform_name = "msm-pcm-hostless",
5614 .codec_name = "bolero_codec",
5615 .codec_dai_name = "wsa_macro_vifeedback",
5616 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_0,
5617 .be_hw_params_fixup = msm_be_hw_params_fixup,
5618 .ignore_suspend = 1,
5619 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5620 .ops = &msm_cdc_dma_be_ops,
5621 },
5622};
5623
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005624static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
Karthikeyan Manif0de7562019-03-04 16:39:41 -08005625 {/* hw:x,34 */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005626 .name = MSM_DAILINK_NAME(ASM Loopback),
5627 .stream_name = "MultiMedia6",
5628 .cpu_dai_name = "MultiMedia6",
5629 .platform_name = "msm-pcm-loopback",
5630 .dynamic = 1,
5631 .dpcm_playback = 1,
5632 .dpcm_capture = 1,
5633 .codec_dai_name = "snd-soc-dummy-dai",
5634 .codec_name = "snd-soc-dummy",
5635 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5636 SND_SOC_DPCM_TRIGGER_POST},
5637 .ignore_suspend = 1,
5638 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5639 .ignore_pmdown_time = 1,
5640 .id = MSM_FRONTEND_DAI_MULTIMEDIA6,
5641 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08005642 {/* hw:x,35 */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005643 .name = "USB Audio Hostless",
5644 .stream_name = "USB Audio Hostless",
5645 .cpu_dai_name = "USBAUDIO_HOSTLESS",
5646 .platform_name = "msm-pcm-hostless",
5647 .dynamic = 1,
5648 .dpcm_playback = 1,
5649 .dpcm_capture = 1,
5650 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5651 SND_SOC_DPCM_TRIGGER_POST},
5652 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5653 .ignore_suspend = 1,
5654 .ignore_pmdown_time = 1,
5655 .codec_dai_name = "snd-soc-dummy-dai",
5656 .codec_name = "snd-soc-dummy",
5657 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08005658 {/* hw:x,36 */
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005659 .name = "SLIMBUS_7 Hostless",
5660 .stream_name = "SLIMBUS_7 Hostless",
5661 .cpu_dai_name = "SLIMBUS7_HOSTLESS",
5662 .platform_name = "msm-pcm-hostless",
5663 .dynamic = 1,
5664 .dpcm_capture = 1,
5665 .dpcm_playback = 1,
5666 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5667 SND_SOC_DPCM_TRIGGER_POST},
5668 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5669 .ignore_suspend = 1,
5670 .ignore_pmdown_time = 1,
5671 .codec_dai_name = "snd-soc-dummy-dai",
5672 .codec_name = "snd-soc-dummy",
5673 },
Karthikeyan Manif0de7562019-03-04 16:39:41 -08005674 {/* hw:x,37 */
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08005675 .name = "Compress Capture",
5676 .stream_name = "Compress9",
5677 .cpu_dai_name = "MultiMedia17",
5678 .platform_name = "msm-compress-dsp",
5679 .dynamic = 1,
5680 .dpcm_capture = 1,
5681 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5682 SND_SOC_DPCM_TRIGGER_POST},
5683 .codec_dai_name = "snd-soc-dummy-dai",
5684 .codec_name = "snd-soc-dummy",
5685 .ignore_suspend = 1,
5686 .ignore_pmdown_time = 1,
5687 .id = MSM_FRONTEND_DAI_MULTIMEDIA17,
5688 },
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05305689 {/* hw:x,38 */
5690 .name = "SLIMBUS_8 Hostless",
5691 .stream_name = "SLIMBUS_8 Hostless",
5692 .cpu_dai_name = "SLIMBUS8_HOSTLESS",
5693 .platform_name = "msm-pcm-hostless",
5694 .dynamic = 1,
5695 .dpcm_capture = 1,
5696 .dpcm_playback = 1,
5697 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
5698 SND_SOC_DPCM_TRIGGER_POST},
5699 .no_host_mode = SND_SOC_DAI_LINK_NO_HOST,
5700 .ignore_suspend = 1,
5701 .ignore_pmdown_time = 1,
5702 .codec_dai_name = "snd-soc-dummy-dai",
5703 .codec_name = "snd-soc-dummy",
5704 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005705};
5706
5707static struct snd_soc_dai_link msm_common_be_dai_links[] = {
5708 /* Backend AFE DAI Links */
5709 {
5710 .name = LPASS_BE_AFE_PCM_RX,
5711 .stream_name = "AFE Playback",
5712 .cpu_dai_name = "msm-dai-q6-dev.224",
5713 .platform_name = "msm-pcm-routing",
5714 .codec_name = "msm-stub-codec.1",
5715 .codec_dai_name = "msm-stub-rx",
5716 .no_pcm = 1,
5717 .dpcm_playback = 1,
5718 .id = MSM_BACKEND_DAI_AFE_PCM_RX,
5719 .be_hw_params_fixup = msm_be_hw_params_fixup,
5720 /* this dainlink has playback support */
5721 .ignore_pmdown_time = 1,
5722 .ignore_suspend = 1,
5723 },
5724 {
5725 .name = LPASS_BE_AFE_PCM_TX,
5726 .stream_name = "AFE Capture",
5727 .cpu_dai_name = "msm-dai-q6-dev.225",
5728 .platform_name = "msm-pcm-routing",
5729 .codec_name = "msm-stub-codec.1",
5730 .codec_dai_name = "msm-stub-tx",
5731 .no_pcm = 1,
5732 .dpcm_capture = 1,
5733 .id = MSM_BACKEND_DAI_AFE_PCM_TX,
5734 .be_hw_params_fixup = msm_be_hw_params_fixup,
5735 .ignore_suspend = 1,
5736 },
5737 /* Incall Record Uplink BACK END DAI Link */
5738 {
5739 .name = LPASS_BE_INCALL_RECORD_TX,
5740 .stream_name = "Voice Uplink Capture",
5741 .cpu_dai_name = "msm-dai-q6-dev.32772",
5742 .platform_name = "msm-pcm-routing",
5743 .codec_name = "msm-stub-codec.1",
5744 .codec_dai_name = "msm-stub-tx",
5745 .no_pcm = 1,
5746 .dpcm_capture = 1,
5747 .id = MSM_BACKEND_DAI_INCALL_RECORD_TX,
5748 .be_hw_params_fixup = msm_be_hw_params_fixup,
5749 .ignore_suspend = 1,
5750 },
5751 /* Incall Record Downlink BACK END DAI Link */
5752 {
5753 .name = LPASS_BE_INCALL_RECORD_RX,
5754 .stream_name = "Voice Downlink Capture",
5755 .cpu_dai_name = "msm-dai-q6-dev.32771",
5756 .platform_name = "msm-pcm-routing",
5757 .codec_name = "msm-stub-codec.1",
5758 .codec_dai_name = "msm-stub-tx",
5759 .no_pcm = 1,
5760 .dpcm_capture = 1,
5761 .id = MSM_BACKEND_DAI_INCALL_RECORD_RX,
5762 .be_hw_params_fixup = msm_be_hw_params_fixup,
5763 .ignore_suspend = 1,
5764 },
5765 /* Incall Music BACK END DAI Link */
5766 {
5767 .name = LPASS_BE_VOICE_PLAYBACK_TX,
5768 .stream_name = "Voice Farend Playback",
5769 .cpu_dai_name = "msm-dai-q6-dev.32773",
5770 .platform_name = "msm-pcm-routing",
5771 .codec_name = "msm-stub-codec.1",
5772 .codec_dai_name = "msm-stub-rx",
5773 .no_pcm = 1,
5774 .dpcm_playback = 1,
5775 .id = MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
5776 .be_hw_params_fixup = msm_be_hw_params_fixup,
5777 .ignore_suspend = 1,
5778 .ignore_pmdown_time = 1,
5779 },
5780 /* Incall Music 2 BACK END DAI Link */
5781 {
5782 .name = LPASS_BE_VOICE2_PLAYBACK_TX,
5783 .stream_name = "Voice2 Farend Playback",
5784 .cpu_dai_name = "msm-dai-q6-dev.32770",
5785 .platform_name = "msm-pcm-routing",
5786 .codec_name = "msm-stub-codec.1",
5787 .codec_dai_name = "msm-stub-rx",
5788 .no_pcm = 1,
5789 .dpcm_playback = 1,
5790 .id = MSM_BACKEND_DAI_VOICE2_PLAYBACK_TX,
5791 .be_hw_params_fixup = msm_be_hw_params_fixup,
5792 .ignore_suspend = 1,
5793 .ignore_pmdown_time = 1,
5794 },
5795 {
5796 .name = LPASS_BE_USB_AUDIO_RX,
5797 .stream_name = "USB Audio Playback",
5798 .cpu_dai_name = "msm-dai-q6-dev.28672",
5799 .platform_name = "msm-pcm-routing",
5800 .codec_name = "msm-stub-codec.1",
5801 .codec_dai_name = "msm-stub-rx",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05305802 .dynamic_be = 1,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005803 .no_pcm = 1,
5804 .dpcm_playback = 1,
5805 .id = MSM_BACKEND_DAI_USB_RX,
5806 .be_hw_params_fixup = msm_be_hw_params_fixup,
5807 .ignore_pmdown_time = 1,
5808 .ignore_suspend = 1,
5809 },
5810 {
5811 .name = LPASS_BE_USB_AUDIO_TX,
5812 .stream_name = "USB Audio Capture",
5813 .cpu_dai_name = "msm-dai-q6-dev.28673",
5814 .platform_name = "msm-pcm-routing",
5815 .codec_name = "msm-stub-codec.1",
5816 .codec_dai_name = "msm-stub-tx",
5817 .no_pcm = 1,
5818 .dpcm_capture = 1,
5819 .id = MSM_BACKEND_DAI_USB_TX,
5820 .be_hw_params_fixup = msm_be_hw_params_fixup,
5821 .ignore_suspend = 1,
5822 },
5823 {
5824 .name = LPASS_BE_PRI_TDM_RX_0,
5825 .stream_name = "Primary TDM0 Playback",
5826 .cpu_dai_name = "msm-dai-q6-tdm.36864",
5827 .platform_name = "msm-pcm-routing",
5828 .codec_name = "msm-stub-codec.1",
5829 .codec_dai_name = "msm-stub-rx",
5830 .no_pcm = 1,
5831 .dpcm_playback = 1,
5832 .id = MSM_BACKEND_DAI_PRI_TDM_RX_0,
5833 .be_hw_params_fixup = msm_be_hw_params_fixup,
5834 .ops = &kona_tdm_be_ops,
5835 .ignore_suspend = 1,
5836 .ignore_pmdown_time = 1,
5837 },
5838 {
5839 .name = LPASS_BE_PRI_TDM_TX_0,
5840 .stream_name = "Primary TDM0 Capture",
5841 .cpu_dai_name = "msm-dai-q6-tdm.36865",
5842 .platform_name = "msm-pcm-routing",
5843 .codec_name = "msm-stub-codec.1",
5844 .codec_dai_name = "msm-stub-tx",
5845 .no_pcm = 1,
5846 .dpcm_capture = 1,
5847 .id = MSM_BACKEND_DAI_PRI_TDM_TX_0,
5848 .be_hw_params_fixup = msm_be_hw_params_fixup,
5849 .ops = &kona_tdm_be_ops,
5850 .ignore_suspend = 1,
5851 },
5852 {
5853 .name = LPASS_BE_SEC_TDM_RX_0,
5854 .stream_name = "Secondary TDM0 Playback",
5855 .cpu_dai_name = "msm-dai-q6-tdm.36880",
5856 .platform_name = "msm-pcm-routing",
5857 .codec_name = "msm-stub-codec.1",
5858 .codec_dai_name = "msm-stub-rx",
5859 .no_pcm = 1,
5860 .dpcm_playback = 1,
5861 .id = MSM_BACKEND_DAI_SEC_TDM_RX_0,
5862 .be_hw_params_fixup = msm_be_hw_params_fixup,
5863 .ops = &kona_tdm_be_ops,
5864 .ignore_suspend = 1,
5865 .ignore_pmdown_time = 1,
5866 },
5867 {
5868 .name = LPASS_BE_SEC_TDM_TX_0,
5869 .stream_name = "Secondary TDM0 Capture",
5870 .cpu_dai_name = "msm-dai-q6-tdm.36881",
5871 .platform_name = "msm-pcm-routing",
5872 .codec_name = "msm-stub-codec.1",
5873 .codec_dai_name = "msm-stub-tx",
5874 .no_pcm = 1,
5875 .dpcm_capture = 1,
5876 .id = MSM_BACKEND_DAI_SEC_TDM_TX_0,
5877 .be_hw_params_fixup = msm_be_hw_params_fixup,
5878 .ops = &kona_tdm_be_ops,
5879 .ignore_suspend = 1,
5880 },
5881 {
5882 .name = LPASS_BE_TERT_TDM_RX_0,
5883 .stream_name = "Tertiary TDM0 Playback",
5884 .cpu_dai_name = "msm-dai-q6-tdm.36896",
5885 .platform_name = "msm-pcm-routing",
5886 .codec_name = "msm-stub-codec.1",
5887 .codec_dai_name = "msm-stub-rx",
5888 .no_pcm = 1,
5889 .dpcm_playback = 1,
5890 .id = MSM_BACKEND_DAI_TERT_TDM_RX_0,
5891 .be_hw_params_fixup = msm_be_hw_params_fixup,
5892 .ops = &kona_tdm_be_ops,
5893 .ignore_suspend = 1,
5894 .ignore_pmdown_time = 1,
5895 },
5896 {
5897 .name = LPASS_BE_TERT_TDM_TX_0,
5898 .stream_name = "Tertiary TDM0 Capture",
5899 .cpu_dai_name = "msm-dai-q6-tdm.36897",
5900 .platform_name = "msm-pcm-routing",
5901 .codec_name = "msm-stub-codec.1",
5902 .codec_dai_name = "msm-stub-tx",
5903 .no_pcm = 1,
5904 .dpcm_capture = 1,
5905 .id = MSM_BACKEND_DAI_TERT_TDM_TX_0,
5906 .be_hw_params_fixup = msm_be_hw_params_fixup,
5907 .ops = &kona_tdm_be_ops,
5908 .ignore_suspend = 1,
5909 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08005910 {
5911 .name = LPASS_BE_QUAT_TDM_RX_0,
5912 .stream_name = "Quaternary TDM0 Playback",
5913 .cpu_dai_name = "msm-dai-q6-tdm.36912",
5914 .platform_name = "msm-pcm-routing",
5915 .codec_name = "msm-stub-codec.1",
5916 .codec_dai_name = "msm-stub-rx",
5917 .no_pcm = 1,
5918 .dpcm_playback = 1,
5919 .id = MSM_BACKEND_DAI_QUAT_TDM_RX_0,
5920 .be_hw_params_fixup = msm_be_hw_params_fixup,
5921 .ops = &kona_tdm_be_ops,
5922 .ignore_suspend = 1,
5923 .ignore_pmdown_time = 1,
5924 },
5925 {
5926 .name = LPASS_BE_QUAT_TDM_TX_0,
5927 .stream_name = "Quaternary TDM0 Capture",
5928 .cpu_dai_name = "msm-dai-q6-tdm.36913",
5929 .platform_name = "msm-pcm-routing",
5930 .codec_name = "msm-stub-codec.1",
5931 .codec_dai_name = "msm-stub-tx",
5932 .no_pcm = 1,
5933 .dpcm_capture = 1,
5934 .id = MSM_BACKEND_DAI_QUAT_TDM_TX_0,
5935 .be_hw_params_fixup = msm_be_hw_params_fixup,
5936 .ops = &kona_tdm_be_ops,
5937 .ignore_suspend = 1,
5938 },
5939 {
5940 .name = LPASS_BE_QUIN_TDM_RX_0,
5941 .stream_name = "Quinary TDM0 Playback",
5942 .cpu_dai_name = "msm-dai-q6-tdm.36928",
5943 .platform_name = "msm-pcm-routing",
5944 .codec_name = "msm-stub-codec.1",
5945 .codec_dai_name = "msm-stub-rx",
5946 .no_pcm = 1,
5947 .dpcm_playback = 1,
5948 .id = MSM_BACKEND_DAI_QUIN_TDM_RX_0,
5949 .be_hw_params_fixup = msm_be_hw_params_fixup,
5950 .ops = &kona_tdm_be_ops,
5951 .ignore_suspend = 1,
5952 .ignore_pmdown_time = 1,
5953 },
5954 {
5955 .name = LPASS_BE_QUIN_TDM_TX_0,
5956 .stream_name = "Quinary TDM0 Capture",
5957 .cpu_dai_name = "msm-dai-q6-tdm.36929",
5958 .platform_name = "msm-pcm-routing",
5959 .codec_name = "msm-stub-codec.1",
5960 .codec_dai_name = "msm-stub-tx",
5961 .no_pcm = 1,
5962 .dpcm_capture = 1,
5963 .id = MSM_BACKEND_DAI_QUIN_TDM_TX_0,
5964 .be_hw_params_fixup = msm_be_hw_params_fixup,
5965 .ops = &kona_tdm_be_ops,
5966 .ignore_suspend = 1,
5967 },
5968 {
5969 .name = LPASS_BE_SEN_TDM_RX_0,
5970 .stream_name = "Senary TDM0 Playback",
5971 .cpu_dai_name = "msm-dai-q6-tdm.36944",
5972 .platform_name = "msm-pcm-routing",
5973 .codec_name = "msm-stub-codec.1",
5974 .codec_dai_name = "msm-stub-rx",
5975 .no_pcm = 1,
5976 .dpcm_playback = 1,
5977 .id = MSM_BACKEND_DAI_SEN_TDM_RX_0,
5978 .be_hw_params_fixup = msm_be_hw_params_fixup,
5979 .ops = &kona_tdm_be_ops,
5980 .ignore_suspend = 1,
5981 .ignore_pmdown_time = 1,
5982 },
5983 {
5984 .name = LPASS_BE_SEN_TDM_TX_0,
5985 .stream_name = "Senary TDM0 Capture",
5986 .cpu_dai_name = "msm-dai-q6-tdm.36945",
5987 .platform_name = "msm-pcm-routing",
5988 .codec_name = "msm-stub-codec.1",
5989 .codec_dai_name = "msm-stub-tx",
5990 .no_pcm = 1,
5991 .dpcm_capture = 1,
5992 .id = MSM_BACKEND_DAI_SEN_TDM_TX_0,
5993 .be_hw_params_fixup = msm_be_hw_params_fixup,
5994 .ops = &kona_tdm_be_ops,
5995 .ignore_suspend = 1,
5996 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07005997};
5998
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08005999static struct snd_soc_dai_link msm_wcn_be_dai_links[] = {
6000 {
6001 .name = LPASS_BE_SLIMBUS_7_RX,
6002 .stream_name = "Slimbus7 Playback",
6003 .cpu_dai_name = "msm-dai-q6-dev.16398",
6004 .platform_name = "msm-pcm-routing",
6005 .codec_name = "btfmslim_slave",
6006 /* BT codec driver determines capabilities based on
6007 * dai name, bt codecdai name should always contains
6008 * supported usecase information
6009 */
6010 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
6011 .no_pcm = 1,
6012 .dpcm_playback = 1,
6013 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
6014 .be_hw_params_fixup = msm_be_hw_params_fixup,
6015 .init = &msm_wcn_init,
6016 .ops = &msm_wcn_ops,
6017 /* dai link has playback support */
6018 .ignore_pmdown_time = 1,
6019 .ignore_suspend = 1,
6020 },
6021 {
6022 .name = LPASS_BE_SLIMBUS_7_TX,
6023 .stream_name = "Slimbus7 Capture",
6024 .cpu_dai_name = "msm-dai-q6-dev.16399",
6025 .platform_name = "msm-pcm-routing",
6026 .codec_name = "btfmslim_slave",
6027 .codec_dai_name = "btfm_bt_sco_slim_tx",
6028 .no_pcm = 1,
6029 .dpcm_capture = 1,
6030 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
6031 .be_hw_params_fixup = msm_be_hw_params_fixup,
6032 .ops = &msm_wcn_ops,
6033 .ignore_suspend = 1,
6034 },
6035};
6036
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05306037static struct snd_soc_dai_link msm_wcn_btfm_be_dai_links[] = {
6038 {
6039 .name = LPASS_BE_SLIMBUS_7_RX,
6040 .stream_name = "Slimbus7 Playback",
6041 .cpu_dai_name = "msm-dai-q6-dev.16398",
6042 .platform_name = "msm-pcm-routing",
6043 .codec_name = "btfmslim_slave",
6044 /* BT codec driver determines capabilities based on
6045 * dai name, bt codecdai name should always contains
6046 * supported usecase information
6047 */
6048 .codec_dai_name = "btfm_bt_sco_a2dp_slim_rx",
6049 .no_pcm = 1,
6050 .dpcm_playback = 1,
6051 .id = MSM_BACKEND_DAI_SLIMBUS_7_RX,
6052 .be_hw_params_fixup = msm_be_hw_params_fixup,
6053 .init = &msm_wcn_init_lito,
6054 .ops = &msm_wcn_ops_lito,
6055 /* dai link has playback support */
6056 .ignore_pmdown_time = 1,
6057 .ignore_suspend = 1,
6058 },
6059 {
6060 .name = LPASS_BE_SLIMBUS_7_TX,
6061 .stream_name = "Slimbus7 Capture",
6062 .cpu_dai_name = "msm-dai-q6-dev.16399",
6063 .platform_name = "msm-pcm-routing",
6064 .codec_name = "btfmslim_slave",
6065 .codec_dai_name = "btfm_bt_sco_slim_tx",
6066 .no_pcm = 1,
6067 .dpcm_capture = 1,
6068 .id = MSM_BACKEND_DAI_SLIMBUS_7_TX,
6069 .be_hw_params_fixup = msm_be_hw_params_fixup,
6070 .ops = &msm_wcn_ops_lito,
6071 .ignore_suspend = 1,
6072 },
6073 {
6074 .name = LPASS_BE_SLIMBUS_8_TX,
6075 .stream_name = "Slimbus8 Capture",
6076 .cpu_dai_name = "msm-dai-q6-dev.16401",
6077 .platform_name = "msm-pcm-routing",
6078 .codec_name = "btfmslim_slave",
6079 .codec_dai_name = "btfm_fm_slim_tx",
6080 .no_pcm = 1,
6081 .dpcm_capture = 1,
6082 .id = MSM_BACKEND_DAI_SLIMBUS_8_TX,
6083 .be_hw_params_fixup = msm_be_hw_params_fixup,
6084 .ops = &msm_wcn_ops_lito,
6085 .ignore_suspend = 1,
6086 },
6087};
6088
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006089static struct snd_soc_dai_link ext_disp_be_dai_link[] = {
6090 /* DISP PORT BACK END DAI Link */
6091 {
6092 .name = LPASS_BE_DISPLAY_PORT,
6093 .stream_name = "Display Port Playback",
6094 .cpu_dai_name = "msm-dai-q6-dp.24608",
6095 .platform_name = "msm-pcm-routing",
6096 .codec_name = "msm-ext-disp-audio-codec-rx",
6097 .codec_dai_name = "msm_dp_audio_codec_rx_dai",
6098 .no_pcm = 1,
6099 .dpcm_playback = 1,
6100 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX,
6101 .be_hw_params_fixup = msm_be_hw_params_fixup,
6102 .ignore_pmdown_time = 1,
6103 .ignore_suspend = 1,
6104 },
6105 /* DISP PORT 1 BACK END DAI Link */
6106 {
6107 .name = LPASS_BE_DISPLAY_PORT1,
6108 .stream_name = "Display Port1 Playback",
6109 .cpu_dai_name = "msm-dai-q6-dp.24608",
6110 .platform_name = "msm-pcm-routing",
6111 .codec_name = "msm-ext-disp-audio-codec-rx",
6112 .codec_dai_name = "msm_dp_audio_codec_rx1_dai",
6113 .no_pcm = 1,
6114 .dpcm_playback = 1,
6115 .id = MSM_BACKEND_DAI_DISPLAY_PORT_RX_1,
6116 .be_hw_params_fixup = msm_be_hw_params_fixup,
6117 .ignore_pmdown_time = 1,
6118 .ignore_suspend = 1,
6119 },
6120};
6121
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006122static struct snd_soc_dai_link msm_mi2s_be_dai_links[] = {
6123 {
6124 .name = LPASS_BE_PRI_MI2S_RX,
6125 .stream_name = "Primary MI2S Playback",
6126 .cpu_dai_name = "msm-dai-q6-mi2s.0",
6127 .platform_name = "msm-pcm-routing",
6128 .codec_name = "msm-stub-codec.1",
6129 .codec_dai_name = "msm-stub-rx",
6130 .no_pcm = 1,
6131 .dpcm_playback = 1,
6132 .id = MSM_BACKEND_DAI_PRI_MI2S_RX,
6133 .be_hw_params_fixup = msm_be_hw_params_fixup,
6134 .ops = &msm_mi2s_be_ops,
6135 .ignore_suspend = 1,
6136 .ignore_pmdown_time = 1,
6137 },
6138 {
6139 .name = LPASS_BE_PRI_MI2S_TX,
6140 .stream_name = "Primary MI2S Capture",
6141 .cpu_dai_name = "msm-dai-q6-mi2s.0",
6142 .platform_name = "msm-pcm-routing",
6143 .codec_name = "msm-stub-codec.1",
6144 .codec_dai_name = "msm-stub-tx",
6145 .no_pcm = 1,
6146 .dpcm_capture = 1,
6147 .id = MSM_BACKEND_DAI_PRI_MI2S_TX,
6148 .be_hw_params_fixup = msm_be_hw_params_fixup,
6149 .ops = &msm_mi2s_be_ops,
6150 .ignore_suspend = 1,
6151 },
6152 {
6153 .name = LPASS_BE_SEC_MI2S_RX,
6154 .stream_name = "Secondary MI2S Playback",
6155 .cpu_dai_name = "msm-dai-q6-mi2s.1",
6156 .platform_name = "msm-pcm-routing",
6157 .codec_name = "msm-stub-codec.1",
6158 .codec_dai_name = "msm-stub-rx",
6159 .no_pcm = 1,
6160 .dpcm_playback = 1,
6161 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_RX,
6162 .be_hw_params_fixup = msm_be_hw_params_fixup,
6163 .ops = &msm_mi2s_be_ops,
6164 .ignore_suspend = 1,
6165 .ignore_pmdown_time = 1,
6166 },
6167 {
6168 .name = LPASS_BE_SEC_MI2S_TX,
6169 .stream_name = "Secondary MI2S Capture",
6170 .cpu_dai_name = "msm-dai-q6-mi2s.1",
6171 .platform_name = "msm-pcm-routing",
6172 .codec_name = "msm-stub-codec.1",
6173 .codec_dai_name = "msm-stub-tx",
6174 .no_pcm = 1,
6175 .dpcm_capture = 1,
6176 .id = MSM_BACKEND_DAI_SECONDARY_MI2S_TX,
6177 .be_hw_params_fixup = msm_be_hw_params_fixup,
6178 .ops = &msm_mi2s_be_ops,
6179 .ignore_suspend = 1,
6180 },
6181 {
6182 .name = LPASS_BE_TERT_MI2S_RX,
6183 .stream_name = "Tertiary MI2S Playback",
6184 .cpu_dai_name = "msm-dai-q6-mi2s.2",
6185 .platform_name = "msm-pcm-routing",
6186 .codec_name = "msm-stub-codec.1",
6187 .codec_dai_name = "msm-stub-rx",
6188 .no_pcm = 1,
6189 .dpcm_playback = 1,
6190 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_RX,
6191 .be_hw_params_fixup = msm_be_hw_params_fixup,
6192 .ops = &msm_mi2s_be_ops,
6193 .ignore_suspend = 1,
6194 .ignore_pmdown_time = 1,
6195 },
6196 {
6197 .name = LPASS_BE_TERT_MI2S_TX,
6198 .stream_name = "Tertiary MI2S Capture",
6199 .cpu_dai_name = "msm-dai-q6-mi2s.2",
6200 .platform_name = "msm-pcm-routing",
6201 .codec_name = "msm-stub-codec.1",
6202 .codec_dai_name = "msm-stub-tx",
6203 .no_pcm = 1,
6204 .dpcm_capture = 1,
6205 .id = MSM_BACKEND_DAI_TERTIARY_MI2S_TX,
6206 .be_hw_params_fixup = msm_be_hw_params_fixup,
6207 .ops = &msm_mi2s_be_ops,
6208 .ignore_suspend = 1,
6209 },
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006210 {
6211 .name = LPASS_BE_QUAT_MI2S_RX,
6212 .stream_name = "Quaternary MI2S Playback",
6213 .cpu_dai_name = "msm-dai-q6-mi2s.3",
6214 .platform_name = "msm-pcm-routing",
6215 .codec_name = "msm-stub-codec.1",
6216 .codec_dai_name = "msm-stub-rx",
6217 .no_pcm = 1,
6218 .dpcm_playback = 1,
6219 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_RX,
6220 .be_hw_params_fixup = msm_be_hw_params_fixup,
6221 .ops = &msm_mi2s_be_ops,
6222 .ignore_suspend = 1,
6223 .ignore_pmdown_time = 1,
6224 },
6225 {
6226 .name = LPASS_BE_QUAT_MI2S_TX,
6227 .stream_name = "Quaternary MI2S Capture",
6228 .cpu_dai_name = "msm-dai-q6-mi2s.3",
6229 .platform_name = "msm-pcm-routing",
6230 .codec_name = "msm-stub-codec.1",
6231 .codec_dai_name = "msm-stub-tx",
6232 .no_pcm = 1,
6233 .dpcm_capture = 1,
6234 .id = MSM_BACKEND_DAI_QUATERNARY_MI2S_TX,
6235 .be_hw_params_fixup = msm_be_hw_params_fixup,
6236 .ops = &msm_mi2s_be_ops,
6237 .ignore_suspend = 1,
6238 },
6239 {
6240 .name = LPASS_BE_QUIN_MI2S_RX,
6241 .stream_name = "Quinary MI2S Playback",
6242 .cpu_dai_name = "msm-dai-q6-mi2s.4",
6243 .platform_name = "msm-pcm-routing",
6244 .codec_name = "msm-stub-codec.1",
6245 .codec_dai_name = "msm-stub-rx",
6246 .no_pcm = 1,
6247 .dpcm_playback = 1,
6248 .id = MSM_BACKEND_DAI_QUINARY_MI2S_RX,
6249 .be_hw_params_fixup = msm_be_hw_params_fixup,
6250 .ops = &msm_mi2s_be_ops,
6251 .ignore_suspend = 1,
6252 .ignore_pmdown_time = 1,
6253 },
6254 {
6255 .name = LPASS_BE_QUIN_MI2S_TX,
6256 .stream_name = "Quinary MI2S Capture",
6257 .cpu_dai_name = "msm-dai-q6-mi2s.4",
6258 .platform_name = "msm-pcm-routing",
6259 .codec_name = "msm-stub-codec.1",
6260 .codec_dai_name = "msm-stub-tx",
6261 .no_pcm = 1,
6262 .dpcm_capture = 1,
6263 .id = MSM_BACKEND_DAI_QUINARY_MI2S_TX,
6264 .be_hw_params_fixup = msm_be_hw_params_fixup,
6265 .ops = &msm_mi2s_be_ops,
6266 .ignore_suspend = 1,
6267 },
6268 {
6269 .name = LPASS_BE_SENARY_MI2S_RX,
6270 .stream_name = "Senary MI2S Playback",
6271 .cpu_dai_name = "msm-dai-q6-mi2s.5",
6272 .platform_name = "msm-pcm-routing",
6273 .codec_name = "msm-stub-codec.1",
6274 .codec_dai_name = "msm-stub-rx",
6275 .no_pcm = 1,
6276 .dpcm_playback = 1,
6277 .id = MSM_BACKEND_DAI_SENARY_MI2S_RX,
6278 .be_hw_params_fixup = msm_be_hw_params_fixup,
6279 .ops = &msm_mi2s_be_ops,
6280 .ignore_suspend = 1,
6281 .ignore_pmdown_time = 1,
6282 },
6283 {
6284 .name = LPASS_BE_SENARY_MI2S_TX,
6285 .stream_name = "Senary MI2S Capture",
6286 .cpu_dai_name = "msm-dai-q6-mi2s.5",
6287 .platform_name = "msm-pcm-routing",
6288 .codec_name = "msm-stub-codec.1",
6289 .codec_dai_name = "msm-stub-tx",
6290 .no_pcm = 1,
6291 .dpcm_capture = 1,
6292 .id = MSM_BACKEND_DAI_SENARY_MI2S_TX,
6293 .be_hw_params_fixup = msm_be_hw_params_fixup,
6294 .ops = &msm_mi2s_be_ops,
6295 .ignore_suspend = 1,
6296 },
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006297};
6298
6299static struct snd_soc_dai_link msm_auxpcm_be_dai_links[] = {
6300 /* Primary AUX PCM Backend DAI Links */
6301 {
6302 .name = LPASS_BE_AUXPCM_RX,
6303 .stream_name = "AUX PCM Playback",
6304 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
6305 .platform_name = "msm-pcm-routing",
6306 .codec_name = "msm-stub-codec.1",
6307 .codec_dai_name = "msm-stub-rx",
6308 .no_pcm = 1,
6309 .dpcm_playback = 1,
6310 .id = MSM_BACKEND_DAI_AUXPCM_RX,
6311 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006312 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006313 .ignore_pmdown_time = 1,
6314 .ignore_suspend = 1,
6315 },
6316 {
6317 .name = LPASS_BE_AUXPCM_TX,
6318 .stream_name = "AUX PCM Capture",
6319 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
6320 .platform_name = "msm-pcm-routing",
6321 .codec_name = "msm-stub-codec.1",
6322 .codec_dai_name = "msm-stub-tx",
6323 .no_pcm = 1,
6324 .dpcm_capture = 1,
6325 .id = MSM_BACKEND_DAI_AUXPCM_TX,
6326 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006327 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006328 .ignore_suspend = 1,
6329 },
6330 /* Secondary AUX PCM Backend DAI Links */
6331 {
6332 .name = LPASS_BE_SEC_AUXPCM_RX,
6333 .stream_name = "Sec AUX PCM Playback",
6334 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
6335 .platform_name = "msm-pcm-routing",
6336 .codec_name = "msm-stub-codec.1",
6337 .codec_dai_name = "msm-stub-rx",
6338 .no_pcm = 1,
6339 .dpcm_playback = 1,
6340 .id = MSM_BACKEND_DAI_SEC_AUXPCM_RX,
6341 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006342 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006343 .ignore_pmdown_time = 1,
6344 .ignore_suspend = 1,
6345 },
6346 {
6347 .name = LPASS_BE_SEC_AUXPCM_TX,
6348 .stream_name = "Sec AUX PCM Capture",
6349 .cpu_dai_name = "msm-dai-q6-auxpcm.2",
6350 .platform_name = "msm-pcm-routing",
6351 .codec_name = "msm-stub-codec.1",
6352 .codec_dai_name = "msm-stub-tx",
6353 .no_pcm = 1,
6354 .dpcm_capture = 1,
6355 .id = MSM_BACKEND_DAI_SEC_AUXPCM_TX,
6356 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006357 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006358 .ignore_suspend = 1,
6359 },
6360 /* Tertiary AUX PCM Backend DAI Links */
6361 {
6362 .name = LPASS_BE_TERT_AUXPCM_RX,
6363 .stream_name = "Tert AUX PCM Playback",
6364 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
6365 .platform_name = "msm-pcm-routing",
6366 .codec_name = "msm-stub-codec.1",
6367 .codec_dai_name = "msm-stub-rx",
6368 .no_pcm = 1,
6369 .dpcm_playback = 1,
6370 .id = MSM_BACKEND_DAI_TERT_AUXPCM_RX,
6371 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006372 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006373 .ignore_suspend = 1,
6374 },
6375 {
6376 .name = LPASS_BE_TERT_AUXPCM_TX,
6377 .stream_name = "Tert AUX PCM Capture",
6378 .cpu_dai_name = "msm-dai-q6-auxpcm.3",
6379 .platform_name = "msm-pcm-routing",
6380 .codec_name = "msm-stub-codec.1",
6381 .codec_dai_name = "msm-stub-tx",
6382 .no_pcm = 1,
6383 .dpcm_capture = 1,
6384 .id = MSM_BACKEND_DAI_TERT_AUXPCM_TX,
6385 .be_hw_params_fixup = msm_be_hw_params_fixup,
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08006386 .ops = &kona_aux_be_ops,
6387 .ignore_suspend = 1,
6388 },
6389 /* Quaternary AUX PCM Backend DAI Links */
6390 {
6391 .name = LPASS_BE_QUAT_AUXPCM_RX,
6392 .stream_name = "Quat AUX PCM Playback",
6393 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
6394 .platform_name = "msm-pcm-routing",
6395 .codec_name = "msm-stub-codec.1",
6396 .codec_dai_name = "msm-stub-rx",
6397 .no_pcm = 1,
6398 .dpcm_playback = 1,
6399 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_RX,
6400 .be_hw_params_fixup = msm_be_hw_params_fixup,
6401 .ops = &kona_aux_be_ops,
6402 .ignore_suspend = 1,
6403 },
6404 {
6405 .name = LPASS_BE_QUAT_AUXPCM_TX,
6406 .stream_name = "Quat AUX PCM Capture",
6407 .cpu_dai_name = "msm-dai-q6-auxpcm.4",
6408 .platform_name = "msm-pcm-routing",
6409 .codec_name = "msm-stub-codec.1",
6410 .codec_dai_name = "msm-stub-tx",
6411 .no_pcm = 1,
6412 .dpcm_capture = 1,
6413 .id = MSM_BACKEND_DAI_QUAT_AUXPCM_TX,
6414 .be_hw_params_fixup = msm_be_hw_params_fixup,
6415 .ops = &kona_aux_be_ops,
6416 .ignore_suspend = 1,
6417 },
6418 /* Quinary AUX PCM Backend DAI Links */
6419 {
6420 .name = LPASS_BE_QUIN_AUXPCM_RX,
6421 .stream_name = "Quin AUX PCM Playback",
6422 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
6423 .platform_name = "msm-pcm-routing",
6424 .codec_name = "msm-stub-codec.1",
6425 .codec_dai_name = "msm-stub-rx",
6426 .no_pcm = 1,
6427 .dpcm_playback = 1,
6428 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_RX,
6429 .be_hw_params_fixup = msm_be_hw_params_fixup,
6430 .ops = &kona_aux_be_ops,
6431 .ignore_suspend = 1,
6432 },
6433 {
6434 .name = LPASS_BE_QUIN_AUXPCM_TX,
6435 .stream_name = "Quin AUX PCM Capture",
6436 .cpu_dai_name = "msm-dai-q6-auxpcm.5",
6437 .platform_name = "msm-pcm-routing",
6438 .codec_name = "msm-stub-codec.1",
6439 .codec_dai_name = "msm-stub-tx",
6440 .no_pcm = 1,
6441 .dpcm_capture = 1,
6442 .id = MSM_BACKEND_DAI_QUIN_AUXPCM_TX,
6443 .be_hw_params_fixup = msm_be_hw_params_fixup,
6444 .ops = &kona_aux_be_ops,
6445 .ignore_suspend = 1,
6446 },
6447 /* Senary AUX PCM Backend DAI Links */
6448 {
6449 .name = LPASS_BE_SEN_AUXPCM_RX,
6450 .stream_name = "Sen AUX PCM Playback",
6451 .cpu_dai_name = "msm-dai-q6-auxpcm.6",
6452 .platform_name = "msm-pcm-routing",
6453 .codec_name = "msm-stub-codec.1",
6454 .codec_dai_name = "msm-stub-rx",
6455 .no_pcm = 1,
6456 .dpcm_playback = 1,
6457 .id = MSM_BACKEND_DAI_SEN_AUXPCM_RX,
6458 .be_hw_params_fixup = msm_be_hw_params_fixup,
6459 .ops = &kona_aux_be_ops,
6460 .ignore_suspend = 1,
6461 },
6462 {
6463 .name = LPASS_BE_SEN_AUXPCM_TX,
6464 .stream_name = "Sen AUX PCM Capture",
6465 .cpu_dai_name = "msm-dai-q6-auxpcm.6",
6466 .platform_name = "msm-pcm-routing",
6467 .codec_name = "msm-stub-codec.1",
6468 .codec_dai_name = "msm-stub-tx",
6469 .no_pcm = 1,
6470 .dpcm_capture = 1,
6471 .id = MSM_BACKEND_DAI_SEN_AUXPCM_TX,
6472 .be_hw_params_fixup = msm_be_hw_params_fixup,
6473 .ops = &kona_aux_be_ops,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006474 .ignore_suspend = 1,
6475 },
6476};
6477
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006478static struct snd_soc_dai_link msm_wsa_cdc_dma_be_dai_links[] = {
6479 /* WSA CDC DMA Backend DAI Links */
6480 {
6481 .name = LPASS_BE_WSA_CDC_DMA_RX_0,
6482 .stream_name = "WSA CDC DMA0 Playback",
6483 .cpu_dai_name = "msm-dai-cdc-dma-dev.45056",
6484 .platform_name = "msm-pcm-routing",
6485 .codec_name = "bolero_codec",
6486 .codec_dai_name = "wsa_macro_rx1",
6487 .no_pcm = 1,
6488 .dpcm_playback = 1,
6489 .init = &msm_int_audrx_init,
6490 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_0,
6491 .be_hw_params_fixup = msm_be_hw_params_fixup,
6492 .ignore_pmdown_time = 1,
6493 .ignore_suspend = 1,
6494 .ops = &msm_cdc_dma_be_ops,
6495 },
6496 {
6497 .name = LPASS_BE_WSA_CDC_DMA_RX_1,
6498 .stream_name = "WSA CDC DMA1 Playback",
6499 .cpu_dai_name = "msm-dai-cdc-dma-dev.45058",
6500 .platform_name = "msm-pcm-routing",
6501 .codec_name = "bolero_codec",
6502 .codec_dai_name = "wsa_macro_rx_mix",
6503 .no_pcm = 1,
6504 .dpcm_playback = 1,
6505 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_RX_1,
6506 .be_hw_params_fixup = msm_be_hw_params_fixup,
6507 .ignore_pmdown_time = 1,
6508 .ignore_suspend = 1,
6509 .ops = &msm_cdc_dma_be_ops,
6510 },
6511 {
6512 .name = LPASS_BE_WSA_CDC_DMA_TX_1,
6513 .stream_name = "WSA CDC DMA1 Capture",
6514 .cpu_dai_name = "msm-dai-cdc-dma-dev.45059",
6515 .platform_name = "msm-pcm-routing",
6516 .codec_name = "bolero_codec",
6517 .codec_dai_name = "wsa_macro_echo",
6518 .no_pcm = 1,
6519 .dpcm_capture = 1,
6520 .id = MSM_BACKEND_DAI_WSA_CDC_DMA_TX_1,
6521 .be_hw_params_fixup = msm_be_hw_params_fixup,
6522 .ignore_suspend = 1,
6523 .ops = &msm_cdc_dma_be_ops,
6524 },
6525};
6526
6527static struct snd_soc_dai_link msm_rx_tx_cdc_dma_be_dai_links[] = {
6528 /* RX CDC DMA Backend DAI Links */
6529 {
6530 .name = LPASS_BE_RX_CDC_DMA_RX_0,
6531 .stream_name = "RX CDC DMA0 Playback",
6532 .cpu_dai_name = "msm-dai-cdc-dma-dev.45104",
6533 .platform_name = "msm-pcm-routing",
6534 .codec_name = "bolero_codec",
6535 .codec_dai_name = "rx_macro_rx1",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05306536 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006537 .no_pcm = 1,
6538 .dpcm_playback = 1,
6539 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_0,
6540 .be_hw_params_fixup = msm_be_hw_params_fixup,
6541 .ignore_pmdown_time = 1,
6542 .ignore_suspend = 1,
6543 .ops = &msm_cdc_dma_be_ops,
6544 },
6545 {
6546 .name = LPASS_BE_RX_CDC_DMA_RX_1,
6547 .stream_name = "RX CDC DMA1 Playback",
6548 .cpu_dai_name = "msm-dai-cdc-dma-dev.45106",
6549 .platform_name = "msm-pcm-routing",
6550 .codec_name = "bolero_codec",
6551 .codec_dai_name = "rx_macro_rx2",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05306552 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006553 .no_pcm = 1,
6554 .dpcm_playback = 1,
6555 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_1,
6556 .be_hw_params_fixup = msm_be_hw_params_fixup,
6557 .ignore_pmdown_time = 1,
6558 .ignore_suspend = 1,
6559 .ops = &msm_cdc_dma_be_ops,
6560 },
6561 {
6562 .name = LPASS_BE_RX_CDC_DMA_RX_2,
6563 .stream_name = "RX CDC DMA2 Playback",
6564 .cpu_dai_name = "msm-dai-cdc-dma-dev.45108",
6565 .platform_name = "msm-pcm-routing",
6566 .codec_name = "bolero_codec",
6567 .codec_dai_name = "rx_macro_rx3",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05306568 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006569 .no_pcm = 1,
6570 .dpcm_playback = 1,
6571 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_2,
6572 .be_hw_params_fixup = msm_be_hw_params_fixup,
6573 .ignore_pmdown_time = 1,
6574 .ignore_suspend = 1,
6575 .ops = &msm_cdc_dma_be_ops,
6576 },
6577 {
6578 .name = LPASS_BE_RX_CDC_DMA_RX_3,
6579 .stream_name = "RX CDC DMA3 Playback",
6580 .cpu_dai_name = "msm-dai-cdc-dma-dev.45110",
6581 .platform_name = "msm-pcm-routing",
6582 .codec_name = "bolero_codec",
6583 .codec_dai_name = "rx_macro_rx4",
Sudheer Papothiff2733c2019-05-17 01:49:27 +05306584 .dynamic_be = 1,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006585 .no_pcm = 1,
6586 .dpcm_playback = 1,
6587 .id = MSM_BACKEND_DAI_RX_CDC_DMA_RX_3,
6588 .be_hw_params_fixup = msm_be_hw_params_fixup,
6589 .ignore_pmdown_time = 1,
6590 .ignore_suspend = 1,
6591 .ops = &msm_cdc_dma_be_ops,
6592 },
6593 /* TX CDC DMA Backend DAI Links */
6594 {
6595 .name = LPASS_BE_TX_CDC_DMA_TX_3,
6596 .stream_name = "TX CDC DMA3 Capture",
6597 .cpu_dai_name = "msm-dai-cdc-dma-dev.45111",
6598 .platform_name = "msm-pcm-routing",
6599 .codec_name = "bolero_codec",
6600 .codec_dai_name = "tx_macro_tx1",
6601 .no_pcm = 1,
6602 .dpcm_capture = 1,
6603 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_3,
6604 .be_hw_params_fixup = msm_be_hw_params_fixup,
6605 .ignore_suspend = 1,
6606 .ops = &msm_cdc_dma_be_ops,
6607 },
6608 {
6609 .name = LPASS_BE_TX_CDC_DMA_TX_4,
6610 .stream_name = "TX CDC DMA4 Capture",
6611 .cpu_dai_name = "msm-dai-cdc-dma-dev.45113",
6612 .platform_name = "msm-pcm-routing",
6613 .codec_name = "bolero_codec",
6614 .codec_dai_name = "tx_macro_tx2",
6615 .no_pcm = 1,
6616 .dpcm_capture = 1,
6617 .id = MSM_BACKEND_DAI_TX_CDC_DMA_TX_4,
6618 .be_hw_params_fixup = msm_be_hw_params_fixup,
6619 .ignore_suspend = 1,
6620 .ops = &msm_cdc_dma_be_ops,
6621 },
6622};
6623
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08006624static struct snd_soc_dai_link msm_va_cdc_dma_be_dai_links[] = {
6625 {
6626 .name = LPASS_BE_VA_CDC_DMA_TX_0,
6627 .stream_name = "VA CDC DMA0 Capture",
6628 .cpu_dai_name = "msm-dai-cdc-dma-dev.45089",
6629 .platform_name = "msm-pcm-routing",
6630 .codec_name = "bolero_codec",
6631 .codec_dai_name = "va_macro_tx1",
6632 .no_pcm = 1,
6633 .dpcm_capture = 1,
6634 .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_0,
6635 .be_hw_params_fixup = msm_be_hw_params_fixup,
6636 .ignore_suspend = 1,
6637 .ops = &msm_cdc_dma_be_ops,
6638 },
6639 {
6640 .name = LPASS_BE_VA_CDC_DMA_TX_1,
6641 .stream_name = "VA CDC DMA1 Capture",
6642 .cpu_dai_name = "msm-dai-cdc-dma-dev.45091",
6643 .platform_name = "msm-pcm-routing",
6644 .codec_name = "bolero_codec",
6645 .codec_dai_name = "va_macro_tx2",
6646 .no_pcm = 1,
6647 .dpcm_capture = 1,
6648 .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_1,
6649 .be_hw_params_fixup = msm_be_hw_params_fixup,
6650 .ignore_suspend = 1,
6651 .ops = &msm_cdc_dma_be_ops,
6652 },
6653 {
6654 .name = LPASS_BE_VA_CDC_DMA_TX_2,
6655 .stream_name = "VA CDC DMA2 Capture",
6656 .cpu_dai_name = "msm-dai-cdc-dma-dev.45093",
6657 .platform_name = "msm-pcm-routing",
6658 .codec_name = "bolero_codec",
6659 .codec_dai_name = "va_macro_tx3",
6660 .no_pcm = 1,
6661 .dpcm_capture = 1,
6662 .id = MSM_BACKEND_DAI_VA_CDC_DMA_TX_2,
6663 .be_hw_params_fixup = msm_be_hw_params_fixup,
6664 .ignore_suspend = 1,
6665 .ops = &msm_cdc_dma_be_ops,
6666 },
6667};
6668
Meng Wange8e53822019-03-18 10:49:50 +08006669static struct snd_soc_dai_link msm_afe_rxtx_lb_be_dai_link[] = {
6670 {
6671 .name = LPASS_BE_AFE_LOOPBACK_TX,
6672 .stream_name = "AFE Loopback Capture",
6673 .cpu_dai_name = "msm-dai-q6-dev.24577",
6674 .platform_name = "msm-pcm-routing",
6675 .codec_name = "msm-stub-codec.1",
6676 .codec_dai_name = "msm-stub-tx",
6677 .no_pcm = 1,
6678 .dpcm_capture = 1,
6679 .id = MSM_BACKEND_DAI_AFE_LOOPBACK_TX,
6680 .be_hw_params_fixup = msm_be_hw_params_fixup,
6681 .ignore_pmdown_time = 1,
6682 .ignore_suspend = 1,
6683 },
6684};
6685
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006686static struct snd_soc_dai_link msm_kona_dai_links[
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006687 ARRAY_SIZE(msm_common_dai_links) +
6688 ARRAY_SIZE(msm_bolero_fe_dai_links) +
6689 ARRAY_SIZE(msm_common_misc_fe_dai_links) +
6690 ARRAY_SIZE(msm_common_be_dai_links) +
6691 ARRAY_SIZE(msm_mi2s_be_dai_links) +
6692 ARRAY_SIZE(msm_auxpcm_be_dai_links) +
6693 ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) +
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08006694 ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links) +
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006695 ARRAY_SIZE(msm_va_cdc_dma_be_dai_links) +
6696 ARRAY_SIZE(ext_disp_be_dai_link) +
Meng Wange8e53822019-03-18 10:49:50 +08006697 ARRAY_SIZE(msm_wcn_be_dai_links) +
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05306698 ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) +
6699 ARRAY_SIZE(msm_wcn_btfm_be_dai_links)];
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006700
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07006701static int msm_populate_dai_link_component_of_node(
6702 struct snd_soc_card *card)
6703{
6704 int i, index, ret = 0;
6705 struct device *cdev = card->dev;
6706 struct snd_soc_dai_link *dai_link = card->dai_link;
6707 struct device_node *np;
6708
6709 if (!cdev) {
6710 dev_err(cdev, "%s: Sound card device memory NULL\n", __func__);
6711 return -ENODEV;
6712 }
6713
6714 for (i = 0; i < card->num_links; i++) {
6715 if (dai_link[i].platform_of_node && dai_link[i].cpu_of_node)
6716 continue;
6717
6718 /* populate platform_of_node for snd card dai links */
6719 if (dai_link[i].platform_name &&
6720 !dai_link[i].platform_of_node) {
6721 index = of_property_match_string(cdev->of_node,
6722 "asoc-platform-names",
6723 dai_link[i].platform_name);
6724 if (index < 0) {
6725 dev_err(cdev, "%s: No match found for platform name: %s\n",
6726 __func__, dai_link[i].platform_name);
6727 ret = index;
6728 goto err;
6729 }
6730 np = of_parse_phandle(cdev->of_node, "asoc-platform",
6731 index);
6732 if (!np) {
6733 dev_err(cdev, "%s: retrieving phandle for platform %s, index %d failed\n",
6734 __func__, dai_link[i].platform_name,
6735 index);
6736 ret = -ENODEV;
6737 goto err;
6738 }
6739 dai_link[i].platform_of_node = np;
6740 dai_link[i].platform_name = NULL;
6741 }
6742
6743 /* populate cpu_of_node for snd card dai links */
6744 if (dai_link[i].cpu_dai_name && !dai_link[i].cpu_of_node) {
6745 index = of_property_match_string(cdev->of_node,
6746 "asoc-cpu-names",
6747 dai_link[i].cpu_dai_name);
6748 if (index >= 0) {
6749 np = of_parse_phandle(cdev->of_node, "asoc-cpu",
6750 index);
6751 if (!np) {
6752 dev_err(cdev, "%s: retrieving phandle for cpu dai %s failed\n",
6753 __func__,
6754 dai_link[i].cpu_dai_name);
6755 ret = -ENODEV;
6756 goto err;
6757 }
6758 dai_link[i].cpu_of_node = np;
6759 dai_link[i].cpu_dai_name = NULL;
6760 }
6761 }
6762
6763 /* populate codec_of_node for snd card dai links */
6764 if (dai_link[i].codec_name && !dai_link[i].codec_of_node) {
6765 index = of_property_match_string(cdev->of_node,
6766 "asoc-codec-names",
6767 dai_link[i].codec_name);
6768 if (index < 0)
6769 continue;
6770 np = of_parse_phandle(cdev->of_node, "asoc-codec",
6771 index);
6772 if (!np) {
6773 dev_err(cdev, "%s: retrieving phandle for codec %s failed\n",
6774 __func__, dai_link[i].codec_name);
6775 ret = -ENODEV;
6776 goto err;
6777 }
6778 dai_link[i].codec_of_node = np;
6779 dai_link[i].codec_name = NULL;
6780 }
6781 }
6782
6783err:
6784 return ret;
6785}
6786
6787static int msm_audrx_stub_init(struct snd_soc_pcm_runtime *rtd)
6788{
6789 int ret = -EINVAL;
6790 struct snd_soc_component *component = snd_soc_rtdcom_lookup(rtd, "msm-stub-codec");
6791
6792 if (!component) {
6793 pr_err("* %s: No match for msm-stub-codec component\n", __func__);
6794 return ret;
6795 }
6796
6797 ret = snd_soc_add_component_controls(component, msm_snd_controls,
6798 ARRAY_SIZE(msm_snd_controls));
6799 if (ret < 0) {
6800 dev_err(component->dev,
6801 "%s: add_codec_controls failed, err = %d\n",
6802 __func__, ret);
6803 return ret;
6804 }
6805
6806 return ret;
6807}
6808
6809static int msm_snd_stub_hw_params(struct snd_pcm_substream *substream,
6810 struct snd_pcm_hw_params *params)
6811{
6812 return 0;
6813}
6814
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07006815static struct snd_soc_ops msm_stub_be_ops = {
6816 .hw_params = msm_snd_stub_hw_params,
6817};
6818
6819struct snd_soc_card snd_soc_card_stub_msm = {
6820 .name = "kona-stub-snd-card",
6821};
6822
6823static struct snd_soc_dai_link msm_stub_fe_dai_links[] = {
6824 /* FrontEnd DAI Links */
6825 {
6826 .name = "MSMSTUB Media1",
6827 .stream_name = "MultiMedia1",
6828 .cpu_dai_name = "MultiMedia1",
6829 .platform_name = "msm-pcm-dsp.0",
6830 .dynamic = 1,
6831 .async_ops = ASYNC_DPCM_SND_SOC_PREPARE,
6832 .dpcm_playback = 1,
6833 .dpcm_capture = 1,
6834 .trigger = {SND_SOC_DPCM_TRIGGER_POST,
6835 SND_SOC_DPCM_TRIGGER_POST},
6836 .codec_dai_name = "snd-soc-dummy-dai",
6837 .codec_name = "snd-soc-dummy",
6838 .ignore_suspend = 1,
6839 /* this dainlink has playback support */
6840 .ignore_pmdown_time = 1,
6841 .id = MSM_FRONTEND_DAI_MULTIMEDIA1
6842 },
6843};
6844
6845static struct snd_soc_dai_link msm_stub_be_dai_links[] = {
6846 /* Backend DAI Links */
6847 {
6848 .name = LPASS_BE_AUXPCM_RX,
6849 .stream_name = "AUX PCM Playback",
6850 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
6851 .platform_name = "msm-pcm-routing",
6852 .codec_name = "msm-stub-codec.1",
6853 .codec_dai_name = "msm-stub-rx",
6854 .no_pcm = 1,
6855 .dpcm_playback = 1,
6856 .id = MSM_BACKEND_DAI_AUXPCM_RX,
6857 .init = &msm_audrx_stub_init,
6858 .be_hw_params_fixup = msm_be_hw_params_fixup,
6859 .ignore_pmdown_time = 1,
6860 .ignore_suspend = 1,
6861 .ops = &msm_stub_be_ops,
6862 },
6863 {
6864 .name = LPASS_BE_AUXPCM_TX,
6865 .stream_name = "AUX PCM Capture",
6866 .cpu_dai_name = "msm-dai-q6-auxpcm.1",
6867 .platform_name = "msm-pcm-routing",
6868 .codec_name = "msm-stub-codec.1",
6869 .codec_dai_name = "msm-stub-tx",
6870 .no_pcm = 1,
6871 .dpcm_capture = 1,
6872 .id = MSM_BACKEND_DAI_AUXPCM_TX,
6873 .be_hw_params_fixup = msm_be_hw_params_fixup,
6874 .ignore_suspend = 1,
6875 .ops = &msm_stub_be_ops,
6876 },
6877};
6878
6879static struct snd_soc_dai_link msm_stub_dai_links[
6880 ARRAY_SIZE(msm_stub_fe_dai_links) +
6881 ARRAY_SIZE(msm_stub_be_dai_links)];
6882
6883static const struct of_device_id kona_asoc_machine_of_match[] = {
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006884 { .compatible = "qcom,kona-asoc-snd",
6885 .data = "codec"},
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07006886 { .compatible = "qcom,kona-asoc-snd-stub",
6887 .data = "stub_codec"},
6888 {},
6889};
6890
6891static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
6892{
6893 struct snd_soc_card *card = NULL;
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006894 struct snd_soc_dai_link *dailink = NULL;
6895 int len_1 = 0;
6896 int len_2 = 0;
6897 int total_links = 0;
6898 int rc = 0;
6899 u32 mi2s_audio_intf = 0;
6900 u32 auxpcm_audio_intf = 0;
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006901 u32 val = 0;
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05306902 u32 wcn_btfm_intf = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07006903 const struct of_device_id *match;
6904
6905 match = of_match_node(kona_asoc_machine_of_match, dev->of_node);
6906 if (!match) {
6907 dev_err(dev, "%s: No DT match found for sound card\n",
6908 __func__);
6909 return NULL;
6910 }
6911
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006912 if (!strcmp(match->data, "codec")) {
6913 card = &snd_soc_card_kona_msm;
6914
6915 memcpy(msm_kona_dai_links + total_links,
6916 msm_common_dai_links,
6917 sizeof(msm_common_dai_links));
6918 total_links += ARRAY_SIZE(msm_common_dai_links);
6919
6920 memcpy(msm_kona_dai_links + total_links,
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006921 msm_bolero_fe_dai_links,
6922 sizeof(msm_bolero_fe_dai_links));
6923 total_links +=
6924 ARRAY_SIZE(msm_bolero_fe_dai_links);
6925
6926 memcpy(msm_kona_dai_links + total_links,
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006927 msm_common_misc_fe_dai_links,
6928 sizeof(msm_common_misc_fe_dai_links));
6929 total_links += ARRAY_SIZE(msm_common_misc_fe_dai_links);
6930
6931 memcpy(msm_kona_dai_links + total_links,
6932 msm_common_be_dai_links,
6933 sizeof(msm_common_be_dai_links));
6934 total_links += ARRAY_SIZE(msm_common_be_dai_links);
6935
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07006936 memcpy(msm_kona_dai_links + total_links,
6937 msm_wsa_cdc_dma_be_dai_links,
6938 sizeof(msm_wsa_cdc_dma_be_dai_links));
6939 total_links +=
6940 ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links);
6941
6942 memcpy(msm_kona_dai_links + total_links,
6943 msm_rx_tx_cdc_dma_be_dai_links,
6944 sizeof(msm_rx_tx_cdc_dma_be_dai_links));
6945 total_links +=
6946 ARRAY_SIZE(msm_rx_tx_cdc_dma_be_dai_links);
6947
Xiaoyu Ye2228bf02018-12-12 15:47:20 -08006948 memcpy(msm_kona_dai_links + total_links,
6949 msm_va_cdc_dma_be_dai_links,
6950 sizeof(msm_va_cdc_dma_be_dai_links));
6951 total_links +=
6952 ARRAY_SIZE(msm_va_cdc_dma_be_dai_links);
6953
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07006954 rc = of_property_read_u32(dev->of_node, "qcom,mi2s-audio-intf",
6955 &mi2s_audio_intf);
6956 if (rc) {
6957 dev_dbg(dev, "%s: No DT match MI2S audio interface\n",
6958 __func__);
6959 } else {
6960 if (mi2s_audio_intf) {
6961 memcpy(msm_kona_dai_links + total_links,
6962 msm_mi2s_be_dai_links,
6963 sizeof(msm_mi2s_be_dai_links));
6964 total_links +=
6965 ARRAY_SIZE(msm_mi2s_be_dai_links);
6966 }
6967 }
6968
6969 rc = of_property_read_u32(dev->of_node,
6970 "qcom,auxpcm-audio-intf",
6971 &auxpcm_audio_intf);
6972 if (rc) {
6973 dev_dbg(dev, "%s: No DT match Aux PCM interface\n",
6974 __func__);
6975 } else {
6976 if (auxpcm_audio_intf) {
6977 memcpy(msm_kona_dai_links + total_links,
6978 msm_auxpcm_be_dai_links,
6979 sizeof(msm_auxpcm_be_dai_links));
6980 total_links +=
6981 ARRAY_SIZE(msm_auxpcm_be_dai_links);
6982 }
6983 }
6984
Karthikeyan Manieaad2ed2018-12-26 11:47:26 -08006985 rc = of_property_read_u32(dev->of_node,
6986 "qcom,ext-disp-audio-rx", &val);
6987 if (!rc && val) {
6988 dev_dbg(dev, "%s(): ext disp audio support present\n",
6989 __func__);
6990 memcpy(msm_kona_dai_links + total_links,
6991 ext_disp_be_dai_link,
6992 sizeof(ext_disp_be_dai_link));
6993 total_links += ARRAY_SIZE(ext_disp_be_dai_link);
6994 }
6995
6996 rc = of_property_read_u32(dev->of_node, "qcom,wcn-bt", &val);
6997 if (!rc && val) {
6998 dev_dbg(dev, "%s(): WCN BT support present\n",
6999 __func__);
7000 memcpy(msm_kona_dai_links + total_links,
7001 msm_wcn_be_dai_links,
7002 sizeof(msm_wcn_be_dai_links));
7003 total_links += ARRAY_SIZE(msm_wcn_be_dai_links);
7004 }
7005
Meng Wange8e53822019-03-18 10:49:50 +08007006 rc = of_property_read_u32(dev->of_node, "qcom,afe-rxtx-lb",
7007 &val);
7008 if (!rc && val) {
7009 memcpy(msm_kona_dai_links + total_links,
7010 msm_afe_rxtx_lb_be_dai_link,
7011 sizeof(msm_afe_rxtx_lb_be_dai_link));
7012 total_links +=
7013 ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link);
7014 }
Vatsal Bucha82b30ba2019-04-17 12:43:54 +05307015
7016 rc = of_property_read_u32(dev->of_node, "qcom,wcn-btfm",
7017 &wcn_btfm_intf);
7018 if (rc) {
7019 dev_dbg(dev, "%s: No DT match wcn btfm interface\n",
7020 __func__);
7021 } else {
7022 if (wcn_btfm_intf) {
7023 memcpy(msm_kona_dai_links + total_links,
7024 msm_wcn_btfm_be_dai_links,
7025 sizeof(msm_wcn_btfm_be_dai_links));
7026 total_links +=
7027 ARRAY_SIZE(msm_wcn_btfm_be_dai_links);
7028 }
7029 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007030 dailink = msm_kona_dai_links;
7031 } else if(!strcmp(match->data, "stub_codec")) {
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007032 card = &snd_soc_card_stub_msm;
7033 len_1 = ARRAY_SIZE(msm_stub_fe_dai_links);
7034 len_2 = len_1 + ARRAY_SIZE(msm_stub_be_dai_links);
7035
7036 memcpy(msm_stub_dai_links,
7037 msm_stub_fe_dai_links,
7038 sizeof(msm_stub_fe_dai_links));
7039 memcpy(msm_stub_dai_links + len_1,
7040 msm_stub_be_dai_links,
7041 sizeof(msm_stub_be_dai_links));
7042
7043 dailink = msm_stub_dai_links;
7044 total_links = len_2;
7045 }
7046
7047 if (card) {
7048 card->dai_link = dailink;
7049 card->num_links = total_links;
7050 }
7051
7052 return card;
7053}
7054
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007055static int msm_wsa881x_init(struct snd_soc_component *component)
7056{
7057 u8 spkleft_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
7058 u8 spkright_ports[WSA881X_MAX_SWR_PORTS] = {0, 1, 2, 3};
7059 u8 spkleft_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_L, SPKR_L_COMP,
7060 SPKR_L_BOOST, SPKR_L_VI};
7061 u8 spkright_port_types[WSA881X_MAX_SWR_PORTS] = {SPKR_R, SPKR_R_COMP,
7062 SPKR_R_BOOST, SPKR_R_VI};
7063 unsigned int ch_rate[WSA881X_MAX_SWR_PORTS] = {2400, 600, 300, 1200};
7064 unsigned int ch_mask[WSA881X_MAX_SWR_PORTS] = {0x1, 0xF, 0x3, 0x3};
7065 struct msm_asoc_mach_data *pdata;
7066 struct snd_soc_dapm_context *dapm;
7067 struct snd_card *card;
7068 struct snd_info_entry *entry;
7069 int ret = 0;
7070
7071 if (!component) {
7072 pr_err("%s component is NULL\n", __func__);
7073 return -EINVAL;
7074 }
7075
7076 card = component->card->snd_card;
7077 dapm = snd_soc_component_get_dapm(component);
7078
7079 if (!strcmp(component->name_prefix, "SpkrLeft")) {
7080 dev_dbg(component->dev, "%s: setting left ch map to codec %s\n",
7081 __func__, component->name);
7082 wsa881x_set_channel_map(component, &spkleft_ports[0],
7083 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
7084 &ch_rate[0], &spkleft_port_types[0]);
7085 if (dapm->component) {
7086 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft IN");
7087 snd_soc_dapm_ignore_suspend(dapm, "SpkrLeft SPKR");
7088 }
7089 } else if (!strcmp(component->name_prefix, "SpkrRight")) {
7090 dev_dbg(component->dev, "%s: setting right ch map to codec %s\n",
7091 __func__, component->name);
7092 wsa881x_set_channel_map(component, &spkright_ports[0],
7093 WSA881X_MAX_SWR_PORTS, &ch_mask[0],
7094 &ch_rate[0], &spkright_port_types[0]);
7095 if (dapm->component) {
7096 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight IN");
7097 snd_soc_dapm_ignore_suspend(dapm, "SpkrRight SPKR");
7098 }
7099 } else {
7100 dev_err(component->dev, "%s: wrong codec name %s\n", __func__,
7101 component->name);
7102 ret = -EINVAL;
7103 goto err;
7104 }
7105 pdata = snd_soc_card_get_drvdata(component->card);
7106 if (!pdata->codec_root) {
7107 entry = snd_info_create_subdir(card->module, "codecs",
7108 card->proc_root);
7109 if (!entry) {
7110 pr_err("%s: Cannot create codecs module entry\n",
7111 __func__);
7112 ret = 0;
7113 goto err;
7114 }
7115 pdata->codec_root = entry;
7116 }
7117 wsa881x_codec_info_create_codec_entry(pdata->codec_root,
7118 component);
7119err:
7120 return ret;
7121}
7122
7123static int msm_aux_codec_init(struct snd_soc_component *component)
7124{
7125 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
7126 int ret = 0;
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007127 void *mbhc_calibration;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007128 struct snd_info_entry *entry;
7129 struct snd_card *card = component->card->snd_card;
7130 struct msm_asoc_mach_data *pdata;
7131
7132 snd_soc_dapm_ignore_suspend(dapm, "EAR");
7133 snd_soc_dapm_ignore_suspend(dapm, "AUX");
7134 snd_soc_dapm_ignore_suspend(dapm, "HPHL");
7135 snd_soc_dapm_ignore_suspend(dapm, "HPHR");
7136 snd_soc_dapm_ignore_suspend(dapm, "AMIC1");
7137 snd_soc_dapm_ignore_suspend(dapm, "AMIC2");
7138 snd_soc_dapm_ignore_suspend(dapm, "AMIC3");
7139 snd_soc_dapm_ignore_suspend(dapm, "AMIC4");
7140 snd_soc_dapm_sync(dapm);
7141
7142 pdata = snd_soc_card_get_drvdata(component->card);
7143 if (!pdata->codec_root) {
7144 entry = snd_info_create_subdir(card->module, "codecs",
7145 card->proc_root);
7146 if (!entry) {
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007147 dev_dbg(component->dev, "%s: Cannot create codecs module entry\n",
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007148 __func__);
7149 ret = 0;
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007150 goto mbhc_cfg_cal;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007151 }
7152 pdata->codec_root = entry;
7153 }
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007154 wcd938x_info_create_codec_entry(pdata->codec_root, component);
7155
7156mbhc_cfg_cal:
7157 mbhc_calibration = def_wcd_mbhc_cal();
7158 if (!mbhc_calibration)
7159 return -ENOMEM;
7160 wcd_mbhc_cfg.calibration = mbhc_calibration;
7161 ret = wcd938x_mbhc_hs_detect(component, &wcd_mbhc_cfg);
7162 if (ret) {
7163 dev_err(component->dev, "%s: mbhc hs detect failed, err:%d\n",
7164 __func__, ret);
7165 goto err_hs_detect;
7166 }
7167 return 0;
7168
7169err_hs_detect:
7170 kfree(mbhc_calibration);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007171 return ret;
7172}
7173
7174static int msm_init_aux_dev(struct platform_device *pdev,
7175 struct snd_soc_card *card)
7176{
7177 struct device_node *wsa_of_node;
7178 struct device_node *aux_codec_of_node;
7179 u32 wsa_max_devs;
7180 u32 wsa_dev_cnt;
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307181 u32 codec_max_aux_devs = 0;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007182 u32 codec_aux_dev_cnt = 0;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007183 int i;
7184 struct msm_wsa881x_dev_info *wsa881x_dev_info;
7185 struct aux_codec_dev_info *aux_cdc_dev_info;
7186 const char *auxdev_name_prefix[1];
7187 char *dev_name_str = NULL;
7188 int found = 0;
7189 int codecs_found = 0;
7190 int ret = 0;
7191
7192 /* Get maximum WSA device count for this platform */
7193 ret = of_property_read_u32(pdev->dev.of_node,
7194 "qcom,wsa-max-devs", &wsa_max_devs);
7195 if (ret) {
7196 dev_info(&pdev->dev,
7197 "%s: wsa-max-devs property missing in DT %s, ret = %d\n",
7198 __func__, pdev->dev.of_node->full_name, ret);
7199 wsa_max_devs = 0;
7200 goto codec_aux_dev;
7201 }
7202 if (wsa_max_devs == 0) {
7203 dev_warn(&pdev->dev,
7204 "%s: Max WSA devices is 0 for this target?\n",
7205 __func__);
7206 goto codec_aux_dev;
7207 }
7208
7209 /* Get count of WSA device phandles for this platform */
7210 wsa_dev_cnt = of_count_phandle_with_args(pdev->dev.of_node,
7211 "qcom,wsa-devs", NULL);
7212 if (wsa_dev_cnt == -ENOENT) {
7213 dev_warn(&pdev->dev, "%s: No wsa device defined in DT.\n",
7214 __func__);
7215 goto err;
7216 } else if (wsa_dev_cnt <= 0) {
7217 dev_err(&pdev->dev,
7218 "%s: Error reading wsa device from DT. wsa_dev_cnt = %d\n",
7219 __func__, wsa_dev_cnt);
7220 ret = -EINVAL;
7221 goto err;
7222 }
7223
7224 /*
7225 * Expect total phandles count to be NOT less than maximum possible
7226 * WSA count. However, if it is less, then assign same value to
7227 * max count as well.
7228 */
7229 if (wsa_dev_cnt < wsa_max_devs) {
7230 dev_dbg(&pdev->dev,
7231 "%s: wsa_max_devs = %d cannot exceed wsa_dev_cnt = %d\n",
7232 __func__, wsa_max_devs, wsa_dev_cnt);
7233 wsa_max_devs = wsa_dev_cnt;
7234 }
7235
7236 /* Make sure prefix string passed for each WSA device */
7237 ret = of_property_count_strings(pdev->dev.of_node,
7238 "qcom,wsa-aux-dev-prefix");
7239 if (ret != wsa_dev_cnt) {
7240 dev_err(&pdev->dev,
7241 "%s: expecting %d wsa prefix. Defined only %d in DT\n",
7242 __func__, wsa_dev_cnt, ret);
7243 ret = -EINVAL;
7244 goto err;
7245 }
7246
7247 /*
7248 * Alloc mem to store phandle and index info of WSA device, if already
7249 * registered with ALSA core
7250 */
7251 wsa881x_dev_info = devm_kcalloc(&pdev->dev, wsa_max_devs,
7252 sizeof(struct msm_wsa881x_dev_info),
7253 GFP_KERNEL);
7254 if (!wsa881x_dev_info) {
7255 ret = -ENOMEM;
7256 goto err;
7257 }
7258
7259 /*
7260 * search and check whether all WSA devices are already
7261 * registered with ALSA core or not. If found a node, store
7262 * the node and the index in a local array of struct for later
7263 * use.
7264 */
7265 for (i = 0; i < wsa_dev_cnt; i++) {
7266 wsa_of_node = of_parse_phandle(pdev->dev.of_node,
7267 "qcom,wsa-devs", i);
7268 if (unlikely(!wsa_of_node)) {
7269 /* we should not be here */
7270 dev_err(&pdev->dev,
7271 "%s: wsa dev node is not present\n",
7272 __func__);
7273 ret = -EINVAL;
7274 goto err;
7275 }
7276 if (soc_find_component(wsa_of_node, NULL)) {
7277 /* WSA device registered with ALSA core */
7278 wsa881x_dev_info[found].of_node = wsa_of_node;
7279 wsa881x_dev_info[found].index = i;
7280 found++;
7281 if (found == wsa_max_devs)
7282 break;
7283 }
7284 }
7285
7286 if (found < wsa_max_devs) {
7287 dev_dbg(&pdev->dev,
7288 "%s: failed to find %d components. Found only %d\n",
7289 __func__, wsa_max_devs, found);
7290 return -EPROBE_DEFER;
7291 }
7292 dev_info(&pdev->dev,
7293 "%s: found %d wsa881x devices registered with ALSA core\n",
7294 __func__, found);
7295
7296codec_aux_dev:
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307297 /* Get maximum aux codec device count for this platform */
7298 ret = of_property_read_u32(pdev->dev.of_node,
7299 "qcom,codec-max-aux-devs",
7300 &codec_max_aux_devs);
7301 if (ret) {
7302 dev_err(&pdev->dev,
7303 "%s: codec-max-aux-devs property missing in DT %s, ret = %d\n",
7304 __func__, pdev->dev.of_node->full_name, ret);
7305 codec_max_aux_devs = 0;
7306 goto aux_dev_register;
7307 }
7308 if (codec_max_aux_devs == 0) {
7309 dev_dbg(&pdev->dev,
7310 "%s: Max aux codec devices is 0 for this target?\n",
7311 __func__);
7312 goto aux_dev_register;
7313 }
7314
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007315 /* Get count of aux codec device phandles for this platform */
7316 codec_aux_dev_cnt = of_count_phandle_with_args(
7317 pdev->dev.of_node,
7318 "qcom,codec-aux-devs", NULL);
7319 if (codec_aux_dev_cnt == -ENOENT) {
7320 dev_warn(&pdev->dev, "%s: No aux codec defined in DT.\n",
7321 __func__);
7322 goto err;
7323 } else if (codec_aux_dev_cnt <= 0) {
7324 dev_err(&pdev->dev,
7325 "%s: Error reading aux codec device from DT, dev_cnt=%d\n",
7326 __func__, codec_aux_dev_cnt);
7327 ret = -EINVAL;
7328 goto err;
7329 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007330
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007331 /*
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307332 * Expect total phandles count to be NOT less than maximum possible
7333 * AUX device count. However, if it is less, then assign same value to
7334 * max count as well.
7335 */
7336 if (codec_aux_dev_cnt < codec_max_aux_devs) {
7337 dev_dbg(&pdev->dev,
7338 "%s: codec_max_aux_devs = %d cannot exceed codec_aux_dev_cnt = %d\n",
7339 __func__, codec_max_aux_devs,
7340 codec_aux_dev_cnt);
7341 codec_max_aux_devs = codec_aux_dev_cnt;
7342 }
7343
7344 /*
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007345 * Alloc mem to store phandle and index info of aux codec
7346 * if already registered with ALSA core
7347 */
7348 aux_cdc_dev_info = devm_kcalloc(&pdev->dev, codec_aux_dev_cnt,
7349 sizeof(struct aux_codec_dev_info),
7350 GFP_KERNEL);
7351 if (!aux_cdc_dev_info) {
7352 ret = -ENOMEM;
7353 goto err;
7354 }
7355
7356 /*
7357 * search and check whether all aux codecs are already
7358 * registered with ALSA core or not. If found a node, store
7359 * the node and the index in a local array of struct for later
7360 * use.
7361 */
7362 for (i = 0; i < codec_aux_dev_cnt; i++) {
7363 aux_codec_of_node = of_parse_phandle(pdev->dev.of_node,
7364 "qcom,codec-aux-devs", i);
7365 if (unlikely(!aux_codec_of_node)) {
7366 /* we should not be here */
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007367 dev_err(&pdev->dev,
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007368 "%s: aux codec dev node is not present\n",
7369 __func__);
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007370 ret = -EINVAL;
7371 goto err;
7372 }
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007373 if (soc_find_component(aux_codec_of_node, NULL)) {
7374 /* AUX codec registered with ALSA core */
7375 aux_cdc_dev_info[codecs_found].of_node =
7376 aux_codec_of_node;
7377 aux_cdc_dev_info[codecs_found].index = i;
7378 codecs_found++;
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007379 }
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007380 }
7381
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007382 if (codecs_found < codec_aux_dev_cnt) {
7383 dev_dbg(&pdev->dev,
7384 "%s: failed to find %d components. Found only %d\n",
7385 __func__, codec_aux_dev_cnt, codecs_found);
7386 return -EPROBE_DEFER;
7387 }
7388 dev_info(&pdev->dev,
7389 "%s: found %d AUX codecs registered with ALSA core\n",
7390 __func__, codecs_found);
7391
Sudheer Papothid6d524d2019-06-19 02:31:11 +05307392aux_dev_register:
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007393 card->num_aux_devs = wsa_max_devs + codec_aux_dev_cnt;
7394 card->num_configs = wsa_max_devs + codec_aux_dev_cnt;
7395
7396 /* Alloc array of AUX devs struct */
7397 msm_aux_dev = devm_kcalloc(&pdev->dev, card->num_aux_devs,
7398 sizeof(struct snd_soc_aux_dev),
7399 GFP_KERNEL);
7400 if (!msm_aux_dev) {
7401 ret = -ENOMEM;
7402 goto err;
7403 }
7404
7405 /* Alloc array of codec conf struct */
7406 msm_codec_conf = devm_kcalloc(&pdev->dev, card->num_configs,
7407 sizeof(struct snd_soc_codec_conf),
7408 GFP_KERNEL);
7409 if (!msm_codec_conf) {
7410 ret = -ENOMEM;
7411 goto err;
7412 }
7413
7414 for (i = 0; i < wsa_max_devs; i++) {
7415 dev_name_str = devm_kzalloc(&pdev->dev, DEV_NAME_STR_LEN,
7416 GFP_KERNEL);
7417 if (!dev_name_str) {
7418 ret = -ENOMEM;
7419 goto err;
7420 }
7421
7422 ret = of_property_read_string_index(pdev->dev.of_node,
7423 "qcom,wsa-aux-dev-prefix",
7424 wsa881x_dev_info[i].index,
7425 auxdev_name_prefix);
7426 if (ret) {
7427 dev_err(&pdev->dev,
7428 "%s: failed to read wsa aux dev prefix, ret = %d\n",
7429 __func__, ret);
7430 ret = -EINVAL;
7431 goto err;
7432 }
7433
7434 snprintf(dev_name_str, strlen("wsa881x.%d"), "wsa881x.%d", i);
7435 msm_aux_dev[i].name = dev_name_str;
7436 msm_aux_dev[i].codec_name = NULL;
7437 msm_aux_dev[i].codec_of_node =
7438 wsa881x_dev_info[i].of_node;
7439 msm_aux_dev[i].init = msm_wsa881x_init;
7440 msm_codec_conf[i].dev_name = NULL;
7441 msm_codec_conf[i].name_prefix = auxdev_name_prefix[0];
7442 msm_codec_conf[i].of_node =
7443 wsa881x_dev_info[i].of_node;
7444 }
7445
7446 for (i = 0; i < codec_aux_dev_cnt; i++) {
7447 msm_aux_dev[wsa_max_devs + i].name = NULL;
7448 msm_aux_dev[wsa_max_devs + i].codec_name = NULL;
7449 msm_aux_dev[wsa_max_devs + i].codec_of_node =
7450 aux_cdc_dev_info[i].of_node;
7451 msm_aux_dev[wsa_max_devs + i].init = msm_aux_codec_init;
7452 msm_codec_conf[wsa_max_devs + i].dev_name = NULL;
7453 msm_codec_conf[wsa_max_devs + i].name_prefix =
7454 NULL;
7455 msm_codec_conf[wsa_max_devs + i].of_node =
7456 aux_cdc_dev_info[i].of_node;
7457 }
7458
7459 card->codec_conf = msm_codec_conf;
7460 card->aux_dev = msm_aux_dev;
7461err:
7462 return ret;
7463}
7464
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007465static void msm_i2s_auxpcm_init(struct platform_device *pdev)
7466{
7467 int count = 0;
7468 u32 mi2s_master_slave[MI2S_MAX];
7469 int ret = 0;
7470
7471 for (count = 0; count < MI2S_MAX; count++) {
7472 mutex_init(&mi2s_intf_conf[count].lock);
7473 mi2s_intf_conf[count].ref_cnt = 0;
7474 }
7475
7476 ret = of_property_read_u32_array(pdev->dev.of_node,
7477 "qcom,msm-mi2s-master",
7478 mi2s_master_slave, MI2S_MAX);
7479 if (ret) {
7480 dev_dbg(&pdev->dev, "%s: no qcom,msm-mi2s-master in DT node\n",
7481 __func__);
7482 } else {
7483 for (count = 0; count < MI2S_MAX; count++) {
7484 mi2s_intf_conf[count].msm_is_mi2s_master =
7485 mi2s_master_slave[count];
7486 }
7487 }
7488}
7489
7490static void msm_i2s_auxpcm_deinit(void)
7491{
7492 int count = 0;
7493
7494 for (count = 0; count < MI2S_MAX; count++) {
7495 mutex_destroy(&mi2s_intf_conf[count].lock);
7496 mi2s_intf_conf[count].ref_cnt = 0;
7497 mi2s_intf_conf[count].msm_is_mi2s_master = 0;
7498 }
7499}
7500
7501static int kona_ssr_enable(struct device *dev, void *data)
7502{
7503 struct platform_device *pdev = to_platform_device(dev);
7504 struct snd_soc_card *card = platform_get_drvdata(pdev);
7505 int ret = 0;
7506
7507 if (!card) {
7508 dev_err(dev, "%s: card is NULL\n", __func__);
7509 ret = -EINVAL;
7510 goto err;
7511 }
7512
7513 if (!strcmp(card->name, "kona-stub-snd-card")) {
7514 /* TODO */
7515 dev_dbg(dev, "%s: TODO \n", __func__);
7516 }
7517
7518 snd_soc_card_change_online_state(card, 1);
7519 dev_dbg(dev, "%s: setting snd_card to ONLINE\n", __func__);
7520
7521err:
7522 return ret;
7523}
7524
7525static void kona_ssr_disable(struct device *dev, void *data)
7526{
7527 struct platform_device *pdev = to_platform_device(dev);
7528 struct snd_soc_card *card = platform_get_drvdata(pdev);
7529
7530 if (!card) {
7531 dev_err(dev, "%s: card is NULL\n", __func__);
7532 return;
7533 }
7534
7535 dev_dbg(dev, "%s: setting snd_card to OFFLINE\n", __func__);
7536 snd_soc_card_change_online_state(card, 0);
7537
7538 if (!strcmp(card->name, "kona-stub-snd-card")) {
7539 /* TODO */
7540 dev_dbg(dev, "%s: TODO \n", __func__);
7541 }
7542}
7543
7544static const struct snd_event_ops kona_ssr_ops = {
7545 .enable = kona_ssr_enable,
7546 .disable = kona_ssr_disable,
7547};
7548
7549static int msm_audio_ssr_compare(struct device *dev, void *data)
7550{
7551 struct device_node *node = data;
7552
7553 dev_dbg(dev, "%s: dev->of_node = 0x%p, node = 0x%p\n",
7554 __func__, dev->of_node, node);
7555 return (dev->of_node && dev->of_node == node);
7556}
7557
7558static int msm_audio_ssr_register(struct device *dev)
7559{
7560 struct device_node *np = dev->of_node;
7561 struct snd_event_clients *ssr_clients = NULL;
7562 struct device_node *node = NULL;
7563 int ret = 0;
7564 int i = 0;
7565
7566 for (i = 0; ; i++) {
7567 node = of_parse_phandle(np, "qcom,msm_audio_ssr_devs", i);
7568 if (!node)
7569 break;
7570 snd_event_mstr_add_client(&ssr_clients,
7571 msm_audio_ssr_compare, node);
7572 }
7573
7574 ret = snd_event_master_register(dev, &kona_ssr_ops,
7575 ssr_clients, NULL);
7576 if (!ret)
7577 snd_event_notify(dev, SND_EVENT_UP);
7578
7579 return ret;
7580}
7581
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007582static int msm_asoc_machine_probe(struct platform_device *pdev)
7583{
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007584 struct snd_soc_card *card = NULL;
7585 struct msm_asoc_mach_data *pdata = NULL;
7586 const char *mbhc_audio_jack_type = NULL;
7587 int ret = 0;
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08007588 uint index = 0;
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007589
7590 if (!pdev->dev.of_node) {
7591 dev_err(&pdev->dev, "%s: No platform supplied from device tree\n", __func__);
7592 return -EINVAL;
7593 }
7594
7595 pdata = devm_kzalloc(&pdev->dev,
7596 sizeof(struct msm_asoc_mach_data), GFP_KERNEL);
7597 if (!pdata)
7598 return -ENOMEM;
7599
7600 card = populate_snd_card_dailinks(&pdev->dev);
7601 if (!card) {
7602 dev_err(&pdev->dev, "%s: Card uninitialized\n", __func__);
7603 ret = -EINVAL;
7604 goto err;
7605 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007606
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007607 card->dev = &pdev->dev;
7608 platform_set_drvdata(pdev, card);
7609 snd_soc_card_set_drvdata(card, pdata);
7610
7611 ret = snd_soc_of_parse_card_name(card, "qcom,model");
7612 if (ret) {
7613 dev_err(&pdev->dev, "%s: parse card name failed, err:%d\n",
7614 __func__, ret);
7615 goto err;
7616 }
7617
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007618 ret = snd_soc_of_parse_audio_routing(card, "qcom,audio-routing");
7619 if (ret) {
7620 dev_err(&pdev->dev, "%s: parse audio routing failed, err:%d\n",
7621 __func__, ret);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007622 goto err;
7623 }
7624
7625 ret = msm_populate_dai_link_component_of_node(card);
7626 if (ret) {
7627 ret = -EPROBE_DEFER;
7628 goto err;
7629 }
7630
Vignesh Kulothungan3e5ebbf2018-10-23 12:19:13 -07007631 ret = msm_init_aux_dev(pdev, card);
7632 if (ret)
7633 goto err;
7634
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007635 ret = devm_snd_soc_register_card(&pdev->dev, card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007636 if (ret == -EPROBE_DEFER) {
7637 if (codec_reg_done)
7638 ret = -EINVAL;
7639 goto err;
7640 } else if (ret) {
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007641 dev_err(&pdev->dev, "%s: snd_soc_register_card failed (%d)\n",
7642 __func__, ret);
7643 goto err;
7644 }
7645 dev_info(&pdev->dev, "%s: Sound card %s registered\n",
7646 __func__, card->name);
7647
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007648 pdata->hph_en1_gpio_p = of_parse_phandle(pdev->dev.of_node,
7649 "qcom,hph-en1-gpio", 0);
7650 if (!pdata->hph_en1_gpio_p) {
7651 dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n",
7652 __func__, "qcom,hph-en1-gpio",
7653 pdev->dev.of_node->full_name);
7654 }
7655
7656 pdata->hph_en0_gpio_p = of_parse_phandle(pdev->dev.of_node,
7657 "qcom,hph-en0-gpio", 0);
7658 if (!pdata->hph_en0_gpio_p) {
7659 dev_dbg(&pdev->dev, "%s: property %s not detected in node %s\n",
7660 __func__, "qcom,hph-en0-gpio",
7661 pdev->dev.of_node->full_name);
7662 }
7663
7664 ret = of_property_read_string(pdev->dev.of_node,
7665 "qcom,mbhc-audio-jack-type", &mbhc_audio_jack_type);
7666 if (ret) {
7667 dev_dbg(&pdev->dev, "%s: Looking up %s property in node %s failed\n",
7668 __func__, "qcom,mbhc-audio-jack-type",
7669 pdev->dev.of_node->full_name);
7670 dev_dbg(&pdev->dev, "Jack type properties set to default\n");
7671 } else {
7672 if (!strcmp(mbhc_audio_jack_type, "4-pole-jack")) {
7673 wcd_mbhc_cfg.enable_anc_mic_detect = false;
7674 dev_dbg(&pdev->dev, "This hardware has 4 pole jack");
7675 } else if (!strcmp(mbhc_audio_jack_type, "5-pole-jack")) {
7676 wcd_mbhc_cfg.enable_anc_mic_detect = true;
7677 dev_dbg(&pdev->dev, "This hardware has 5 pole jack");
7678 } else if (!strcmp(mbhc_audio_jack_type, "6-pole-jack")) {
7679 wcd_mbhc_cfg.enable_anc_mic_detect = true;
7680 dev_dbg(&pdev->dev, "This hardware has 6 pole jack");
7681 } else {
7682 wcd_mbhc_cfg.enable_anc_mic_detect = false;
7683 dev_dbg(&pdev->dev, "Unknown value, set to default\n");
7684 }
7685 }
Karthikeyan Mani5eb13422018-11-05 13:49:17 -08007686 /*
7687 * Parse US-Euro gpio info from DT. Report no error if us-euro
7688 * entry is not found in DT file as some targets do not support
7689 * US-Euro detection
7690 */
7691 pdata->us_euro_gpio_p = of_parse_phandle(pdev->dev.of_node,
7692 "qcom,us-euro-gpios", 0);
7693 if (!pdata->us_euro_gpio_p) {
7694 dev_dbg(&pdev->dev, "property %s not detected in node %s",
7695 "qcom,us-euro-gpios", pdev->dev.of_node->full_name);
7696 } else {
7697 dev_dbg(&pdev->dev, "%s detected\n",
7698 "qcom,us-euro-gpios");
7699 wcd_mbhc_cfg.swap_gnd_mic = msm_swap_gnd_mic;
7700 }
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007701
Meng Wanga60b4082019-02-25 17:02:23 +08007702 if (wcd_mbhc_cfg.enable_usbc_analog)
7703 wcd_mbhc_cfg.swap_gnd_mic = msm_usbc_swap_gnd_mic;
7704
7705 pdata->fsa_handle = of_parse_phandle(pdev->dev.of_node,
7706 "fsa4480-i2c-handle", 0);
7707 if (!pdata->fsa_handle)
7708 dev_dbg(&pdev->dev, "property %s not detected in node %s\n",
7709 "fsa4480-i2c-handle", pdev->dev.of_node->full_name);
7710
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007711 msm_i2s_auxpcm_init(pdev);
Karthikeyan Mani1a111b92019-02-12 21:35:31 -08007712 pdata->dmic01_gpio_p = of_parse_phandle(pdev->dev.of_node,
7713 "qcom,cdc-dmic01-gpios",
7714 0);
7715 pdata->dmic23_gpio_p = of_parse_phandle(pdev->dev.of_node,
7716 "qcom,cdc-dmic23-gpios",
7717 0);
7718 pdata->dmic45_gpio_p = of_parse_phandle(pdev->dev.of_node,
7719 "qcom,cdc-dmic45-gpios",
7720 0);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007721
Karthikeyan Mani12dcf642019-01-29 11:21:15 -08007722 pdata->mi2s_gpio_p[PRIM_MI2S] = of_parse_phandle(pdev->dev.of_node,
7723 "qcom,pri-mi2s-gpios", 0);
7724 pdata->mi2s_gpio_p[SEC_MI2S] = of_parse_phandle(pdev->dev.of_node,
7725 "qcom,sec-mi2s-gpios", 0);
7726 pdata->mi2s_gpio_p[TERT_MI2S] = of_parse_phandle(pdev->dev.of_node,
7727 "qcom,tert-mi2s-gpios", 0);
7728 pdata->mi2s_gpio_p[QUAT_MI2S] = of_parse_phandle(pdev->dev.of_node,
7729 "qcom,quat-mi2s-gpios", 0);
7730 pdata->mi2s_gpio_p[QUIN_MI2S] = of_parse_phandle(pdev->dev.of_node,
7731 "qcom,quin-mi2s-gpios", 0);
7732 pdata->mi2s_gpio_p[SEN_MI2S] = of_parse_phandle(pdev->dev.of_node,
7733 "qcom,sen-mi2s-gpios", 0);
7734 for (index = PRIM_MI2S; index < MI2S_MAX; index++)
7735 atomic_set(&(pdata->mi2s_gpio_ref_count[index]), 0);
7736
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007737 ret = msm_audio_ssr_register(&pdev->dev);
7738 if (ret)
7739 pr_err("%s: Registration with SND event FWK failed ret = %d\n",
7740 __func__, ret);
7741
7742 is_initial_boot = true;
7743
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007744 return 0;
7745err:
7746 devm_kfree(&pdev->dev, pdata);
7747 return ret;
7748}
7749
7750static int msm_asoc_machine_remove(struct platform_device *pdev)
7751{
7752 struct snd_soc_card *card = platform_get_drvdata(pdev);
7753
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007754 snd_event_master_deregister(&pdev->dev);
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007755 snd_soc_unregister_card(card);
Vignesh Kulothungan483a5592018-10-19 15:00:08 -07007756 msm_i2s_auxpcm_deinit();
7757
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007758 return 0;
7759}
7760
7761static struct platform_driver kona_asoc_machine_driver = {
7762 .driver = {
7763 .name = DRV_NAME,
7764 .owner = THIS_MODULE,
7765 .pm = &snd_soc_pm_ops,
7766 .of_match_table = kona_asoc_machine_of_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08007767 .suppress_bind_attrs = true,
Vignesh Kulothungane9abcd02018-10-01 15:55:25 -07007768 },
7769 .probe = msm_asoc_machine_probe,
7770 .remove = msm_asoc_machine_remove,
7771};
7772module_platform_driver(kona_asoc_machine_driver);
7773
7774MODULE_DESCRIPTION("ALSA SoC msm");
7775MODULE_LICENSE("GPL v2");
7776MODULE_ALIAS("platform:" DRV_NAME);
7777MODULE_DEVICE_TABLE(of, kona_asoc_machine_of_match);