blob: 67ee8e4eb5e8a5725bccb7e95327dc376dde0609 [file] [log] [blame]
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001/* Copyright (c) 2012, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13
14#include <linux/init.h>
15#include <linux/err.h>
16#include <linux/module.h>
17#include <linux/moduleparam.h>
18#include <linux/platform_device.h>
19#include <linux/bitops.h>
20#include <linux/mutex.h>
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -070021#include <linux/of_device.h>
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070022#include <sound/core.h>
23#include <sound/soc.h>
24#include <sound/soc-dapm.h>
25#include <sound/pcm.h>
26#include <sound/initval.h>
27#include <sound/control.h>
28#include <sound/q6adm-v2.h>
29#include <sound/q6asm-v2.h>
30#include <sound/q6afe-v2.h>
31#include <sound/tlv.h>
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070032
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070033#include "msm-pcm-routing-v2.h"
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070034#include "q6voice.h"
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070035
36struct msm_pcm_routing_bdai_data {
37 u16 port_id; /* AFE port ID */
38 u8 active; /* track if this backend is enabled */
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070039 unsigned long fe_sessions; /* Front-end sessions */
40 unsigned long port_sessions; /* track Tx BE ports -> Rx BE */
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070041 unsigned int sample_rate;
42 unsigned int channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070043};
44
45#define INVALID_SESSION -1
46#define SESSION_TYPE_RX 0
47#define SESSION_TYPE_TX 1
48
49static struct mutex routing_lock;
50
51static int fm_switch_enable;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070052static int fm_pcmrx_switch_enable;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070053
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070054#define INT_RX_VOL_MAX_STEPS 0x2000
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070055#define INT_RX_VOL_GAIN 0x2000
56
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070057static int msm_route_fm_vol_control;
58static const DECLARE_TLV_DB_LINEAR(fm_rx_vol_gain, 0,
59 INT_RX_VOL_MAX_STEPS);
60
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070061static int msm_route_lpa_vol_control;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070062static const DECLARE_TLV_DB_LINEAR(lpa_rx_vol_gain, 0,
63 INT_RX_VOL_MAX_STEPS);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070064
65static int msm_route_multimedia2_vol_control;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070066static const DECLARE_TLV_DB_LINEAR(multimedia2_rx_vol_gain, 0,
67 INT_RX_VOL_MAX_STEPS);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070068
69static int msm_route_compressed_vol_control;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070070static const DECLARE_TLV_DB_LINEAR(compressed_rx_vol_gain, 0,
71 INT_RX_VOL_MAX_STEPS);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070072
73
74
75/* Equal to Frontend after last of the MULTIMEDIA SESSIONS */
76#define MAX_EQ_SESSIONS MSM_FRONTEND_DAI_CS_VOICE
77
78enum {
79 EQ_BAND1 = 0,
80 EQ_BAND2,
81 EQ_BAND3,
82 EQ_BAND4,
83 EQ_BAND5,
84 EQ_BAND6,
85 EQ_BAND7,
86 EQ_BAND8,
87 EQ_BAND9,
88 EQ_BAND10,
89 EQ_BAND11,
90 EQ_BAND12,
91 EQ_BAND_MAX,
92};
93
94struct msm_audio_eq_band {
95 uint16_t band_idx; /* The band index, 0 .. 11 */
96 uint32_t filter_type; /* Filter band type */
97 uint32_t center_freq_hz; /* Filter band center frequency */
98 uint32_t filter_gain; /* Filter band initial gain (dB) */
99 /* Range is +12 dB to -12 dB with 1dB increments. */
100 uint32_t q_factor;
101} __packed;
102
103struct msm_audio_eq_stream_config {
104 uint32_t enable; /* Number of consequtive bands specified */
105 uint32_t num_bands;
106 struct msm_audio_eq_band eq_bands[EQ_BAND_MAX];
107} __packed;
108
109struct msm_audio_eq_stream_config eq_data[MAX_EQ_SESSIONS];
110
111static void msm_send_eq_values(int eq_idx);
112/* This array is indexed by back-end DAI ID defined in msm-pcm-routing.h
113 * If new back-end is defined, add new back-end DAI ID at the end of enum
114 */
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700115#define SLIMBUS_EXTPROC_RX AFE_PORT_INVALID
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700116static struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700117 { PRIMARY_I2S_RX, 0, 0, 0, 0, 0},
118 { PRIMARY_I2S_TX, 0, 0, 0, 0, 0},
119 { SLIMBUS_0_RX, 0, 0, 0, 0, 0},
120 { SLIMBUS_0_TX, 0, 0, 0, 0, 0},
121 { HDMI_RX, 0, 0, 0, 0, 0},
122 { INT_BT_SCO_RX, 0, 0, 0, 0, 0},
123 { INT_BT_SCO_TX, 0, 0, 0, 0, 0},
124 { INT_FM_RX, 0, 0, 0, 0, 0},
125 { INT_FM_TX, 0, 0, 0, 0, 0},
126 { RT_PROXY_PORT_001_RX, 0, 0, 0, 0, 0},
127 { RT_PROXY_PORT_001_TX, 0, 0, 0, 0, 0},
128 { PCM_RX, 0, 0, 0, 0, 0},
129 { PCM_TX, 0, 0, 0, 0, 0},
130 { VOICE_PLAYBACK_TX, 0, 0, 0, 0, 0},
131 { VOICE_RECORD_RX, 0, 0, 0, 0, 0},
132 { VOICE_RECORD_TX, 0, 0, 0, 0, 0},
133 { MI2S_RX, 0, 0, 0, 0, 0},
134 { MI2S_TX, 0, 0, 0, 0},
135 { SECONDARY_I2S_RX, 0, 0, 0, 0, 0},
136 { SLIMBUS_1_RX, 0, 0, 0, 0, 0},
137 { SLIMBUS_1_TX, 0, 0, 0, 0, 0},
138 { SLIMBUS_4_RX, 0, 0, 0, 0, 0},
139 { SLIMBUS_4_TX, 0, 0, 0, 0, 0},
140 { SLIMBUS_3_RX, 0, 0, 0, 0, 0},
141 { SLIMBUS_EXTPROC_RX, 0, 0, 0, 0, 0},
142 { SLIMBUS_EXTPROC_RX, 0, 0, 0, 0, 0},
143 { SLIMBUS_EXTPROC_RX, 0, 0, 0, 0, 0},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700144};
145
146
147/* Track ASM playback & capture sessions of DAI */
148static int fe_dai_map[MSM_FRONTEND_DAI_MM_SIZE][2] = {
149 /* MULTIMEDIA1 */
150 {INVALID_SESSION, INVALID_SESSION},
151 /* MULTIMEDIA2 */
152 {INVALID_SESSION, INVALID_SESSION},
153 /* MULTIMEDIA3 */
154 {INVALID_SESSION, INVALID_SESSION},
155 /* MULTIMEDIA4 */
156 {INVALID_SESSION, INVALID_SESSION},
157};
158
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700159static uint8_t is_be_dai_extproc(int be_dai)
160{
161 if (be_dai == MSM_BACKEND_DAI_EXTPROC_RX ||
162 be_dai == MSM_BACKEND_DAI_EXTPROC_TX ||
163 be_dai == MSM_BACKEND_DAI_EXTPROC_EC_TX)
164 return 1;
165 else
166 return 0;
167}
168
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700169static void msm_pcm_routing_build_matrix(int fedai_id, int dspst_id,
170 int path_type)
171{
172 int i, port_type;
173 struct route_payload payload;
174
175 payload.num_copps = 0;
176 port_type = (path_type == ADM_PATH_PLAYBACK ?
177 MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX);
178
179 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700180 if (!is_be_dai_extproc(i) &&
181 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
182 (msm_bedais[i].active) &&
183 (test_bit(fedai_id, &msm_bedais[i].fe_sessions)))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700184 payload.copp_ids[payload.num_copps++] =
185 msm_bedais[i].port_id;
186 }
187
188 if (payload.num_copps)
189 adm_matrix_map(dspst_id, path_type,
190 payload.num_copps, payload.copp_ids, 0);
191}
192
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700193void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id,
194 int stream_type)
195{
196 int i, session_type, path_type, port_type;
197 u32 mode = 0;
198
199 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
200 /* bad ID assigned in machine driver */
201 pr_err("%s: bad MM ID\n", __func__);
202 return;
203 }
204
205 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
206 session_type = SESSION_TYPE_RX;
207 path_type = ADM_PATH_PLAYBACK;
208 port_type = MSM_AFE_PORT_TYPE_RX;
209 } else {
210 session_type = SESSION_TYPE_TX;
211 path_type = ADM_PATH_LIVE_REC;
212 port_type = MSM_AFE_PORT_TYPE_TX;
213 }
214
215 mutex_lock(&routing_lock);
216
217 fe_dai_map[fedai_id][session_type] = dspst_id;
218 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
219 if (!is_be_dai_extproc(i) &&
220 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
221 (msm_bedais[i].active) &&
222 (test_bit(fedai_id, &msm_bedais[i].fe_sessions))) {
223 mode = afe_get_port_type(msm_bedais[i].port_id);
224 /*adm_connect_afe_port needs to be called*/
225 break;
226 }
227 }
228 mutex_unlock(&routing_lock);
229}
230
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700231void msm_pcm_routing_reg_phy_stream(int fedai_id, int dspst_id, int stream_type)
232{
233 int i, session_type, path_type, port_type;
234 struct route_payload payload;
235 u32 channels;
236
237 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
238 /* bad ID assigned in machine driver */
239 pr_err("%s: bad MM ID %d\n", __func__, fedai_id);
240 return;
241 }
242
243 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
244 session_type = SESSION_TYPE_RX;
245 path_type = ADM_PATH_PLAYBACK;
246 port_type = MSM_AFE_PORT_TYPE_RX;
247 } else {
248 session_type = SESSION_TYPE_TX;
249 path_type = ADM_PATH_LIVE_REC;
250 port_type = MSM_AFE_PORT_TYPE_TX;
251 }
252
253 mutex_lock(&routing_lock);
254
255 payload.num_copps = 0; /* only RX needs to use payload */
256 fe_dai_map[fedai_id][session_type] = dspst_id;
257 /* re-enable EQ if active */
258 if (eq_data[fedai_id].enable)
259 msm_send_eq_values(fedai_id);
260 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700261 if (!is_be_dai_extproc(i) &&
262 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
263 (msm_bedais[i].active) &&
264 (test_bit(fedai_id, &msm_bedais[i].fe_sessions))) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700265
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700266 channels = msm_bedais[i].channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700267
268 if ((stream_type == SNDRV_PCM_STREAM_PLAYBACK) &&
269 (channels > 2))
270 adm_multi_ch_copp_open(msm_bedais[i].port_id,
271 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700272 msm_bedais[i].sample_rate,
273 msm_bedais[i].channel,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700274 DEFAULT_COPP_TOPOLOGY);
275 else
276 adm_open(msm_bedais[i].port_id,
277 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700278 msm_bedais[i].sample_rate,
279 msm_bedais[i].channel,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700280 DEFAULT_COPP_TOPOLOGY);
281
282 payload.copp_ids[payload.num_copps++] =
283 msm_bedais[i].port_id;
284 }
285 }
286 if (payload.num_copps)
287 adm_matrix_map(dspst_id, path_type,
288 payload.num_copps, payload.copp_ids, 0);
289
290 mutex_unlock(&routing_lock);
291}
292
293void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type)
294{
295 int i, port_type, session_type;
296
297 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
298 /* bad ID assigned in machine driver */
299 pr_err("%s: bad MM ID\n", __func__);
300 return;
301 }
302
303 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
304 port_type = MSM_AFE_PORT_TYPE_RX;
305 session_type = SESSION_TYPE_RX;
306 } else {
307 port_type = MSM_AFE_PORT_TYPE_TX;
308 session_type = SESSION_TYPE_TX;
309 }
310
311 mutex_lock(&routing_lock);
312
313 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700314 if (!is_be_dai_extproc(i) &&
315 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
316 (msm_bedais[i].active) &&
317 (test_bit(fedai_id, &msm_bedais[i].fe_sessions)))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700318 adm_close(msm_bedais[i].port_id);
319 }
320
321 fe_dai_map[fedai_id][session_type] = INVALID_SESSION;
322
323 mutex_unlock(&routing_lock);
324}
325
326/* Check if FE/BE route is set */
327static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id)
328{
329 bool rc = false;
330
331 if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
332 /* recheck FE ID in the mixer control defined in this file */
333 pr_err("%s: bad MM ID\n", __func__);
334 return rc;
335 }
336
337 if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions))
338 rc = true;
339
340 return rc;
341}
342
343static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
344{
345 int session_type, path_type;
346 u32 channels;
347
348 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
349
350 if (val > MSM_FRONTEND_DAI_MM_MAX_ID) {
351 /* recheck FE ID in the mixer control defined in this file */
352 pr_err("%s: bad MM ID\n", __func__);
353 return;
354 }
355
356 if (afe_get_port_type(msm_bedais[reg].port_id) ==
357 MSM_AFE_PORT_TYPE_RX) {
358 session_type = SESSION_TYPE_RX;
359 path_type = ADM_PATH_PLAYBACK;
360 } else {
361 session_type = SESSION_TYPE_TX;
362 path_type = ADM_PATH_LIVE_REC;
363 }
364
365 mutex_lock(&routing_lock);
366
367 if (set) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700368 if (!test_bit(val, &msm_bedais[reg].fe_sessions) &&
369 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
370 voc_start_playback(set);
371
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700372 set_bit(val, &msm_bedais[reg].fe_sessions);
373 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
374 INVALID_SESSION) {
375
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700376 channels = msm_bedais[reg].channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700377
378 if ((session_type == SESSION_TYPE_RX) && (channels > 2))
379 adm_multi_ch_copp_open(msm_bedais[reg].port_id,
380 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700381 msm_bedais[reg].sample_rate,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700382 channels,
383 DEFAULT_COPP_TOPOLOGY);
384 else
385 adm_open(msm_bedais[reg].port_id,
386 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700387 msm_bedais[reg].sample_rate, channels,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700388 DEFAULT_COPP_TOPOLOGY);
389
390 msm_pcm_routing_build_matrix(val,
391 fe_dai_map[val][session_type], path_type);
392 }
393 } else {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700394 if (test_bit(val, &msm_bedais[reg].fe_sessions) &&
395 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
396 voc_start_playback(set);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700397 clear_bit(val, &msm_bedais[reg].fe_sessions);
398 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
399 INVALID_SESSION) {
400 adm_close(msm_bedais[reg].port_id);
401 msm_pcm_routing_build_matrix(val,
402 fe_dai_map[val][session_type], path_type);
403 }
404 }
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700405 if ((msm_bedais[reg].port_id == VOICE_RECORD_RX)
406 || (msm_bedais[reg].port_id == VOICE_RECORD_TX))
407 voc_start_record(msm_bedais[reg].port_id, set);
408
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700409 mutex_unlock(&routing_lock);
410}
411
412static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
413 struct snd_ctl_elem_value *ucontrol)
414{
415 struct soc_mixer_control *mc =
416 (struct soc_mixer_control *)kcontrol->private_value;
417
418 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
419 ucontrol->value.integer.value[0] = 1;
420 else
421 ucontrol->value.integer.value[0] = 0;
422
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700423 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700424 ucontrol->value.integer.value[0]);
425
426 return 0;
427}
428
429static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
430 struct snd_ctl_elem_value *ucontrol)
431{
432 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
433 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
434 struct soc_mixer_control *mc =
435 (struct soc_mixer_control *)kcontrol->private_value;
436
437
438 if (ucontrol->value.integer.value[0] &&
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700439 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == false) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700440 msm_pcm_routing_process_audio(mc->reg, mc->shift, 1);
441 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
442 } else if (!ucontrol->value.integer.value[0] &&
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700443 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == true) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700444 msm_pcm_routing_process_audio(mc->reg, mc->shift, 0);
445 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
446 }
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700447
448 return 1;
449}
450
451static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
452{
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700453 u16 session_id = 0;
454
455 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
456
457 if (val == MSM_FRONTEND_DAI_CS_VOICE)
458 session_id = voc_get_session_id(VOICE_SESSION_NAME);
459 else if (val == MSM_FRONTEND_DAI_VOLTE)
460 session_id = voc_get_session_id(VOLTE_SESSION_NAME);
461 else
462 session_id = voc_get_session_id(VOIP_SESSION_NAME);
463
464 pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
465 __func__, val, session_id);
466
467 mutex_lock(&routing_lock);
468
469 if (set)
470 set_bit(val, &msm_bedais[reg].fe_sessions);
471 else
472 clear_bit(val, &msm_bedais[reg].fe_sessions);
473
474 mutex_unlock(&routing_lock);
475
476 if (afe_get_port_type(msm_bedais[reg].port_id) ==
477 MSM_AFE_PORT_TYPE_RX) {
478 voc_set_route_flag(session_id, RX_PATH, set);
479 if (set) {
480 voc_set_rxtx_port(session_id,
481 msm_bedais[reg].port_id, DEV_RX);
482
483 if (voc_get_route_flag(session_id, RX_PATH) &&
484 voc_get_route_flag(session_id, TX_PATH))
485 voc_enable_cvp(session_id);
486 } else {
487 voc_disable_cvp(session_id);
488 }
489 } else {
490 voc_set_route_flag(session_id, TX_PATH, set);
491 if (set) {
492 voc_set_rxtx_port(session_id,
493 msm_bedais[reg].port_id, DEV_TX);
494 if (voc_get_route_flag(session_id, RX_PATH) &&
495 voc_get_route_flag(session_id, TX_PATH))
496 voc_enable_cvp(session_id);
497 } else {
498 voc_disable_cvp(session_id);
499 }
500 }
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700501}
502
503static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol,
504 struct snd_ctl_elem_value *ucontrol)
505{
506 struct soc_mixer_control *mc =
507 (struct soc_mixer_control *)kcontrol->private_value;
508
509 mutex_lock(&routing_lock);
510
511 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
512 ucontrol->value.integer.value[0] = 1;
513 else
514 ucontrol->value.integer.value[0] = 0;
515
516 mutex_unlock(&routing_lock);
517
518 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
519 ucontrol->value.integer.value[0]);
520
521 return 0;
522}
523
524static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol,
525 struct snd_ctl_elem_value *ucontrol)
526{
527 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
528 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
529 struct soc_mixer_control *mc =
530 (struct soc_mixer_control *)kcontrol->private_value;
531
532 if (ucontrol->value.integer.value[0]) {
533 msm_pcm_routing_process_voice(mc->reg, mc->shift, 1);
534 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
535 } else {
536 msm_pcm_routing_process_voice(mc->reg, mc->shift, 0);
537 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
538 }
539
540 return 1;
541}
542
543static int msm_routing_get_voice_stub_mixer(struct snd_kcontrol *kcontrol,
544 struct snd_ctl_elem_value *ucontrol)
545{
546 struct soc_mixer_control *mc =
547 (struct soc_mixer_control *)kcontrol->private_value;
548
549 mutex_lock(&routing_lock);
550
551 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
552 ucontrol->value.integer.value[0] = 1;
553 else
554 ucontrol->value.integer.value[0] = 0;
555
556 mutex_unlock(&routing_lock);
557
558 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
559 ucontrol->value.integer.value[0]);
560
561 return 0;
562}
563
564static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol,
565 struct snd_ctl_elem_value *ucontrol)
566{
567 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
568 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
569 struct soc_mixer_control *mc =
570 (struct soc_mixer_control *)kcontrol->private_value;
571
572 if (ucontrol->value.integer.value[0]) {
573 mutex_lock(&routing_lock);
574 set_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
575 mutex_unlock(&routing_lock);
576
577 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
578 } else {
579 mutex_lock(&routing_lock);
580 clear_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
581 mutex_unlock(&routing_lock);
582
583 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
584 }
585
586 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
587 ucontrol->value.integer.value[0]);
588
589 return 1;
590}
591
592static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol,
593 struct snd_ctl_elem_value *ucontrol)
594{
595 ucontrol->value.integer.value[0] = fm_switch_enable;
596 pr_debug("%s: FM Switch enable %ld\n", __func__,
597 ucontrol->value.integer.value[0]);
598 return 0;
599}
600
601static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol,
602 struct snd_ctl_elem_value *ucontrol)
603{
604 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
605 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
606
607 pr_debug("%s: FM Switch enable %ld\n", __func__,
608 ucontrol->value.integer.value[0]);
609 if (ucontrol->value.integer.value[0])
610 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
611 else
612 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
613 fm_switch_enable = ucontrol->value.integer.value[0];
614 return 1;
615}
616
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700617static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
618 struct snd_ctl_elem_value *ucontrol)
619{
620 ucontrol->value.integer.value[0] = fm_pcmrx_switch_enable;
621 pr_debug("%s: FM Switch enable %ld\n", __func__,
622 ucontrol->value.integer.value[0]);
623 return 0;
624}
625
626static int msm_routing_put_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
627 struct snd_ctl_elem_value *ucontrol)
628{
629 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
630 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
631
632 pr_debug("%s: FM Switch enable %ld\n", __func__,
633 ucontrol->value.integer.value[0]);
634 if (ucontrol->value.integer.value[0])
635 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
636 else
637 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
638 fm_pcmrx_switch_enable = ucontrol->value.integer.value[0];
639 return 1;
640}
641
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700642static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol,
643 struct snd_ctl_elem_value *ucontrol)
644{
645 struct soc_mixer_control *mc =
646 (struct soc_mixer_control *)kcontrol->private_value;
647
648 if (test_bit(mc->shift, &msm_bedais[mc->reg].port_sessions))
649 ucontrol->value.integer.value[0] = 1;
650 else
651 ucontrol->value.integer.value[0] = 0;
652
653 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
654 ucontrol->value.integer.value[0]);
655
656 return 0;
657}
658
659static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol,
660 struct snd_ctl_elem_value *ucontrol)
661{
662 struct soc_mixer_control *mc =
663 (struct soc_mixer_control *)kcontrol->private_value;
664
665 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg,
666 mc->shift, ucontrol->value.integer.value[0]);
667
668 if (ucontrol->value.integer.value[0]) {
669 afe_loopback(1, msm_bedais[mc->reg].port_id,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700670 msm_bedais[mc->shift].port_id);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700671 set_bit(mc->shift,
672 &msm_bedais[mc->reg].port_sessions);
673 } else {
674 afe_loopback(0, msm_bedais[mc->reg].port_id,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700675 msm_bedais[mc->shift].port_id);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700676 clear_bit(mc->shift,
677 &msm_bedais[mc->reg].port_sessions);
678 }
679
680 return 1;
681}
682
683static int msm_routing_get_fm_vol_mixer(struct snd_kcontrol *kcontrol,
684 struct snd_ctl_elem_value *ucontrol)
685{
686 ucontrol->value.integer.value[0] = msm_route_fm_vol_control;
687 return 0;
688}
689
690static int msm_routing_set_fm_vol_mixer(struct snd_kcontrol *kcontrol,
691 struct snd_ctl_elem_value *ucontrol)
692{
693 afe_loopback_gain(INT_FM_TX , ucontrol->value.integer.value[0]);
694
695 msm_route_fm_vol_control = ucontrol->value.integer.value[0];
696
697 return 0;
698}
699
700static int msm_routing_get_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
701 struct snd_ctl_elem_value *ucontrol)
702{
703 ucontrol->value.integer.value[0] = msm_route_lpa_vol_control;
704 return 0;
705}
706
707static int msm_routing_set_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
708 struct snd_ctl_elem_value *ucontrol)
709{
710 if (!lpa_set_volume(ucontrol->value.integer.value[0]))
711 msm_route_lpa_vol_control =
712 ucontrol->value.integer.value[0];
713
714 return 0;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700715}
716
717static int msm_routing_get_multimedia2_vol_mixer(struct snd_kcontrol *kcontrol,
718 struct snd_ctl_elem_value *ucontrol)
719{
720
721 ucontrol->value.integer.value[0] = msm_route_multimedia2_vol_control;
722 return 0;
723}
724
725static int msm_routing_set_multimedia2_vol_mixer(struct snd_kcontrol *kcontrol,
726 struct snd_ctl_elem_value *ucontrol)
727{
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700728
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700729 if (!multi_ch_pcm_set_volume(ucontrol->value.integer.value[0]))
730 msm_route_multimedia2_vol_control =
731 ucontrol->value.integer.value[0];
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700732
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700733 return 0;
734}
735
736static int msm_routing_get_compressed_vol_mixer(struct snd_kcontrol *kcontrol,
737 struct snd_ctl_elem_value *ucontrol)
738{
739
740 ucontrol->value.integer.value[0] = msm_route_compressed_vol_control;
741 return 0;
742}
743
744static int msm_routing_set_compressed_vol_mixer(struct snd_kcontrol *kcontrol,
745 struct snd_ctl_elem_value *ucontrol)
746{
747 if (!compressed_set_volume(ucontrol->value.integer.value[0]))
748 msm_route_compressed_vol_control =
749 ucontrol->value.integer.value[0];
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700750
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700751 return 0;
752}
753
754static void msm_send_eq_values(int eq_idx)
755{
756 int result;
757 struct audio_client *ac =
758 q6asm_get_audio_client(fe_dai_map[eq_idx][SESSION_TYPE_RX]);
759
760 if (ac == NULL) {
761 pr_err("%s: Could not get audio client for session: %d\n",
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700762 __func__, fe_dai_map[eq_idx][SESSION_TYPE_RX]);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700763 goto done;
764 }
765
766 result = q6asm_equalizer(ac, &eq_data[eq_idx]);
767
768 if (result < 0)
769 pr_err("%s: Call to ASM equalizer failed, returned = %d\n",
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700770 __func__, result);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700771done:
772 return;
773}
774
775static int msm_routing_get_eq_enable_mixer(struct snd_kcontrol *kcontrol,
776 struct snd_ctl_elem_value *ucontrol)
777{
778 int eq_idx = ((struct soc_multi_mixer_control *)
779 kcontrol->private_value)->reg;
780
781 ucontrol->value.integer.value[0] = eq_data[eq_idx].enable;
782
783 pr_debug("%s: EQ #%d enable %d\n", __func__,
784 eq_idx, eq_data[eq_idx].enable);
785 return 0;
786}
787
788static int msm_routing_put_eq_enable_mixer(struct snd_kcontrol *kcontrol,
789 struct snd_ctl_elem_value *ucontrol)
790{
791 int eq_idx = ((struct soc_multi_mixer_control *)
792 kcontrol->private_value)->reg;
793 int value = ucontrol->value.integer.value[0];
794
795 pr_debug("%s: EQ #%d enable %d\n", __func__,
796 eq_idx, value);
797 eq_data[eq_idx].enable = value;
798
799 msm_send_eq_values(eq_idx);
800 return 0;
801}
802
803static int msm_routing_get_eq_band_count_audio_mixer(
804 struct snd_kcontrol *kcontrol,
805 struct snd_ctl_elem_value *ucontrol)
806{
807 int eq_idx = ((struct soc_multi_mixer_control *)
808 kcontrol->private_value)->reg;
809
810 ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands;
811
812 pr_debug("%s: EQ #%d bands %d\n", __func__,
813 eq_idx, eq_data[eq_idx].num_bands);
814 return eq_data[eq_idx].num_bands;
815}
816
817static int msm_routing_put_eq_band_count_audio_mixer(
818 struct snd_kcontrol *kcontrol,
819 struct snd_ctl_elem_value *ucontrol)
820{
821 int eq_idx = ((struct soc_multi_mixer_control *)
822 kcontrol->private_value)->reg;
823 int value = ucontrol->value.integer.value[0];
824
825 pr_debug("%s: EQ #%d bands %d\n", __func__,
826 eq_idx, value);
827 eq_data[eq_idx].num_bands = value;
828 return 0;
829}
830
831static int msm_routing_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
832 struct snd_ctl_elem_value *ucontrol)
833{
834 int eq_idx = ((struct soc_multi_mixer_control *)
835 kcontrol->private_value)->reg;
836 int band_idx = ((struct soc_multi_mixer_control *)
837 kcontrol->private_value)->shift;
838
839 ucontrol->value.integer.value[0] =
840 eq_data[eq_idx].eq_bands[band_idx].band_idx;
841 ucontrol->value.integer.value[1] =
842 eq_data[eq_idx].eq_bands[band_idx].filter_type;
843 ucontrol->value.integer.value[2] =
844 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz;
845 ucontrol->value.integer.value[3] =
846 eq_data[eq_idx].eq_bands[band_idx].filter_gain;
847 ucontrol->value.integer.value[4] =
848 eq_data[eq_idx].eq_bands[band_idx].q_factor;
849
850 pr_debug("%s: band_idx = %d\n", __func__,
851 eq_data[eq_idx].eq_bands[band_idx].band_idx);
852 pr_debug("%s: filter_type = %d\n", __func__,
853 eq_data[eq_idx].eq_bands[band_idx].filter_type);
854 pr_debug("%s: center_freq_hz = %d\n", __func__,
855 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz);
856 pr_debug("%s: filter_gain = %d\n", __func__,
857 eq_data[eq_idx].eq_bands[band_idx].filter_gain);
858 pr_debug("%s: q_factor = %d\n", __func__,
859 eq_data[eq_idx].eq_bands[band_idx].q_factor);
860 return 0;
861}
862
863static int msm_routing_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
864 struct snd_ctl_elem_value *ucontrol)
865{
866 int eq_idx = ((struct soc_multi_mixer_control *)
867 kcontrol->private_value)->reg;
868 int band_idx = ((struct soc_multi_mixer_control *)
869 kcontrol->private_value)->shift;
870
871 eq_data[eq_idx].eq_bands[band_idx].band_idx =
872 ucontrol->value.integer.value[0];
873 eq_data[eq_idx].eq_bands[band_idx].filter_type =
874 ucontrol->value.integer.value[1];
875 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz =
876 ucontrol->value.integer.value[2];
877 eq_data[eq_idx].eq_bands[band_idx].filter_gain =
878 ucontrol->value.integer.value[3];
879 eq_data[eq_idx].eq_bands[band_idx].q_factor =
880 ucontrol->value.integer.value[4];
881 return 0;
882}
883
884static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = {
885 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_I2S_RX ,
886 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
887 msm_routing_put_audio_mixer),
888 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_PRI_I2S_RX,
889 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
890 msm_routing_put_audio_mixer),
891 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_PRI_I2S_RX,
892 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
893 msm_routing_put_audio_mixer),
894 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_PRI_I2S_RX,
895 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
896 msm_routing_put_audio_mixer),
897};
898
899static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = {
900 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SEC_I2S_RX ,
901 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
902 msm_routing_put_audio_mixer),
903 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SEC_I2S_RX,
904 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
905 msm_routing_put_audio_mixer),
906 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SEC_I2S_RX,
907 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
908 msm_routing_put_audio_mixer),
909 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SEC_I2S_RX,
910 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
911 msm_routing_put_audio_mixer),
912};
913
914static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
915 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
916 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
917 msm_routing_put_audio_mixer),
918 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_0_RX,
919 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
920 msm_routing_put_audio_mixer),
921 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SLIMBUS_0_RX,
922 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
923 msm_routing_put_audio_mixer),
924 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SLIMBUS_0_RX,
925 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
926 msm_routing_put_audio_mixer),
927};
928
929static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = {
930 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_MI2S_RX ,
931 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
932 msm_routing_put_audio_mixer),
933 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_MI2S_RX,
934 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
935 msm_routing_put_audio_mixer),
936 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_MI2S_RX,
937 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
938 msm_routing_put_audio_mixer),
939 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_MI2S_RX,
940 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
941 msm_routing_put_audio_mixer),
942};
943
944static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
945 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_HDMI_RX,
946 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
947 msm_routing_put_audio_mixer),
948 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_HDMI_RX,
949 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
950 msm_routing_put_audio_mixer),
951 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_HDMI_RX,
952 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
953 msm_routing_put_audio_mixer),
954 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_HDMI_RX,
955 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
956 msm_routing_put_audio_mixer),
957};
958 /* incall music delivery mixer */
959static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = {
960 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
961 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
962 msm_routing_put_audio_mixer),
963 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
964 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
965 msm_routing_put_audio_mixer),
966};
967
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700968static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
969 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_4_RX,
970 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
971 msm_routing_put_audio_mixer),
972 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_4_RX,
973 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
974 msm_routing_put_audio_mixer),
975};
976
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700977static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
978 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_BT_SCO_RX,
979 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
980 msm_routing_put_audio_mixer),
981 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_BT_SCO_RX,
982 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
983 msm_routing_put_audio_mixer),
984 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_BT_SCO_RX,
985 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
986 msm_routing_put_audio_mixer),
987 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_BT_SCO_RX,
988 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
989 msm_routing_put_audio_mixer),
990};
991
992static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
993 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_FM_RX,
994 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
995 msm_routing_put_audio_mixer),
996 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_FM_RX,
997 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
998 msm_routing_put_audio_mixer),
999 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_FM_RX,
1000 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1001 msm_routing_put_audio_mixer),
1002 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_FM_RX,
1003 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1004 msm_routing_put_audio_mixer),
1005};
1006
1007static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
1008 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
1009 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1010 msm_routing_put_audio_mixer),
1011 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
1012 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1013 msm_routing_put_audio_mixer),
1014 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AFE_PCM_RX,
1015 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1016 msm_routing_put_audio_mixer),
1017 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AFE_PCM_RX,
1018 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1019 msm_routing_put_audio_mixer),
1020};
1021
1022static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
1023 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AUXPCM_RX,
1024 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1025 msm_routing_put_audio_mixer),
1026 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AUXPCM_RX,
1027 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1028 msm_routing_put_audio_mixer),
1029 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AUXPCM_RX,
1030 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1031 msm_routing_put_audio_mixer),
1032 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AUXPCM_RX,
1033 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1034 msm_routing_put_audio_mixer),
1035};
1036
1037static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
1038 SOC_SINGLE_EXT("PRI_TX", MSM_BACKEND_DAI_PRI_I2S_TX,
1039 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1040 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001041 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1042 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1043 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001044 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1045 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1046 msm_routing_put_audio_mixer),
1047 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_TX,
1048 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1049 msm_routing_put_audio_mixer),
1050 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1051 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1052 msm_routing_put_audio_mixer),
1053 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
1054 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1055 msm_routing_put_audio_mixer),
1056 SOC_SINGLE_EXT("AFE_PCM_TX", MSM_BACKEND_DAI_AFE_PCM_TX,
1057 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1058 msm_routing_put_audio_mixer),
1059 SOC_SINGLE_EXT("VOC_REC_DL", MSM_BACKEND_DAI_INCALL_RECORD_RX,
1060 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1061 msm_routing_put_audio_mixer),
1062 SOC_SINGLE_EXT("VOC_REC_UL", MSM_BACKEND_DAI_INCALL_RECORD_TX,
1063 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1064 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001065 SOC_SINGLE_EXT("SLIM_4_TX", MSM_BACKEND_DAI_SLIMBUS_4_TX,
1066 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1067 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001068};
1069
1070static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
1071 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
1072 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1073 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001074 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1075 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1076 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001077};
1078
1079static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
1080 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_PRI_I2S_RX,
1081 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1082 msm_routing_put_voice_mixer),
1083 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_PRI_I2S_RX,
1084 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1085 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001086 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_PRI_I2S_RX,
1087 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1088 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001089};
1090
1091static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
1092 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SEC_I2S_RX,
1093 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1094 msm_routing_put_voice_mixer),
1095 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SEC_I2S_RX,
1096 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1097 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001098 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SEC_I2S_RX,
1099 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1100 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001101};
1102
1103static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
1104 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1105 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1106 msm_routing_put_voice_mixer),
1107 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
1108 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1109 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001110 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
1111 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1112 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001113};
1114
1115static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
1116 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1117 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1118 msm_routing_put_voice_mixer),
1119 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
1120 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1121 msm_routing_put_voice_mixer),
1122 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1123 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1124 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001125 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
1126 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1127 msm_routing_put_voice_mixer),
1128};
1129
1130static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = {
1131 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_MI2S_RX,
1132 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1133 msm_routing_put_voice_mixer),
1134 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_MI2S_RX,
1135 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1136 msm_routing_put_voice_mixer),
1137 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_MI2S_RX,
1138 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1139 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001140};
1141
1142static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
1143 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AFE_PCM_RX,
1144 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1145 msm_routing_put_voice_mixer),
1146 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AFE_PCM_RX,
1147 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1148 msm_routing_put_voice_mixer),
1149 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
1150 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1151 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001152 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AFE_PCM_RX,
1153 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1154 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001155};
1156
1157static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
1158 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AUXPCM_RX,
1159 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1160 msm_routing_put_voice_mixer),
1161 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AUXPCM_RX,
1162 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1163 msm_routing_put_voice_mixer),
1164 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AUXPCM_RX,
1165 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1166 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001167 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AUXPCM_RX,
1168 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1169 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001170};
1171
1172static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
1173 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_HDMI_RX,
1174 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1175 msm_routing_put_voice_mixer),
1176 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_HDMI_RX,
1177 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1178 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001179 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_HDMI_RX,
1180 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1181 msm_routing_put_voice_mixer),
1182 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_HDMI_RX,
1183 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1184 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001185};
1186
1187static const struct snd_kcontrol_new stub_rx_mixer_controls[] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001188 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_EXTPROC_RX,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001189 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1190 msm_routing_put_voice_stub_mixer),
1191};
1192
1193static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
1194 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1195 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1196 msm_routing_put_voice_stub_mixer),
1197};
1198
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001199static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
1200 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1201 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1202 msm_routing_put_voice_stub_mixer),
1203};
1204
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001205static const struct snd_kcontrol_new tx_voice_mixer_controls[] = {
1206 SOC_SINGLE_EXT("PRI_TX_Voice", MSM_BACKEND_DAI_PRI_I2S_TX,
1207 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1208 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001209 SOC_SINGLE_EXT("MI2S_TX_Voice", MSM_BACKEND_DAI_MI2S_TX,
1210 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1211 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001212 SOC_SINGLE_EXT("SLIM_0_TX_Voice", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1213 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1214 msm_routing_put_voice_mixer),
1215 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voice",
1216 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_CS_VOICE, 1, 0,
1217 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
1218 SOC_SINGLE_EXT("AFE_PCM_TX_Voice", MSM_BACKEND_DAI_AFE_PCM_TX,
1219 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1220 msm_routing_put_voice_mixer),
1221 SOC_SINGLE_EXT("AUX_PCM_TX_Voice", MSM_BACKEND_DAI_AUXPCM_TX,
1222 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1223 msm_routing_put_voice_mixer),
1224};
1225
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001226static const struct snd_kcontrol_new tx_volte_mixer_controls[] = {
1227 SOC_SINGLE_EXT("PRI_TX_VoLTE", MSM_BACKEND_DAI_PRI_I2S_TX,
1228 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1229 msm_routing_put_voice_mixer),
1230 SOC_SINGLE_EXT("SLIM_0_TX_VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1231 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1232 msm_routing_put_voice_mixer),
1233 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_VoLTE",
1234 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOLTE, 1, 0,
1235 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
1236 SOC_SINGLE_EXT("AFE_PCM_TX_VoLTE", MSM_BACKEND_DAI_AFE_PCM_TX,
1237 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1238 msm_routing_put_voice_mixer),
1239 SOC_SINGLE_EXT("AUX_PCM_TX_VoLTE", MSM_BACKEND_DAI_AUXPCM_TX,
1240 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1241 msm_routing_put_voice_mixer),
1242};
1243
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001244static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
1245 SOC_SINGLE_EXT("PRI_TX_Voip", MSM_BACKEND_DAI_PRI_I2S_TX,
1246 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1247 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001248 SOC_SINGLE_EXT("MI2S_TX_Voip", MSM_BACKEND_DAI_MI2S_TX,
1249 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1250 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001251 SOC_SINGLE_EXT("SLIM_0_TX_Voip", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1252 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1253 msm_routing_put_voice_mixer),
1254 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voip", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1255 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1256 msm_routing_put_voice_mixer),
1257 SOC_SINGLE_EXT("AFE_PCM_TX_Voip", MSM_BACKEND_DAI_AFE_PCM_TX,
1258 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1259 msm_routing_put_voice_mixer),
1260 SOC_SINGLE_EXT("AUX_PCM_TX_Voip", MSM_BACKEND_DAI_AUXPCM_TX,
1261 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1262 msm_routing_put_voice_mixer),
1263};
1264
1265static const struct snd_kcontrol_new tx_voice_stub_mixer_controls[] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001266 SOC_SINGLE_EXT("STUB_TX_HL", MSM_BACKEND_DAI_EXTPROC_TX,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001267 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1268 msm_routing_put_voice_stub_mixer),
1269 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1270 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1271 msm_routing_put_voice_stub_mixer),
1272 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_SLIMBUS_1_TX,
1273 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1274 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001275 SOC_SINGLE_EXT("STUB_1_TX_HL", MSM_BACKEND_DAI_EXTPROC_EC_TX,
1276 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1277 msm_routing_put_voice_stub_mixer),
1278 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1279 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1280 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001281};
1282
1283static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
1284 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1285 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1286 msm_routing_put_port_mixer),
1287 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1288 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1289 msm_routing_put_port_mixer),
1290 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1291 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1292 msm_routing_put_port_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001293 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1294 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1295 msm_routing_put_port_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001296};
1297
1298static const struct snd_kcontrol_new auxpcm_rx_port_mixer_controls[] = {
1299 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1300 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1301 msm_routing_put_port_mixer),
1302 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1303 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1304 msm_routing_put_port_mixer),
1305};
1306
1307static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = {
1308 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1309 MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
1310 msm_routing_put_port_mixer),
1311};
1312
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001313static const struct snd_kcontrol_new sbus_3_rx_port_mixer_controls[] = {
1314 SOC_SINGLE_EXT("INTERNAL_BT_SCO_RX", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1315 MSM_BACKEND_DAI_INT_BT_SCO_RX, 1, 0, msm_routing_get_port_mixer,
1316 msm_routing_put_port_mixer),
1317 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1318 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1319 msm_routing_put_port_mixer),
1320};
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001321static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = {
1322 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1323 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1324 msm_routing_put_port_mixer),
1325};
1326
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001327static const struct snd_kcontrol_new afe_pcm_rx_port_mixer_controls[] = {
1328 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_AFE_PCM_RX,
1329 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1330 msm_routing_put_port_mixer),
1331};
1332
1333
1334static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = {
1335 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_HDMI_RX,
1336 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1337 msm_routing_put_port_mixer),
1338};
1339
1340static const struct snd_kcontrol_new sec_i2s_rx_port_mixer_controls[] = {
1341 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SEC_I2S_RX,
1342 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1343 msm_routing_put_port_mixer),
1344};
1345
1346static const struct snd_kcontrol_new mi2s_rx_port_mixer_controls[] = {
1347 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_MI2S_RX,
1348 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1349 msm_routing_put_port_mixer),
1350};
1351
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001352static const struct snd_kcontrol_new fm_switch_mixer_controls =
1353 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1354 0, 1, 0, msm_routing_get_switch_mixer,
1355 msm_routing_put_switch_mixer);
1356
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001357static const struct snd_kcontrol_new pcm_rx_switch_mixer_controls =
1358 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1359 0, 1, 0, msm_routing_get_fm_pcmrx_switch_mixer,
1360 msm_routing_put_fm_pcmrx_switch_mixer);
1361
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001362static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
1363 SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001364 INT_RX_VOL_GAIN, 0, msm_routing_get_fm_vol_mixer,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001365 msm_routing_set_fm_vol_mixer, fm_rx_vol_gain),
1366};
1367
1368static const struct snd_kcontrol_new lpa_vol_mixer_controls[] = {
1369 SOC_SINGLE_EXT_TLV("LPA RX Volume", SND_SOC_NOPM, 0,
1370 INT_RX_VOL_GAIN, 0, msm_routing_get_lpa_vol_mixer,
1371 msm_routing_set_lpa_vol_mixer, lpa_rx_vol_gain),
1372};
1373
1374static const struct snd_kcontrol_new multimedia2_vol_mixer_controls[] = {
1375 SOC_SINGLE_EXT_TLV("HIFI2 RX Volume", SND_SOC_NOPM, 0,
1376 INT_RX_VOL_GAIN, 0, msm_routing_get_multimedia2_vol_mixer,
1377 msm_routing_set_multimedia2_vol_mixer, multimedia2_rx_vol_gain),
1378};
1379
1380static const struct snd_kcontrol_new compressed_vol_mixer_controls[] = {
1381 SOC_SINGLE_EXT_TLV("COMPRESSED RX Volume", SND_SOC_NOPM, 0,
1382 INT_RX_VOL_GAIN, 0, msm_routing_get_compressed_vol_mixer,
1383 msm_routing_set_compressed_vol_mixer, compressed_rx_vol_gain),
1384};
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001385static const struct snd_kcontrol_new eq_enable_mixer_controls[] = {
1386 SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM,
1387 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_eq_enable_mixer,
1388 msm_routing_put_eq_enable_mixer),
1389 SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM,
1390 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_eq_enable_mixer,
1391 msm_routing_put_eq_enable_mixer),
1392 SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM,
1393 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_eq_enable_mixer,
1394 msm_routing_put_eq_enable_mixer),
1395};
1396
1397static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
1398 SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM,
1399 MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0,
1400 msm_routing_get_eq_band_count_audio_mixer,
1401 msm_routing_put_eq_band_count_audio_mixer),
1402 SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM,
1403 MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0,
1404 msm_routing_get_eq_band_count_audio_mixer,
1405 msm_routing_put_eq_band_count_audio_mixer),
1406 SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM,
1407 MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0,
1408 msm_routing_get_eq_band_count_audio_mixer,
1409 msm_routing_put_eq_band_count_audio_mixer),
1410};
1411
1412static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = {
1413 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1,
1414 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1415 msm_routing_get_eq_band_audio_mixer,
1416 msm_routing_put_eq_band_audio_mixer),
1417 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2,
1418 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1419 msm_routing_get_eq_band_audio_mixer,
1420 msm_routing_put_eq_band_audio_mixer),
1421 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3,
1422 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1423 msm_routing_get_eq_band_audio_mixer,
1424 msm_routing_put_eq_band_audio_mixer),
1425 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4,
1426 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1427 msm_routing_get_eq_band_audio_mixer,
1428 msm_routing_put_eq_band_audio_mixer),
1429 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5,
1430 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1431 msm_routing_get_eq_band_audio_mixer,
1432 msm_routing_put_eq_band_audio_mixer),
1433 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6,
1434 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1435 msm_routing_get_eq_band_audio_mixer,
1436 msm_routing_put_eq_band_audio_mixer),
1437 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7,
1438 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1439 msm_routing_get_eq_band_audio_mixer,
1440 msm_routing_put_eq_band_audio_mixer),
1441 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8,
1442 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1443 msm_routing_get_eq_band_audio_mixer,
1444 msm_routing_put_eq_band_audio_mixer),
1445 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9,
1446 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1447 msm_routing_get_eq_band_audio_mixer,
1448 msm_routing_put_eq_band_audio_mixer),
1449 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10,
1450 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1451 msm_routing_get_eq_band_audio_mixer,
1452 msm_routing_put_eq_band_audio_mixer),
1453 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11,
1454 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1455 msm_routing_get_eq_band_audio_mixer,
1456 msm_routing_put_eq_band_audio_mixer),
1457 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12,
1458 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1459 msm_routing_get_eq_band_audio_mixer,
1460 msm_routing_put_eq_band_audio_mixer),
1461 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1,
1462 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1463 msm_routing_get_eq_band_audio_mixer,
1464 msm_routing_put_eq_band_audio_mixer),
1465 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2,
1466 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1467 msm_routing_get_eq_band_audio_mixer,
1468 msm_routing_put_eq_band_audio_mixer),
1469 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3,
1470 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1471 msm_routing_get_eq_band_audio_mixer,
1472 msm_routing_put_eq_band_audio_mixer),
1473 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4,
1474 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1475 msm_routing_get_eq_band_audio_mixer,
1476 msm_routing_put_eq_band_audio_mixer),
1477 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5,
1478 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1479 msm_routing_get_eq_band_audio_mixer,
1480 msm_routing_put_eq_band_audio_mixer),
1481 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6,
1482 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1483 msm_routing_get_eq_band_audio_mixer,
1484 msm_routing_put_eq_band_audio_mixer),
1485 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7,
1486 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1487 msm_routing_get_eq_band_audio_mixer,
1488 msm_routing_put_eq_band_audio_mixer),
1489 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8,
1490 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1491 msm_routing_get_eq_band_audio_mixer,
1492 msm_routing_put_eq_band_audio_mixer),
1493 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9,
1494 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1495 msm_routing_get_eq_band_audio_mixer,
1496 msm_routing_put_eq_band_audio_mixer),
1497 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10,
1498 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1499 msm_routing_get_eq_band_audio_mixer,
1500 msm_routing_put_eq_band_audio_mixer),
1501 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11,
1502 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1503 msm_routing_get_eq_band_audio_mixer,
1504 msm_routing_put_eq_band_audio_mixer),
1505 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12,
1506 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1507 msm_routing_get_eq_band_audio_mixer,
1508 msm_routing_put_eq_band_audio_mixer),
1509 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1,
1510 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1511 msm_routing_get_eq_band_audio_mixer,
1512 msm_routing_put_eq_band_audio_mixer),
1513 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2,
1514 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1515 msm_routing_get_eq_band_audio_mixer,
1516 msm_routing_put_eq_band_audio_mixer),
1517 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3,
1518 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1519 msm_routing_get_eq_band_audio_mixer,
1520 msm_routing_put_eq_band_audio_mixer),
1521 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4,
1522 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1523 msm_routing_get_eq_band_audio_mixer,
1524 msm_routing_put_eq_band_audio_mixer),
1525 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5,
1526 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1527 msm_routing_get_eq_band_audio_mixer,
1528 msm_routing_put_eq_band_audio_mixer),
1529 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6,
1530 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1531 msm_routing_get_eq_band_audio_mixer,
1532 msm_routing_put_eq_band_audio_mixer),
1533 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7,
1534 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1535 msm_routing_get_eq_band_audio_mixer,
1536 msm_routing_put_eq_band_audio_mixer),
1537 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8,
1538 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1539 msm_routing_get_eq_band_audio_mixer,
1540 msm_routing_put_eq_band_audio_mixer),
1541 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9,
1542 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1543 msm_routing_get_eq_band_audio_mixer,
1544 msm_routing_put_eq_band_audio_mixer),
1545 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10,
1546 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1547 msm_routing_get_eq_band_audio_mixer,
1548 msm_routing_put_eq_band_audio_mixer),
1549 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11,
1550 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1551 msm_routing_get_eq_band_audio_mixer,
1552 msm_routing_put_eq_band_audio_mixer),
1553 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12,
1554 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1555 msm_routing_get_eq_band_audio_mixer,
1556 msm_routing_put_eq_band_audio_mixer),
1557};
1558
1559static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
1560 /* Frontend AIF */
1561 /* Widget name equals to Front-End DAI name<Need confirmation>,
1562 * Stream name must contains substring of front-end dai name
1563 */
1564 SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0),
1565 SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0),
1566 SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0),
1567 SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0),
1568 SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
1569 SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
1570 SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
1571 SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, 0, 0, 0),
1572 SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001573 SND_SOC_DAPM_AIF_IN("VoLTE_DL", "VoLTE Playback", 0, 0, 0, 0),
1574 SND_SOC_DAPM_AIF_OUT("VoLTE_UL", "VoLTE Capture", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001575 SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
1576 SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
1577 0, 0, 0, 0),
1578 SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture",
1579 0, 0, 0, 0),
1580 SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback",
1581 0, 0, 0, 0),
1582 SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture",
1583 0, 0, 0, 0),
1584 SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001585 SND_SOC_DAPM_AIF_IN("SEC_I2S_DL_HL", "SEC_I2S_RX_HOSTLESS Playback",
1586 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001587 SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
1588 0, 0, 0, 0),
1589 SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture",
1590 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001591 SND_SOC_DAPM_AIF_OUT("MI2S_UL_HL", "MI2S_TX_HOSTLESS Capture",
1592 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001593
1594 /* Backend AIF */
1595 /* Stream name equals to backend dai link stream name
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001596 */
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001597 SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0),
1598 SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback",
1599 0, 0, 0 , 0),
1600 SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0),
1601 SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0 , 0),
1602 SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0),
1603 SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001604 SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001605 SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0),
1606 SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback",
1607 0, 0, 0 , 0),
1608 SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
1609 0, 0, 0, 0),
1610 SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
1611 0, 0, 0 , 0),
1612 SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
1613 0, 0, 0, 0),
1614 SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback",
1615 0, 0, 0 , 0),
1616 SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
1617 0, 0, 0 , 0),
1618 /* incall */
1619 SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
1620 0, 0, 0 , 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001621 SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback",
1622 0, 0, 0 , 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001623 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture",
1624 0, 0, 0, 0),
1625 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture",
1626 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001627 SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
1628 0, 0, 0, 0),
1629
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001630 SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
1631 SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
1632 SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
1633 SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
1634 SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0),
1635 SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0),
1636 SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0),
1637 SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001638 SND_SOC_DAPM_AIF_IN("STUB_1_TX", "Stub1 Capture", 0, 0, 0, 0),
1639 SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001640
1641 /* Switch Definitions */
1642 SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
1643 &fm_switch_mixer_controls),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001644 SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0,
1645 &pcm_rx_switch_mixer_controls),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001646 /* Mixer definitions */
1647 SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1648 pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
1649 SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1650 sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)),
1651 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1652 slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)),
1653 SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
1654 hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
1655 SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1656 mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)),
1657 SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
1658 mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
1659 SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
1660 mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
1661 SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1662 auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
1663 /* incall */
1664 SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
1665 incall_music_delivery_mixer_controls,
1666 ARRAY_SIZE(incall_music_delivery_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001667 SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1668 slimbus_4_rx_mixer_controls,
1669 ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001670 /* Voice Mixer */
1671 SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer",
1672 SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls,
1673 ARRAY_SIZE(pri_rx_voice_mixer_controls)),
1674 SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer",
1675 SND_SOC_NOPM, 0, 0,
1676 sec_i2s_rx_voice_mixer_controls,
1677 ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)),
1678 SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer",
1679 SND_SOC_NOPM, 0, 0,
1680 slimbus_rx_voice_mixer_controls,
1681 ARRAY_SIZE(slimbus_rx_voice_mixer_controls)),
1682 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer",
1683 SND_SOC_NOPM, 0, 0,
1684 bt_sco_rx_voice_mixer_controls,
1685 ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)),
1686 SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer",
1687 SND_SOC_NOPM, 0, 0,
1688 afe_pcm_rx_voice_mixer_controls,
1689 ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)),
1690 SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer",
1691 SND_SOC_NOPM, 0, 0,
1692 aux_pcm_rx_voice_mixer_controls,
1693 ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)),
1694 SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
1695 SND_SOC_NOPM, 0, 0,
1696 hdmi_rx_voice_mixer_controls,
1697 ARRAY_SIZE(hdmi_rx_voice_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001698 SND_SOC_DAPM_MIXER("MI2S_RX_Voice Mixer",
1699 SND_SOC_NOPM, 0, 0,
1700 mi2s_rx_voice_mixer_controls,
1701 ARRAY_SIZE(mi2s_rx_voice_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001702 SND_SOC_DAPM_MIXER("Voice_Tx Mixer",
1703 SND_SOC_NOPM, 0, 0, tx_voice_mixer_controls,
1704 ARRAY_SIZE(tx_voice_mixer_controls)),
1705 SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
1706 SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
1707 ARRAY_SIZE(tx_voip_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001708 SND_SOC_DAPM_MIXER("VoLTE_Tx Mixer",
1709 SND_SOC_NOPM, 0, 0, tx_volte_mixer_controls,
1710 ARRAY_SIZE(tx_volte_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001711 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1712 int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
1713 SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1714 int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
1715 SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1716 afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
1717 SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
1718 tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)),
1719 SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0,
1720 stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)),
1721 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0,
1722 slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001723 SND_SOC_DAPM_MIXER("SLIMBUS_3_RX_Voice Mixer", SND_SOC_NOPM, 0, 0,
1724 slimbus_3_rx_mixer_controls, ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001725 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer",
1726 SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls,
1727 ARRAY_SIZE(sbus_0_rx_port_mixer_controls)),
1728 SND_SOC_DAPM_MIXER("AUXPCM_RX Port Mixer",
1729 SND_SOC_NOPM, 0, 0, auxpcm_rx_port_mixer_controls,
1730 ARRAY_SIZE(auxpcm_rx_port_mixer_controls)),
1731 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1732 sbus_1_rx_port_mixer_controls,
1733 ARRAY_SIZE(sbus_1_rx_port_mixer_controls)),
1734 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1735 bt_sco_rx_port_mixer_controls,
1736 ARRAY_SIZE(bt_sco_rx_port_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001737 SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer",
1738 SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls,
1739 ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)),
1740 SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer",
1741 SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls,
1742 ARRAY_SIZE(hdmi_rx_port_mixer_controls)),
1743 SND_SOC_DAPM_MIXER("SEC_I2S_RX Port Mixer",
1744 SND_SOC_NOPM, 0, 0, sec_i2s_rx_port_mixer_controls,
1745 ARRAY_SIZE(sec_i2s_rx_port_mixer_controls)),
1746 SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Port Mixer",
1747 SND_SOC_NOPM, 0, 0, sbus_3_rx_port_mixer_controls,
1748 ARRAY_SIZE(sbus_3_rx_port_mixer_controls)),
1749 SND_SOC_DAPM_MIXER("MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1750 mi2s_rx_port_mixer_controls, ARRAY_SIZE(mi2s_rx_port_mixer_controls)),
1751
1752 /* Virtual Pins to force backends ON atm */
1753 SND_SOC_DAPM_OUTPUT("BE_OUT"),
1754 SND_SOC_DAPM_INPUT("BE_IN"),
1755
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001756};
1757
1758static const struct snd_soc_dapm_route intercon[] = {
1759 {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1760 {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1761 {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1762 {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1763 {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
1764
1765 {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1766 {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1767 {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1768 {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1769 {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
1770
1771 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1772 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1773 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1774 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1775 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
1776
1777 {"HDMI Mixer", "MultiMedia1", "MM_DL1"},
1778 {"HDMI Mixer", "MultiMedia2", "MM_DL2"},
1779 {"HDMI Mixer", "MultiMedia3", "MM_DL3"},
1780 {"HDMI Mixer", "MultiMedia4", "MM_DL4"},
1781 {"HDMI", NULL, "HDMI Mixer"},
1782
1783 /* incall */
1784 {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"},
1785 {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
1786 {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001787 {"SLIMBUS_4_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1788 {"SLIMBUS_4_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1789 {"SLIMBUS_4_RX", NULL, "SLIMBUS_4_RX Audio Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001790
1791 {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
1792 {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001793 {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001794 {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1795 {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1796 {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1797 {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1798 {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
1799
1800 {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001801 {"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"},
1802 {"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001803 {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1804 {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1805
1806 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1807 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1808 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1809 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1810 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
1811
1812 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1813 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1814 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1815 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1816 {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"},
1817
1818 {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1819 {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1820 {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1821 {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1822 {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
1823
1824 {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1825 {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1826
1827 {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
1828 {"MM_UL1", NULL, "MultiMedia1 Mixer"},
1829 {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1830 {"MM_UL2", NULL, "MultiMedia2 Mixer"},
1831
1832 {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1833 {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1834 {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1835 {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1836 {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"},
1837
1838 {"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001839 {"PRI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001840 {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1841 {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
1842
1843 {"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001844 {"SEC_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001845 {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
1846 {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
1847
1848 {"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001849 {"SLIM_0_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001850 {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
1851 {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
1852
1853 {"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001854 {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001855 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
1856 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
1857
1858 {"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001859 {"AFE_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001860 {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1861 {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
1862
1863 {"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001864 {"AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001865 {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1866 {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
1867
1868 {"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001869 {"HDMI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001870 {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1871 {"HDMI", NULL, "HDMI_RX_Voice Mixer"},
1872 {"HDMI", NULL, "HDMI_DL_HL"},
1873
1874 {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001875 {"Voice_Tx Mixer", "MI2S_TX_Voice", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001876 {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
1877 {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
1878 {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
1879 {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
1880 {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001881 {"VoLTE_Tx Mixer", "PRI_TX_VoLTE", "PRI_I2S_TX"},
1882 {"VoLTE_Tx Mixer", "SLIM_0_TX_VoLTE", "SLIMBUS_0_TX"},
1883 {"VoLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_VoLTE", "INT_BT_SCO_TX"},
1884 {"VoLTE_Tx Mixer", "AFE_PCM_TX_VoLTE", "PCM_TX"},
1885 {"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
1886 {"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001887 {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001888 {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001889 {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
1890 {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"},
1891 {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"},
1892 {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
1893
1894 {"VOIP_UL", NULL, "Voip_Tx Mixer"},
1895 {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
1896 {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
1897 {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
1898 {"INT_FM_RX", NULL, "INTFM_DL_HL"},
1899 {"INTFM_UL_HL", NULL, "INT_FM_TX"},
1900 {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
1901 {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001902 {"PCM_RX_DL_HL", "Switch", "SLIM0_DL_HL"},
1903 {"PCM_RX", NULL, "PCM_RX_DL_HL"},
1904 {"MI2S_UL_HL", NULL, "MI2S_TX"},
1905 {"SEC_I2S_RX", NULL, "SEC_I2S_DL_HL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001906 {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1907 {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1908 {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001909 {"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001910 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001911 {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1912 {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001913
1914 {"AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1915 {"AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1916 {"AUX_PCM_RX", NULL, "AUXPCM_RX Port Mixer"},
1917
1918 {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
1919 {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1920 {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001921 {"Voice Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"},
1922 {"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001923 {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"},
1924
1925 {"STUB_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1926 {"STUB_RX", NULL, "STUB_RX Mixer"},
1927 {"SLIMBUS_1_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1928 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"},
1929 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001930 {"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1931 {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"},
1932
1933 {"SLIMBUS_3_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1934 {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001935
1936 {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1937 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"},
1938 {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1939 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001940 {"SLIMBUS_3_RX Port Mixer", "INTERNAL_BT_SCO_RX", "INT_BT_SCO_RX"},
1941 {"SLIMBUS_3_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1942 {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX Port Mixer"},
1943
1944
1945 {"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1946 {"HDMI", NULL, "HDMI_RX Port Mixer"},
1947
1948 {"SEC_I2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1949 {"SEC_I2S_RX", NULL, "SEC_I2S_RX Port Mixer"},
1950
1951 {"MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1952 {"MI2S_RX", NULL, "MI2S_RX Port Mixer"},
1953 /* Backend Enablement */
1954
1955 {"BE_OUT", NULL, "PRI_I2S_RX"},
1956 {"BE_OUT", NULL, "SEC_I2S_RX"},
1957 {"BE_OUT", NULL, "SLIMBUS_0_RX"},
1958 {"BE_OUT", NULL, "HDMI"},
1959 {"BE_OUT", NULL, "MI2S_RX"},
1960 {"PRI_I2S_TX", NULL, "BE_IN"},
1961 {"MI2S_TX", NULL, "BE_IN"},
1962 {"SLIMBUS_0_TX", NULL, "BE_IN" },
1963 {"BE_OUT", NULL, "INT_BT_SCO_RX"},
1964 {"INT_BT_SCO_TX", NULL, "BE_IN"},
1965 {"BE_OUT", NULL, "INT_FM_RX"},
1966 {"INT_FM_TX", NULL, "BE_IN"},
1967 {"BE_OUT", NULL, "PCM_RX"},
1968 {"PCM_TX", NULL, "BE_IN"},
1969 {"BE_OUT", NULL, "SLIMBUS_3_RX"},
1970 {"BE_OUT", NULL, "AUX_PCM_RX"},
1971 {"AUX_PCM_TX", NULL, "BE_IN"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001972};
1973
1974static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,
1975 struct snd_pcm_hw_params *params)
1976{
1977 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1978 unsigned int be_id = rtd->dai_link->be_id;
1979
1980 if (be_id >= MSM_BACKEND_DAI_MAX) {
1981 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1982 return -EINVAL;
1983 }
1984
1985 mutex_lock(&routing_lock);
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001986 msm_bedais[be_id].sample_rate = params_rate(params);
1987 msm_bedais[be_id].channel = params_channels(params);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001988 mutex_unlock(&routing_lock);
1989 return 0;
1990}
1991
1992static int msm_pcm_routing_close(struct snd_pcm_substream *substream)
1993{
1994 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1995 unsigned int be_id = rtd->dai_link->be_id;
1996 int i, session_type;
1997 struct msm_pcm_routing_bdai_data *bedai;
1998
1999 if (be_id >= MSM_BACKEND_DAI_MAX) {
2000 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
2001 return -EINVAL;
2002 }
2003
2004 bedai = &msm_bedais[be_id];
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002005 session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
2006 0 : 1);
2007
2008 mutex_lock(&routing_lock);
2009
2010 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
2011 if (fe_dai_map[i][session_type] != INVALID_SESSION)
2012 adm_close(bedai->port_id);
2013 }
2014
2015 bedai->active = 0;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002016 bedai->sample_rate = 0;
2017 bedai->channel = 0;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002018 mutex_unlock(&routing_lock);
2019
2020 return 0;
2021}
2022
2023static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
2024{
2025 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2026 unsigned int be_id = rtd->dai_link->be_id;
2027 int i, path_type, session_type;
2028 struct msm_pcm_routing_bdai_data *bedai;
2029 u32 channels;
2030
2031 if (be_id >= MSM_BACKEND_DAI_MAX) {
2032 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
2033 return -EINVAL;
2034 }
2035
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002036 bedai = &msm_bedais[be_id];
2037
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002038 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2039 path_type = ADM_PATH_PLAYBACK;
2040 session_type = SESSION_TYPE_RX;
2041 } else {
2042 path_type = ADM_PATH_LIVE_REC;
2043 session_type = SESSION_TYPE_TX;
2044 }
2045
2046 mutex_lock(&routing_lock);
2047
2048 if (bedai->active == 1)
2049 goto done; /* Ignore prepare if back-end already active */
2050
2051 /* AFE port is not active at this point. However, still
2052 * go ahead setting active flag under the notion that
2053 * QDSP6 is able to handle ADM starting before AFE port
2054 * is started.
2055 */
2056 bedai->active = 1;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002057 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
2058 if (fe_dai_map[i][session_type] != INVALID_SESSION) {
2059
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002060 channels = bedai->channel;
2061 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
2062 substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2063 && (channels > 2))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002064 adm_multi_ch_copp_open(bedai->port_id,
2065 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002066 bedai->sample_rate,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002067 channels,
2068 DEFAULT_COPP_TOPOLOGY);
2069 else
2070 adm_open(bedai->port_id,
2071 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002072 bedai->sample_rate,
2073 channels,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002074 DEFAULT_COPP_TOPOLOGY);
2075
2076 msm_pcm_routing_build_matrix(i,
2077 fe_dai_map[i][session_type], path_type);
2078 }
2079 }
2080
2081done:
2082 mutex_unlock(&routing_lock);
2083
2084 return 0;
2085}
2086
2087static struct snd_pcm_ops msm_routing_pcm_ops = {
2088 .hw_params = msm_pcm_routing_hw_params,
2089 .close = msm_pcm_routing_close,
2090 .prepare = msm_pcm_routing_prepare,
2091};
2092
2093static unsigned int msm_routing_read(struct snd_soc_platform *platform,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002094 unsigned int reg)
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002095{
2096 dev_dbg(platform->dev, "reg %x\n", reg);
2097 return 0;
2098}
2099
2100/* Not used but frame seems to require it */
2101static int msm_routing_write(struct snd_soc_platform *platform,
2102 unsigned int reg, unsigned int val)
2103{
2104 dev_dbg(platform->dev, "reg %x val %x\n", reg, val);
2105 return 0;
2106}
2107
2108/* Not used but frame seems to require it */
2109static int msm_routing_probe(struct snd_soc_platform *platform)
2110{
2111 snd_soc_dapm_new_controls(&platform->dapm, msm_qdsp6_widgets,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002112 ARRAY_SIZE(msm_qdsp6_widgets));
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002113 snd_soc_dapm_add_routes(&platform->dapm, intercon,
2114 ARRAY_SIZE(intercon));
2115
2116 snd_soc_dapm_new_widgets(&platform->dapm);
2117
2118 snd_soc_add_platform_controls(platform,
2119 int_fm_vol_mixer_controls,
2120 ARRAY_SIZE(int_fm_vol_mixer_controls));
2121
2122 snd_soc_add_platform_controls(platform,
2123 lpa_vol_mixer_controls,
2124 ARRAY_SIZE(lpa_vol_mixer_controls));
2125
2126 snd_soc_add_platform_controls(platform,
2127 eq_enable_mixer_controls,
2128 ARRAY_SIZE(eq_enable_mixer_controls));
2129
2130 snd_soc_add_platform_controls(platform,
2131 eq_band_mixer_controls,
2132 ARRAY_SIZE(eq_band_mixer_controls));
2133
2134 snd_soc_add_platform_controls(platform,
2135 eq_coeff_mixer_controls,
2136 ARRAY_SIZE(eq_coeff_mixer_controls));
2137
2138 snd_soc_add_platform_controls(platform,
2139 multimedia2_vol_mixer_controls,
2140 ARRAY_SIZE(multimedia2_vol_mixer_controls));
2141
2142 snd_soc_add_platform_controls(platform,
2143 compressed_vol_mixer_controls,
2144 ARRAY_SIZE(compressed_vol_mixer_controls));
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002145 return 0;
2146}
2147
2148static struct snd_soc_platform_driver msm_soc_routing_platform = {
2149 .ops = &msm_routing_pcm_ops,
2150 .probe = msm_routing_probe,
2151 .read = msm_routing_read,
2152 .write = msm_routing_write,
2153};
2154
2155static __devinit int msm_routing_pcm_probe(struct platform_device *pdev)
2156{
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -07002157 if (pdev->dev.of_node)
2158 dev_set_name(&pdev->dev, "%s", "msm-pcm-routing");
2159
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002160 dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev));
2161 return snd_soc_register_platform(&pdev->dev,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002162 &msm_soc_routing_platform);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002163}
2164
2165static int msm_routing_pcm_remove(struct platform_device *pdev)
2166{
2167 snd_soc_unregister_platform(&pdev->dev);
2168 return 0;
2169}
2170
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -07002171static const struct of_device_id msm_pcm_routing_dt_match[] = {
2172 {.compatible = "qcom,msm-pcm-routing"},
2173 {}
2174};
2175MODULE_DEVICE_TABLE(of, msm_pcm_routing_dt_match);
2176
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002177static struct platform_driver msm_routing_pcm_driver = {
2178 .driver = {
2179 .name = "msm-pcm-routing",
2180 .owner = THIS_MODULE,
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -07002181 .of_match_table = msm_pcm_routing_dt_match,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002182 },
2183 .probe = msm_routing_pcm_probe,
2184 .remove = __devexit_p(msm_routing_pcm_remove),
2185};
2186
2187int msm_routing_check_backend_enabled(int fedai_id)
2188{
2189 int i;
2190 if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) {
2191 /* bad ID assigned in machine driver */
2192 pr_err("%s: bad MM ID\n", __func__);
2193 return 0;
2194 }
2195 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002196 if (test_bit(fedai_id, &msm_bedais[i].fe_sessions))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002197 return msm_bedais[i].active;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002198 }
2199 return 0;
2200}
2201
2202static int __init msm_soc_routing_platform_init(void)
2203{
2204 mutex_init(&routing_lock);
2205 return platform_driver_register(&msm_routing_pcm_driver);
2206}
2207module_init(msm_soc_routing_platform_init);
2208
2209static void __exit msm_soc_routing_platform_exit(void)
2210{
2211 platform_driver_unregister(&msm_routing_pcm_driver);
2212}
2213module_exit(msm_soc_routing_platform_exit);
2214
2215MODULE_DESCRIPTION("MSM routing platform driver");
2216MODULE_LICENSE("GPL v2");