blob: fbbb3a525660075a7a96d3a83985cd4590ccfffa [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) &&
Joonwoo Park6572ac52012-07-10 17:17:00 -0700220 (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))) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700223 mode = afe_get_port_type(msm_bedais[i].port_id);
Joonwoo Park6572ac52012-07-10 17:17:00 -0700224 adm_connect_afe_port(mode, dspst_id,
225 msm_bedais[i].port_id);
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700226 break;
227 }
228 }
229 mutex_unlock(&routing_lock);
230}
231
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700232void msm_pcm_routing_reg_phy_stream(int fedai_id, int dspst_id, int stream_type)
233{
234 int i, session_type, path_type, port_type;
235 struct route_payload payload;
236 u32 channels;
237
238 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
239 /* bad ID assigned in machine driver */
240 pr_err("%s: bad MM ID %d\n", __func__, fedai_id);
241 return;
242 }
243
244 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
245 session_type = SESSION_TYPE_RX;
246 path_type = ADM_PATH_PLAYBACK;
247 port_type = MSM_AFE_PORT_TYPE_RX;
248 } else {
249 session_type = SESSION_TYPE_TX;
250 path_type = ADM_PATH_LIVE_REC;
251 port_type = MSM_AFE_PORT_TYPE_TX;
252 }
253
254 mutex_lock(&routing_lock);
255
256 payload.num_copps = 0; /* only RX needs to use payload */
257 fe_dai_map[fedai_id][session_type] = dspst_id;
258 /* re-enable EQ if active */
259 if (eq_data[fedai_id].enable)
260 msm_send_eq_values(fedai_id);
261 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700262 if (!is_be_dai_extproc(i) &&
263 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
264 (msm_bedais[i].active) &&
265 (test_bit(fedai_id, &msm_bedais[i].fe_sessions))) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700266
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700267 channels = msm_bedais[i].channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700268
269 if ((stream_type == SNDRV_PCM_STREAM_PLAYBACK) &&
270 (channels > 2))
271 adm_multi_ch_copp_open(msm_bedais[i].port_id,
272 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700273 msm_bedais[i].sample_rate,
274 msm_bedais[i].channel,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700275 DEFAULT_COPP_TOPOLOGY);
276 else
277 adm_open(msm_bedais[i].port_id,
278 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700279 msm_bedais[i].sample_rate,
280 msm_bedais[i].channel,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700281 DEFAULT_COPP_TOPOLOGY);
282
283 payload.copp_ids[payload.num_copps++] =
284 msm_bedais[i].port_id;
285 }
286 }
287 if (payload.num_copps)
288 adm_matrix_map(dspst_id, path_type,
289 payload.num_copps, payload.copp_ids, 0);
290
291 mutex_unlock(&routing_lock);
292}
293
294void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type)
295{
296 int i, port_type, session_type;
297
298 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
299 /* bad ID assigned in machine driver */
300 pr_err("%s: bad MM ID\n", __func__);
301 return;
302 }
303
304 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
305 port_type = MSM_AFE_PORT_TYPE_RX;
306 session_type = SESSION_TYPE_RX;
307 } else {
308 port_type = MSM_AFE_PORT_TYPE_TX;
309 session_type = SESSION_TYPE_TX;
310 }
311
312 mutex_lock(&routing_lock);
313
314 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700315 if (!is_be_dai_extproc(i) &&
316 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
317 (msm_bedais[i].active) &&
318 (test_bit(fedai_id, &msm_bedais[i].fe_sessions)))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700319 adm_close(msm_bedais[i].port_id);
320 }
321
322 fe_dai_map[fedai_id][session_type] = INVALID_SESSION;
323
324 mutex_unlock(&routing_lock);
325}
326
327/* Check if FE/BE route is set */
328static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id)
329{
330 bool rc = false;
331
332 if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
333 /* recheck FE ID in the mixer control defined in this file */
334 pr_err("%s: bad MM ID\n", __func__);
335 return rc;
336 }
337
338 if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions))
339 rc = true;
340
341 return rc;
342}
343
344static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
345{
346 int session_type, path_type;
347 u32 channels;
348
349 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
350
351 if (val > MSM_FRONTEND_DAI_MM_MAX_ID) {
352 /* recheck FE ID in the mixer control defined in this file */
353 pr_err("%s: bad MM ID\n", __func__);
354 return;
355 }
356
357 if (afe_get_port_type(msm_bedais[reg].port_id) ==
358 MSM_AFE_PORT_TYPE_RX) {
359 session_type = SESSION_TYPE_RX;
360 path_type = ADM_PATH_PLAYBACK;
361 } else {
362 session_type = SESSION_TYPE_TX;
363 path_type = ADM_PATH_LIVE_REC;
364 }
365
366 mutex_lock(&routing_lock);
367
368 if (set) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700369 if (!test_bit(val, &msm_bedais[reg].fe_sessions) &&
370 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
371 voc_start_playback(set);
372
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700373 set_bit(val, &msm_bedais[reg].fe_sessions);
374 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
375 INVALID_SESSION) {
376
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700377 channels = msm_bedais[reg].channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700378
379 if ((session_type == SESSION_TYPE_RX) && (channels > 2))
380 adm_multi_ch_copp_open(msm_bedais[reg].port_id,
381 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700382 msm_bedais[reg].sample_rate,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700383 channels,
384 DEFAULT_COPP_TOPOLOGY);
385 else
386 adm_open(msm_bedais[reg].port_id,
387 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700388 msm_bedais[reg].sample_rate, channels,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700389 DEFAULT_COPP_TOPOLOGY);
390
391 msm_pcm_routing_build_matrix(val,
392 fe_dai_map[val][session_type], path_type);
393 }
394 } else {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700395 if (test_bit(val, &msm_bedais[reg].fe_sessions) &&
396 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
397 voc_start_playback(set);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700398 clear_bit(val, &msm_bedais[reg].fe_sessions);
399 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
400 INVALID_SESSION) {
401 adm_close(msm_bedais[reg].port_id);
402 msm_pcm_routing_build_matrix(val,
403 fe_dai_map[val][session_type], path_type);
404 }
405 }
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700406 if ((msm_bedais[reg].port_id == VOICE_RECORD_RX)
407 || (msm_bedais[reg].port_id == VOICE_RECORD_TX))
408 voc_start_record(msm_bedais[reg].port_id, set);
409
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700410 mutex_unlock(&routing_lock);
411}
412
413static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
414 struct snd_ctl_elem_value *ucontrol)
415{
416 struct soc_mixer_control *mc =
417 (struct soc_mixer_control *)kcontrol->private_value;
418
419 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
420 ucontrol->value.integer.value[0] = 1;
421 else
422 ucontrol->value.integer.value[0] = 0;
423
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700424 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700425 ucontrol->value.integer.value[0]);
426
427 return 0;
428}
429
430static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
431 struct snd_ctl_elem_value *ucontrol)
432{
433 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
434 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
435 struct soc_mixer_control *mc =
436 (struct soc_mixer_control *)kcontrol->private_value;
437
438
439 if (ucontrol->value.integer.value[0] &&
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700440 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == false) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700441 msm_pcm_routing_process_audio(mc->reg, mc->shift, 1);
442 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
443 } else if (!ucontrol->value.integer.value[0] &&
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700444 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == true) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700445 msm_pcm_routing_process_audio(mc->reg, mc->shift, 0);
446 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
447 }
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700448
449 return 1;
450}
451
452static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
453{
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700454 u16 session_id = 0;
455
456 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
457
458 if (val == MSM_FRONTEND_DAI_CS_VOICE)
459 session_id = voc_get_session_id(VOICE_SESSION_NAME);
460 else if (val == MSM_FRONTEND_DAI_VOLTE)
461 session_id = voc_get_session_id(VOLTE_SESSION_NAME);
462 else
463 session_id = voc_get_session_id(VOIP_SESSION_NAME);
464
465 pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
466 __func__, val, session_id);
467
468 mutex_lock(&routing_lock);
469
470 if (set)
471 set_bit(val, &msm_bedais[reg].fe_sessions);
472 else
473 clear_bit(val, &msm_bedais[reg].fe_sessions);
474
475 mutex_unlock(&routing_lock);
476
477 if (afe_get_port_type(msm_bedais[reg].port_id) ==
478 MSM_AFE_PORT_TYPE_RX) {
479 voc_set_route_flag(session_id, RX_PATH, set);
480 if (set) {
481 voc_set_rxtx_port(session_id,
482 msm_bedais[reg].port_id, DEV_RX);
483
484 if (voc_get_route_flag(session_id, RX_PATH) &&
485 voc_get_route_flag(session_id, TX_PATH))
486 voc_enable_cvp(session_id);
487 } else {
488 voc_disable_cvp(session_id);
489 }
490 } else {
491 voc_set_route_flag(session_id, TX_PATH, set);
492 if (set) {
493 voc_set_rxtx_port(session_id,
494 msm_bedais[reg].port_id, DEV_TX);
495 if (voc_get_route_flag(session_id, RX_PATH) &&
496 voc_get_route_flag(session_id, TX_PATH))
497 voc_enable_cvp(session_id);
498 } else {
499 voc_disable_cvp(session_id);
500 }
501 }
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700502}
503
504static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol,
505 struct snd_ctl_elem_value *ucontrol)
506{
507 struct soc_mixer_control *mc =
508 (struct soc_mixer_control *)kcontrol->private_value;
509
510 mutex_lock(&routing_lock);
511
512 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
513 ucontrol->value.integer.value[0] = 1;
514 else
515 ucontrol->value.integer.value[0] = 0;
516
517 mutex_unlock(&routing_lock);
518
519 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
520 ucontrol->value.integer.value[0]);
521
522 return 0;
523}
524
525static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol,
526 struct snd_ctl_elem_value *ucontrol)
527{
528 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
529 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
530 struct soc_mixer_control *mc =
531 (struct soc_mixer_control *)kcontrol->private_value;
532
533 if (ucontrol->value.integer.value[0]) {
534 msm_pcm_routing_process_voice(mc->reg, mc->shift, 1);
535 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
536 } else {
537 msm_pcm_routing_process_voice(mc->reg, mc->shift, 0);
538 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
539 }
540
541 return 1;
542}
543
544static int msm_routing_get_voice_stub_mixer(struct snd_kcontrol *kcontrol,
545 struct snd_ctl_elem_value *ucontrol)
546{
547 struct soc_mixer_control *mc =
548 (struct soc_mixer_control *)kcontrol->private_value;
549
550 mutex_lock(&routing_lock);
551
552 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
553 ucontrol->value.integer.value[0] = 1;
554 else
555 ucontrol->value.integer.value[0] = 0;
556
557 mutex_unlock(&routing_lock);
558
559 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
560 ucontrol->value.integer.value[0]);
561
562 return 0;
563}
564
565static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol,
566 struct snd_ctl_elem_value *ucontrol)
567{
568 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
569 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
570 struct soc_mixer_control *mc =
571 (struct soc_mixer_control *)kcontrol->private_value;
572
573 if (ucontrol->value.integer.value[0]) {
574 mutex_lock(&routing_lock);
575 set_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
576 mutex_unlock(&routing_lock);
577
578 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
579 } else {
580 mutex_lock(&routing_lock);
581 clear_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
582 mutex_unlock(&routing_lock);
583
584 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
585 }
586
587 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
588 ucontrol->value.integer.value[0]);
589
590 return 1;
591}
592
593static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol,
594 struct snd_ctl_elem_value *ucontrol)
595{
596 ucontrol->value.integer.value[0] = fm_switch_enable;
597 pr_debug("%s: FM Switch enable %ld\n", __func__,
598 ucontrol->value.integer.value[0]);
599 return 0;
600}
601
602static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol,
603 struct snd_ctl_elem_value *ucontrol)
604{
605 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
606 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
607
608 pr_debug("%s: FM Switch enable %ld\n", __func__,
609 ucontrol->value.integer.value[0]);
610 if (ucontrol->value.integer.value[0])
611 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
612 else
613 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
614 fm_switch_enable = ucontrol->value.integer.value[0];
615 return 1;
616}
617
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700618static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
619 struct snd_ctl_elem_value *ucontrol)
620{
621 ucontrol->value.integer.value[0] = fm_pcmrx_switch_enable;
622 pr_debug("%s: FM Switch enable %ld\n", __func__,
623 ucontrol->value.integer.value[0]);
624 return 0;
625}
626
627static int msm_routing_put_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
628 struct snd_ctl_elem_value *ucontrol)
629{
630 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
631 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
632
633 pr_debug("%s: FM Switch enable %ld\n", __func__,
634 ucontrol->value.integer.value[0]);
635 if (ucontrol->value.integer.value[0])
636 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
637 else
638 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
639 fm_pcmrx_switch_enable = ucontrol->value.integer.value[0];
640 return 1;
641}
642
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700643static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol,
644 struct snd_ctl_elem_value *ucontrol)
645{
646 struct soc_mixer_control *mc =
647 (struct soc_mixer_control *)kcontrol->private_value;
648
649 if (test_bit(mc->shift, &msm_bedais[mc->reg].port_sessions))
650 ucontrol->value.integer.value[0] = 1;
651 else
652 ucontrol->value.integer.value[0] = 0;
653
654 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
655 ucontrol->value.integer.value[0]);
656
657 return 0;
658}
659
660static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol,
661 struct snd_ctl_elem_value *ucontrol)
662{
663 struct soc_mixer_control *mc =
664 (struct soc_mixer_control *)kcontrol->private_value;
665
666 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg,
667 mc->shift, ucontrol->value.integer.value[0]);
668
669 if (ucontrol->value.integer.value[0]) {
670 afe_loopback(1, msm_bedais[mc->reg].port_id,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700671 msm_bedais[mc->shift].port_id);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700672 set_bit(mc->shift,
673 &msm_bedais[mc->reg].port_sessions);
674 } else {
675 afe_loopback(0, msm_bedais[mc->reg].port_id,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700676 msm_bedais[mc->shift].port_id);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700677 clear_bit(mc->shift,
678 &msm_bedais[mc->reg].port_sessions);
679 }
680
681 return 1;
682}
683
684static int msm_routing_get_fm_vol_mixer(struct snd_kcontrol *kcontrol,
685 struct snd_ctl_elem_value *ucontrol)
686{
687 ucontrol->value.integer.value[0] = msm_route_fm_vol_control;
688 return 0;
689}
690
691static int msm_routing_set_fm_vol_mixer(struct snd_kcontrol *kcontrol,
692 struct snd_ctl_elem_value *ucontrol)
693{
694 afe_loopback_gain(INT_FM_TX , ucontrol->value.integer.value[0]);
695
696 msm_route_fm_vol_control = ucontrol->value.integer.value[0];
697
698 return 0;
699}
700
701static int msm_routing_get_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
702 struct snd_ctl_elem_value *ucontrol)
703{
704 ucontrol->value.integer.value[0] = msm_route_lpa_vol_control;
705 return 0;
706}
707
708static int msm_routing_set_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
709 struct snd_ctl_elem_value *ucontrol)
710{
711 if (!lpa_set_volume(ucontrol->value.integer.value[0]))
712 msm_route_lpa_vol_control =
713 ucontrol->value.integer.value[0];
714
715 return 0;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700716}
717
718static int msm_routing_get_multimedia2_vol_mixer(struct snd_kcontrol *kcontrol,
719 struct snd_ctl_elem_value *ucontrol)
720{
721
722 ucontrol->value.integer.value[0] = msm_route_multimedia2_vol_control;
723 return 0;
724}
725
726static int msm_routing_set_multimedia2_vol_mixer(struct snd_kcontrol *kcontrol,
727 struct snd_ctl_elem_value *ucontrol)
728{
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700729
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700730 if (!multi_ch_pcm_set_volume(ucontrol->value.integer.value[0]))
731 msm_route_multimedia2_vol_control =
732 ucontrol->value.integer.value[0];
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700733
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700734 return 0;
735}
736
737static int msm_routing_get_compressed_vol_mixer(struct snd_kcontrol *kcontrol,
738 struct snd_ctl_elem_value *ucontrol)
739{
740
741 ucontrol->value.integer.value[0] = msm_route_compressed_vol_control;
742 return 0;
743}
744
745static int msm_routing_set_compressed_vol_mixer(struct snd_kcontrol *kcontrol,
746 struct snd_ctl_elem_value *ucontrol)
747{
748 if (!compressed_set_volume(ucontrol->value.integer.value[0]))
749 msm_route_compressed_vol_control =
750 ucontrol->value.integer.value[0];
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700751
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700752 return 0;
753}
754
755static void msm_send_eq_values(int eq_idx)
756{
757 int result;
758 struct audio_client *ac =
759 q6asm_get_audio_client(fe_dai_map[eq_idx][SESSION_TYPE_RX]);
760
761 if (ac == NULL) {
762 pr_err("%s: Could not get audio client for session: %d\n",
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700763 __func__, fe_dai_map[eq_idx][SESSION_TYPE_RX]);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700764 goto done;
765 }
766
767 result = q6asm_equalizer(ac, &eq_data[eq_idx]);
768
769 if (result < 0)
770 pr_err("%s: Call to ASM equalizer failed, returned = %d\n",
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700771 __func__, result);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700772done:
773 return;
774}
775
776static int msm_routing_get_eq_enable_mixer(struct snd_kcontrol *kcontrol,
777 struct snd_ctl_elem_value *ucontrol)
778{
779 int eq_idx = ((struct soc_multi_mixer_control *)
780 kcontrol->private_value)->reg;
781
782 ucontrol->value.integer.value[0] = eq_data[eq_idx].enable;
783
784 pr_debug("%s: EQ #%d enable %d\n", __func__,
785 eq_idx, eq_data[eq_idx].enable);
786 return 0;
787}
788
789static int msm_routing_put_eq_enable_mixer(struct snd_kcontrol *kcontrol,
790 struct snd_ctl_elem_value *ucontrol)
791{
792 int eq_idx = ((struct soc_multi_mixer_control *)
793 kcontrol->private_value)->reg;
794 int value = ucontrol->value.integer.value[0];
795
796 pr_debug("%s: EQ #%d enable %d\n", __func__,
797 eq_idx, value);
798 eq_data[eq_idx].enable = value;
799
800 msm_send_eq_values(eq_idx);
801 return 0;
802}
803
804static int msm_routing_get_eq_band_count_audio_mixer(
805 struct snd_kcontrol *kcontrol,
806 struct snd_ctl_elem_value *ucontrol)
807{
808 int eq_idx = ((struct soc_multi_mixer_control *)
809 kcontrol->private_value)->reg;
810
811 ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands;
812
813 pr_debug("%s: EQ #%d bands %d\n", __func__,
814 eq_idx, eq_data[eq_idx].num_bands);
815 return eq_data[eq_idx].num_bands;
816}
817
818static int msm_routing_put_eq_band_count_audio_mixer(
819 struct snd_kcontrol *kcontrol,
820 struct snd_ctl_elem_value *ucontrol)
821{
822 int eq_idx = ((struct soc_multi_mixer_control *)
823 kcontrol->private_value)->reg;
824 int value = ucontrol->value.integer.value[0];
825
826 pr_debug("%s: EQ #%d bands %d\n", __func__,
827 eq_idx, value);
828 eq_data[eq_idx].num_bands = value;
829 return 0;
830}
831
832static int msm_routing_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
833 struct snd_ctl_elem_value *ucontrol)
834{
835 int eq_idx = ((struct soc_multi_mixer_control *)
836 kcontrol->private_value)->reg;
837 int band_idx = ((struct soc_multi_mixer_control *)
838 kcontrol->private_value)->shift;
839
840 ucontrol->value.integer.value[0] =
841 eq_data[eq_idx].eq_bands[band_idx].band_idx;
842 ucontrol->value.integer.value[1] =
843 eq_data[eq_idx].eq_bands[band_idx].filter_type;
844 ucontrol->value.integer.value[2] =
845 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz;
846 ucontrol->value.integer.value[3] =
847 eq_data[eq_idx].eq_bands[band_idx].filter_gain;
848 ucontrol->value.integer.value[4] =
849 eq_data[eq_idx].eq_bands[band_idx].q_factor;
850
851 pr_debug("%s: band_idx = %d\n", __func__,
852 eq_data[eq_idx].eq_bands[band_idx].band_idx);
853 pr_debug("%s: filter_type = %d\n", __func__,
854 eq_data[eq_idx].eq_bands[band_idx].filter_type);
855 pr_debug("%s: center_freq_hz = %d\n", __func__,
856 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz);
857 pr_debug("%s: filter_gain = %d\n", __func__,
858 eq_data[eq_idx].eq_bands[band_idx].filter_gain);
859 pr_debug("%s: q_factor = %d\n", __func__,
860 eq_data[eq_idx].eq_bands[band_idx].q_factor);
861 return 0;
862}
863
864static int msm_routing_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
865 struct snd_ctl_elem_value *ucontrol)
866{
867 int eq_idx = ((struct soc_multi_mixer_control *)
868 kcontrol->private_value)->reg;
869 int band_idx = ((struct soc_multi_mixer_control *)
870 kcontrol->private_value)->shift;
871
872 eq_data[eq_idx].eq_bands[band_idx].band_idx =
873 ucontrol->value.integer.value[0];
874 eq_data[eq_idx].eq_bands[band_idx].filter_type =
875 ucontrol->value.integer.value[1];
876 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz =
877 ucontrol->value.integer.value[2];
878 eq_data[eq_idx].eq_bands[band_idx].filter_gain =
879 ucontrol->value.integer.value[3];
880 eq_data[eq_idx].eq_bands[band_idx].q_factor =
881 ucontrol->value.integer.value[4];
882 return 0;
883}
884
885static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = {
886 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_I2S_RX ,
887 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
888 msm_routing_put_audio_mixer),
889 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_PRI_I2S_RX,
890 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
891 msm_routing_put_audio_mixer),
892 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_PRI_I2S_RX,
893 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
894 msm_routing_put_audio_mixer),
895 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_PRI_I2S_RX,
896 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
897 msm_routing_put_audio_mixer),
898};
899
900static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = {
901 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SEC_I2S_RX ,
902 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
903 msm_routing_put_audio_mixer),
904 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SEC_I2S_RX,
905 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
906 msm_routing_put_audio_mixer),
907 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SEC_I2S_RX,
908 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
909 msm_routing_put_audio_mixer),
910 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SEC_I2S_RX,
911 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
912 msm_routing_put_audio_mixer),
913};
914
915static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
916 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
917 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
918 msm_routing_put_audio_mixer),
919 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_0_RX,
920 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
921 msm_routing_put_audio_mixer),
922 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SLIMBUS_0_RX,
923 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
924 msm_routing_put_audio_mixer),
925 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SLIMBUS_0_RX,
926 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
927 msm_routing_put_audio_mixer),
928};
929
930static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = {
931 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_MI2S_RX ,
932 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
933 msm_routing_put_audio_mixer),
934 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_MI2S_RX,
935 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
936 msm_routing_put_audio_mixer),
937 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_MI2S_RX,
938 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
939 msm_routing_put_audio_mixer),
940 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_MI2S_RX,
941 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
942 msm_routing_put_audio_mixer),
943};
944
945static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
946 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_HDMI_RX,
947 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
948 msm_routing_put_audio_mixer),
949 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_HDMI_RX,
950 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
951 msm_routing_put_audio_mixer),
952 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_HDMI_RX,
953 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
954 msm_routing_put_audio_mixer),
955 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_HDMI_RX,
956 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
957 msm_routing_put_audio_mixer),
958};
959 /* incall music delivery mixer */
960static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = {
961 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
962 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
963 msm_routing_put_audio_mixer),
964 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
965 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
966 msm_routing_put_audio_mixer),
967};
968
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700969static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
970 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_4_RX,
971 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
972 msm_routing_put_audio_mixer),
973 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_4_RX,
974 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
975 msm_routing_put_audio_mixer),
976};
977
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700978static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
979 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_BT_SCO_RX,
980 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
981 msm_routing_put_audio_mixer),
982 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_BT_SCO_RX,
983 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
984 msm_routing_put_audio_mixer),
985 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_BT_SCO_RX,
986 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
987 msm_routing_put_audio_mixer),
988 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_BT_SCO_RX,
989 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
990 msm_routing_put_audio_mixer),
991};
992
993static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
994 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_FM_RX,
995 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
996 msm_routing_put_audio_mixer),
997 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_FM_RX,
998 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
999 msm_routing_put_audio_mixer),
1000 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_FM_RX,
1001 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1002 msm_routing_put_audio_mixer),
1003 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_FM_RX,
1004 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1005 msm_routing_put_audio_mixer),
1006};
1007
1008static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
1009 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
1010 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1011 msm_routing_put_audio_mixer),
1012 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
1013 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1014 msm_routing_put_audio_mixer),
1015 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AFE_PCM_RX,
1016 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1017 msm_routing_put_audio_mixer),
1018 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AFE_PCM_RX,
1019 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1020 msm_routing_put_audio_mixer),
1021};
1022
1023static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
1024 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AUXPCM_RX,
1025 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1026 msm_routing_put_audio_mixer),
1027 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AUXPCM_RX,
1028 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1029 msm_routing_put_audio_mixer),
1030 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AUXPCM_RX,
1031 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1032 msm_routing_put_audio_mixer),
1033 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AUXPCM_RX,
1034 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1035 msm_routing_put_audio_mixer),
1036};
1037
1038static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
1039 SOC_SINGLE_EXT("PRI_TX", MSM_BACKEND_DAI_PRI_I2S_TX,
1040 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1041 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001042 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1043 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1044 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001045 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1046 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1047 msm_routing_put_audio_mixer),
1048 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_TX,
1049 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1050 msm_routing_put_audio_mixer),
1051 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1052 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1053 msm_routing_put_audio_mixer),
1054 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
1055 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1056 msm_routing_put_audio_mixer),
1057 SOC_SINGLE_EXT("AFE_PCM_TX", MSM_BACKEND_DAI_AFE_PCM_TX,
1058 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1059 msm_routing_put_audio_mixer),
1060 SOC_SINGLE_EXT("VOC_REC_DL", MSM_BACKEND_DAI_INCALL_RECORD_RX,
1061 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1062 msm_routing_put_audio_mixer),
1063 SOC_SINGLE_EXT("VOC_REC_UL", MSM_BACKEND_DAI_INCALL_RECORD_TX,
1064 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1065 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001066 SOC_SINGLE_EXT("SLIM_4_TX", MSM_BACKEND_DAI_SLIMBUS_4_TX,
1067 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1068 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001069};
1070
1071static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
1072 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
1073 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1074 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001075 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1076 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1077 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001078};
1079
1080static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
1081 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_PRI_I2S_RX,
1082 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1083 msm_routing_put_voice_mixer),
1084 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_PRI_I2S_RX,
1085 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1086 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001087 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_PRI_I2S_RX,
1088 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1089 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001090};
1091
1092static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
1093 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SEC_I2S_RX,
1094 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1095 msm_routing_put_voice_mixer),
1096 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SEC_I2S_RX,
1097 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1098 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001099 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SEC_I2S_RX,
1100 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1101 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001102};
1103
1104static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
1105 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1106 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1107 msm_routing_put_voice_mixer),
1108 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
1109 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1110 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001111 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
1112 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1113 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001114};
1115
1116static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
1117 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1118 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1119 msm_routing_put_voice_mixer),
1120 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
1121 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1122 msm_routing_put_voice_mixer),
1123 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1124 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1125 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001126 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
1127 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1128 msm_routing_put_voice_mixer),
1129};
1130
1131static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = {
1132 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_MI2S_RX,
1133 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1134 msm_routing_put_voice_mixer),
1135 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_MI2S_RX,
1136 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1137 msm_routing_put_voice_mixer),
1138 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_MI2S_RX,
1139 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1140 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001141};
1142
1143static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
1144 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AFE_PCM_RX,
1145 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1146 msm_routing_put_voice_mixer),
1147 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AFE_PCM_RX,
1148 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1149 msm_routing_put_voice_mixer),
1150 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
1151 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1152 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001153 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AFE_PCM_RX,
1154 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1155 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001156};
1157
1158static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
1159 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AUXPCM_RX,
1160 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1161 msm_routing_put_voice_mixer),
1162 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AUXPCM_RX,
1163 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1164 msm_routing_put_voice_mixer),
1165 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AUXPCM_RX,
1166 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1167 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001168 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AUXPCM_RX,
1169 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1170 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001171};
1172
1173static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
1174 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_HDMI_RX,
1175 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1176 msm_routing_put_voice_mixer),
1177 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_HDMI_RX,
1178 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1179 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001180 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_HDMI_RX,
1181 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1182 msm_routing_put_voice_mixer),
1183 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_HDMI_RX,
1184 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1185 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001186};
1187
1188static const struct snd_kcontrol_new stub_rx_mixer_controls[] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001189 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_EXTPROC_RX,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001190 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1191 msm_routing_put_voice_stub_mixer),
1192};
1193
1194static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
1195 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1196 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1197 msm_routing_put_voice_stub_mixer),
1198};
1199
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001200static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
1201 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1202 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1203 msm_routing_put_voice_stub_mixer),
1204};
1205
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001206static const struct snd_kcontrol_new tx_voice_mixer_controls[] = {
1207 SOC_SINGLE_EXT("PRI_TX_Voice", MSM_BACKEND_DAI_PRI_I2S_TX,
1208 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1209 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001210 SOC_SINGLE_EXT("MI2S_TX_Voice", MSM_BACKEND_DAI_MI2S_TX,
1211 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1212 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001213 SOC_SINGLE_EXT("SLIM_0_TX_Voice", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1214 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1215 msm_routing_put_voice_mixer),
1216 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voice",
1217 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_CS_VOICE, 1, 0,
1218 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
1219 SOC_SINGLE_EXT("AFE_PCM_TX_Voice", MSM_BACKEND_DAI_AFE_PCM_TX,
1220 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1221 msm_routing_put_voice_mixer),
1222 SOC_SINGLE_EXT("AUX_PCM_TX_Voice", MSM_BACKEND_DAI_AUXPCM_TX,
1223 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1224 msm_routing_put_voice_mixer),
1225};
1226
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001227static const struct snd_kcontrol_new tx_volte_mixer_controls[] = {
1228 SOC_SINGLE_EXT("PRI_TX_VoLTE", MSM_BACKEND_DAI_PRI_I2S_TX,
1229 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1230 msm_routing_put_voice_mixer),
1231 SOC_SINGLE_EXT("SLIM_0_TX_VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1232 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1233 msm_routing_put_voice_mixer),
1234 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_VoLTE",
1235 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOLTE, 1, 0,
1236 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
1237 SOC_SINGLE_EXT("AFE_PCM_TX_VoLTE", MSM_BACKEND_DAI_AFE_PCM_TX,
1238 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1239 msm_routing_put_voice_mixer),
1240 SOC_SINGLE_EXT("AUX_PCM_TX_VoLTE", MSM_BACKEND_DAI_AUXPCM_TX,
1241 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1242 msm_routing_put_voice_mixer),
1243};
1244
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001245static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
1246 SOC_SINGLE_EXT("PRI_TX_Voip", MSM_BACKEND_DAI_PRI_I2S_TX,
1247 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1248 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001249 SOC_SINGLE_EXT("MI2S_TX_Voip", MSM_BACKEND_DAI_MI2S_TX,
1250 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1251 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001252 SOC_SINGLE_EXT("SLIM_0_TX_Voip", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1253 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1254 msm_routing_put_voice_mixer),
1255 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voip", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1256 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1257 msm_routing_put_voice_mixer),
1258 SOC_SINGLE_EXT("AFE_PCM_TX_Voip", MSM_BACKEND_DAI_AFE_PCM_TX,
1259 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1260 msm_routing_put_voice_mixer),
1261 SOC_SINGLE_EXT("AUX_PCM_TX_Voip", MSM_BACKEND_DAI_AUXPCM_TX,
1262 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1263 msm_routing_put_voice_mixer),
1264};
1265
1266static const struct snd_kcontrol_new tx_voice_stub_mixer_controls[] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001267 SOC_SINGLE_EXT("STUB_TX_HL", MSM_BACKEND_DAI_EXTPROC_TX,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001268 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1269 msm_routing_put_voice_stub_mixer),
1270 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1271 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1272 msm_routing_put_voice_stub_mixer),
1273 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_SLIMBUS_1_TX,
1274 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1275 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001276 SOC_SINGLE_EXT("STUB_1_TX_HL", MSM_BACKEND_DAI_EXTPROC_EC_TX,
1277 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1278 msm_routing_put_voice_stub_mixer),
1279 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1280 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1281 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001282};
1283
1284static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
1285 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1286 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1287 msm_routing_put_port_mixer),
1288 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1289 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1290 msm_routing_put_port_mixer),
1291 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1292 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1293 msm_routing_put_port_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001294 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1295 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1296 msm_routing_put_port_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001297};
1298
1299static const struct snd_kcontrol_new auxpcm_rx_port_mixer_controls[] = {
1300 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1301 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1302 msm_routing_put_port_mixer),
1303 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1304 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1305 msm_routing_put_port_mixer),
1306};
1307
1308static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = {
1309 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1310 MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
1311 msm_routing_put_port_mixer),
1312};
1313
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001314static const struct snd_kcontrol_new sbus_3_rx_port_mixer_controls[] = {
1315 SOC_SINGLE_EXT("INTERNAL_BT_SCO_RX", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1316 MSM_BACKEND_DAI_INT_BT_SCO_RX, 1, 0, msm_routing_get_port_mixer,
1317 msm_routing_put_port_mixer),
1318 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1319 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1320 msm_routing_put_port_mixer),
1321};
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001322static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = {
1323 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1324 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1325 msm_routing_put_port_mixer),
1326};
1327
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001328static const struct snd_kcontrol_new afe_pcm_rx_port_mixer_controls[] = {
1329 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_AFE_PCM_RX,
1330 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1331 msm_routing_put_port_mixer),
1332};
1333
1334
1335static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = {
1336 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_HDMI_RX,
1337 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1338 msm_routing_put_port_mixer),
1339};
1340
1341static const struct snd_kcontrol_new sec_i2s_rx_port_mixer_controls[] = {
1342 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SEC_I2S_RX,
1343 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1344 msm_routing_put_port_mixer),
1345};
1346
1347static const struct snd_kcontrol_new mi2s_rx_port_mixer_controls[] = {
1348 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_MI2S_RX,
1349 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1350 msm_routing_put_port_mixer),
1351};
1352
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001353static const struct snd_kcontrol_new fm_switch_mixer_controls =
1354 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1355 0, 1, 0, msm_routing_get_switch_mixer,
1356 msm_routing_put_switch_mixer);
1357
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001358static const struct snd_kcontrol_new pcm_rx_switch_mixer_controls =
1359 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1360 0, 1, 0, msm_routing_get_fm_pcmrx_switch_mixer,
1361 msm_routing_put_fm_pcmrx_switch_mixer);
1362
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001363static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
1364 SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001365 INT_RX_VOL_GAIN, 0, msm_routing_get_fm_vol_mixer,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001366 msm_routing_set_fm_vol_mixer, fm_rx_vol_gain),
1367};
1368
1369static const struct snd_kcontrol_new lpa_vol_mixer_controls[] = {
1370 SOC_SINGLE_EXT_TLV("LPA RX Volume", SND_SOC_NOPM, 0,
1371 INT_RX_VOL_GAIN, 0, msm_routing_get_lpa_vol_mixer,
1372 msm_routing_set_lpa_vol_mixer, lpa_rx_vol_gain),
1373};
1374
1375static const struct snd_kcontrol_new multimedia2_vol_mixer_controls[] = {
1376 SOC_SINGLE_EXT_TLV("HIFI2 RX Volume", SND_SOC_NOPM, 0,
1377 INT_RX_VOL_GAIN, 0, msm_routing_get_multimedia2_vol_mixer,
1378 msm_routing_set_multimedia2_vol_mixer, multimedia2_rx_vol_gain),
1379};
1380
1381static const struct snd_kcontrol_new compressed_vol_mixer_controls[] = {
1382 SOC_SINGLE_EXT_TLV("COMPRESSED RX Volume", SND_SOC_NOPM, 0,
1383 INT_RX_VOL_GAIN, 0, msm_routing_get_compressed_vol_mixer,
1384 msm_routing_set_compressed_vol_mixer, compressed_rx_vol_gain),
1385};
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001386static const struct snd_kcontrol_new eq_enable_mixer_controls[] = {
1387 SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM,
1388 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_eq_enable_mixer,
1389 msm_routing_put_eq_enable_mixer),
1390 SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM,
1391 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_eq_enable_mixer,
1392 msm_routing_put_eq_enable_mixer),
1393 SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM,
1394 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_eq_enable_mixer,
1395 msm_routing_put_eq_enable_mixer),
1396};
1397
1398static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
1399 SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM,
1400 MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0,
1401 msm_routing_get_eq_band_count_audio_mixer,
1402 msm_routing_put_eq_band_count_audio_mixer),
1403 SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM,
1404 MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0,
1405 msm_routing_get_eq_band_count_audio_mixer,
1406 msm_routing_put_eq_band_count_audio_mixer),
1407 SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM,
1408 MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0,
1409 msm_routing_get_eq_band_count_audio_mixer,
1410 msm_routing_put_eq_band_count_audio_mixer),
1411};
1412
1413static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = {
1414 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1,
1415 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1416 msm_routing_get_eq_band_audio_mixer,
1417 msm_routing_put_eq_band_audio_mixer),
1418 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2,
1419 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1420 msm_routing_get_eq_band_audio_mixer,
1421 msm_routing_put_eq_band_audio_mixer),
1422 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3,
1423 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1424 msm_routing_get_eq_band_audio_mixer,
1425 msm_routing_put_eq_band_audio_mixer),
1426 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4,
1427 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1428 msm_routing_get_eq_band_audio_mixer,
1429 msm_routing_put_eq_band_audio_mixer),
1430 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5,
1431 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1432 msm_routing_get_eq_band_audio_mixer,
1433 msm_routing_put_eq_band_audio_mixer),
1434 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6,
1435 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1436 msm_routing_get_eq_band_audio_mixer,
1437 msm_routing_put_eq_band_audio_mixer),
1438 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7,
1439 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1440 msm_routing_get_eq_band_audio_mixer,
1441 msm_routing_put_eq_band_audio_mixer),
1442 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8,
1443 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1444 msm_routing_get_eq_band_audio_mixer,
1445 msm_routing_put_eq_band_audio_mixer),
1446 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9,
1447 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1448 msm_routing_get_eq_band_audio_mixer,
1449 msm_routing_put_eq_band_audio_mixer),
1450 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10,
1451 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1452 msm_routing_get_eq_band_audio_mixer,
1453 msm_routing_put_eq_band_audio_mixer),
1454 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11,
1455 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1456 msm_routing_get_eq_band_audio_mixer,
1457 msm_routing_put_eq_band_audio_mixer),
1458 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12,
1459 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1460 msm_routing_get_eq_band_audio_mixer,
1461 msm_routing_put_eq_band_audio_mixer),
1462 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1,
1463 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1464 msm_routing_get_eq_band_audio_mixer,
1465 msm_routing_put_eq_band_audio_mixer),
1466 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2,
1467 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1468 msm_routing_get_eq_band_audio_mixer,
1469 msm_routing_put_eq_band_audio_mixer),
1470 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3,
1471 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1472 msm_routing_get_eq_band_audio_mixer,
1473 msm_routing_put_eq_band_audio_mixer),
1474 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4,
1475 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1476 msm_routing_get_eq_band_audio_mixer,
1477 msm_routing_put_eq_band_audio_mixer),
1478 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5,
1479 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1480 msm_routing_get_eq_band_audio_mixer,
1481 msm_routing_put_eq_band_audio_mixer),
1482 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6,
1483 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1484 msm_routing_get_eq_band_audio_mixer,
1485 msm_routing_put_eq_band_audio_mixer),
1486 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7,
1487 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1488 msm_routing_get_eq_band_audio_mixer,
1489 msm_routing_put_eq_band_audio_mixer),
1490 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8,
1491 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1492 msm_routing_get_eq_band_audio_mixer,
1493 msm_routing_put_eq_band_audio_mixer),
1494 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9,
1495 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1496 msm_routing_get_eq_band_audio_mixer,
1497 msm_routing_put_eq_band_audio_mixer),
1498 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10,
1499 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1500 msm_routing_get_eq_band_audio_mixer,
1501 msm_routing_put_eq_band_audio_mixer),
1502 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11,
1503 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1504 msm_routing_get_eq_band_audio_mixer,
1505 msm_routing_put_eq_band_audio_mixer),
1506 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12,
1507 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1508 msm_routing_get_eq_band_audio_mixer,
1509 msm_routing_put_eq_band_audio_mixer),
1510 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1,
1511 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1512 msm_routing_get_eq_band_audio_mixer,
1513 msm_routing_put_eq_band_audio_mixer),
1514 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2,
1515 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1516 msm_routing_get_eq_band_audio_mixer,
1517 msm_routing_put_eq_band_audio_mixer),
1518 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3,
1519 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1520 msm_routing_get_eq_band_audio_mixer,
1521 msm_routing_put_eq_band_audio_mixer),
1522 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4,
1523 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1524 msm_routing_get_eq_band_audio_mixer,
1525 msm_routing_put_eq_band_audio_mixer),
1526 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5,
1527 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1528 msm_routing_get_eq_band_audio_mixer,
1529 msm_routing_put_eq_band_audio_mixer),
1530 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6,
1531 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1532 msm_routing_get_eq_band_audio_mixer,
1533 msm_routing_put_eq_band_audio_mixer),
1534 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7,
1535 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1536 msm_routing_get_eq_band_audio_mixer,
1537 msm_routing_put_eq_band_audio_mixer),
1538 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8,
1539 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1540 msm_routing_get_eq_band_audio_mixer,
1541 msm_routing_put_eq_band_audio_mixer),
1542 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9,
1543 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1544 msm_routing_get_eq_band_audio_mixer,
1545 msm_routing_put_eq_band_audio_mixer),
1546 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10,
1547 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1548 msm_routing_get_eq_band_audio_mixer,
1549 msm_routing_put_eq_band_audio_mixer),
1550 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11,
1551 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1552 msm_routing_get_eq_band_audio_mixer,
1553 msm_routing_put_eq_band_audio_mixer),
1554 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12,
1555 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1556 msm_routing_get_eq_band_audio_mixer,
1557 msm_routing_put_eq_band_audio_mixer),
1558};
1559
1560static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
1561 /* Frontend AIF */
1562 /* Widget name equals to Front-End DAI name<Need confirmation>,
1563 * Stream name must contains substring of front-end dai name
1564 */
1565 SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0),
1566 SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0),
1567 SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0),
1568 SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0),
1569 SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
1570 SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
1571 SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
1572 SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, 0, 0, 0),
1573 SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001574 SND_SOC_DAPM_AIF_IN("VoLTE_DL", "VoLTE Playback", 0, 0, 0, 0),
1575 SND_SOC_DAPM_AIF_OUT("VoLTE_UL", "VoLTE Capture", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001576 SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
1577 SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
1578 0, 0, 0, 0),
1579 SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture",
1580 0, 0, 0, 0),
1581 SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback",
1582 0, 0, 0, 0),
1583 SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture",
1584 0, 0, 0, 0),
1585 SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001586 SND_SOC_DAPM_AIF_IN("SEC_I2S_DL_HL", "SEC_I2S_RX_HOSTLESS Playback",
1587 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001588 SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
1589 0, 0, 0, 0),
1590 SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture",
1591 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001592 SND_SOC_DAPM_AIF_OUT("MI2S_UL_HL", "MI2S_TX_HOSTLESS Capture",
1593 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001594
1595 /* Backend AIF */
1596 /* Stream name equals to backend dai link stream name
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001597 */
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001598 SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0),
1599 SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback",
1600 0, 0, 0 , 0),
1601 SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0),
1602 SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0 , 0),
1603 SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0),
1604 SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001605 SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001606 SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0),
1607 SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback",
1608 0, 0, 0 , 0),
1609 SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
1610 0, 0, 0, 0),
1611 SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
1612 0, 0, 0 , 0),
1613 SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
1614 0, 0, 0, 0),
1615 SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback",
1616 0, 0, 0 , 0),
1617 SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
1618 0, 0, 0 , 0),
1619 /* incall */
1620 SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
1621 0, 0, 0 , 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001622 SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback",
1623 0, 0, 0 , 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001624 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture",
1625 0, 0, 0, 0),
1626 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture",
1627 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001628 SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
1629 0, 0, 0, 0),
1630
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001631 SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
1632 SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
1633 SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
1634 SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
1635 SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0),
1636 SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0),
1637 SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0),
1638 SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001639 SND_SOC_DAPM_AIF_IN("STUB_1_TX", "Stub1 Capture", 0, 0, 0, 0),
1640 SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001641
1642 /* Switch Definitions */
1643 SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
1644 &fm_switch_mixer_controls),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001645 SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0,
1646 &pcm_rx_switch_mixer_controls),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001647 /* Mixer definitions */
1648 SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1649 pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
1650 SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1651 sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)),
1652 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1653 slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)),
1654 SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
1655 hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
1656 SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1657 mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)),
1658 SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
1659 mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
1660 SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
1661 mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
1662 SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1663 auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
1664 /* incall */
1665 SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
1666 incall_music_delivery_mixer_controls,
1667 ARRAY_SIZE(incall_music_delivery_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001668 SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1669 slimbus_4_rx_mixer_controls,
1670 ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001671 /* Voice Mixer */
1672 SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer",
1673 SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls,
1674 ARRAY_SIZE(pri_rx_voice_mixer_controls)),
1675 SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer",
1676 SND_SOC_NOPM, 0, 0,
1677 sec_i2s_rx_voice_mixer_controls,
1678 ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)),
1679 SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer",
1680 SND_SOC_NOPM, 0, 0,
1681 slimbus_rx_voice_mixer_controls,
1682 ARRAY_SIZE(slimbus_rx_voice_mixer_controls)),
1683 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer",
1684 SND_SOC_NOPM, 0, 0,
1685 bt_sco_rx_voice_mixer_controls,
1686 ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)),
1687 SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer",
1688 SND_SOC_NOPM, 0, 0,
1689 afe_pcm_rx_voice_mixer_controls,
1690 ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)),
1691 SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer",
1692 SND_SOC_NOPM, 0, 0,
1693 aux_pcm_rx_voice_mixer_controls,
1694 ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)),
1695 SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
1696 SND_SOC_NOPM, 0, 0,
1697 hdmi_rx_voice_mixer_controls,
1698 ARRAY_SIZE(hdmi_rx_voice_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001699 SND_SOC_DAPM_MIXER("MI2S_RX_Voice Mixer",
1700 SND_SOC_NOPM, 0, 0,
1701 mi2s_rx_voice_mixer_controls,
1702 ARRAY_SIZE(mi2s_rx_voice_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001703 SND_SOC_DAPM_MIXER("Voice_Tx Mixer",
1704 SND_SOC_NOPM, 0, 0, tx_voice_mixer_controls,
1705 ARRAY_SIZE(tx_voice_mixer_controls)),
1706 SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
1707 SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
1708 ARRAY_SIZE(tx_voip_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001709 SND_SOC_DAPM_MIXER("VoLTE_Tx Mixer",
1710 SND_SOC_NOPM, 0, 0, tx_volte_mixer_controls,
1711 ARRAY_SIZE(tx_volte_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001712 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1713 int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
1714 SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1715 int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
1716 SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1717 afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
1718 SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
1719 tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)),
1720 SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0,
1721 stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)),
1722 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0,
1723 slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001724 SND_SOC_DAPM_MIXER("SLIMBUS_3_RX_Voice Mixer", SND_SOC_NOPM, 0, 0,
1725 slimbus_3_rx_mixer_controls, ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001726 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer",
1727 SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls,
1728 ARRAY_SIZE(sbus_0_rx_port_mixer_controls)),
1729 SND_SOC_DAPM_MIXER("AUXPCM_RX Port Mixer",
1730 SND_SOC_NOPM, 0, 0, auxpcm_rx_port_mixer_controls,
1731 ARRAY_SIZE(auxpcm_rx_port_mixer_controls)),
1732 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1733 sbus_1_rx_port_mixer_controls,
1734 ARRAY_SIZE(sbus_1_rx_port_mixer_controls)),
1735 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1736 bt_sco_rx_port_mixer_controls,
1737 ARRAY_SIZE(bt_sco_rx_port_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001738 SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer",
1739 SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls,
1740 ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)),
1741 SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer",
1742 SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls,
1743 ARRAY_SIZE(hdmi_rx_port_mixer_controls)),
1744 SND_SOC_DAPM_MIXER("SEC_I2S_RX Port Mixer",
1745 SND_SOC_NOPM, 0, 0, sec_i2s_rx_port_mixer_controls,
1746 ARRAY_SIZE(sec_i2s_rx_port_mixer_controls)),
1747 SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Port Mixer",
1748 SND_SOC_NOPM, 0, 0, sbus_3_rx_port_mixer_controls,
1749 ARRAY_SIZE(sbus_3_rx_port_mixer_controls)),
1750 SND_SOC_DAPM_MIXER("MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1751 mi2s_rx_port_mixer_controls, ARRAY_SIZE(mi2s_rx_port_mixer_controls)),
1752
1753 /* Virtual Pins to force backends ON atm */
1754 SND_SOC_DAPM_OUTPUT("BE_OUT"),
1755 SND_SOC_DAPM_INPUT("BE_IN"),
1756
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001757};
1758
1759static const struct snd_soc_dapm_route intercon[] = {
1760 {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1761 {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1762 {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1763 {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1764 {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
1765
1766 {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1767 {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1768 {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1769 {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1770 {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
1771
1772 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1773 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1774 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1775 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1776 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
1777
1778 {"HDMI Mixer", "MultiMedia1", "MM_DL1"},
1779 {"HDMI Mixer", "MultiMedia2", "MM_DL2"},
1780 {"HDMI Mixer", "MultiMedia3", "MM_DL3"},
1781 {"HDMI Mixer", "MultiMedia4", "MM_DL4"},
1782 {"HDMI", NULL, "HDMI Mixer"},
1783
1784 /* incall */
1785 {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"},
1786 {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
1787 {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001788 {"SLIMBUS_4_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1789 {"SLIMBUS_4_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1790 {"SLIMBUS_4_RX", NULL, "SLIMBUS_4_RX Audio Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001791
1792 {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
1793 {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001794 {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001795 {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1796 {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1797 {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1798 {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1799 {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
1800
1801 {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001802 {"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"},
1803 {"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001804 {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1805 {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1806
1807 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1808 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1809 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1810 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1811 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
1812
1813 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1814 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1815 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1816 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1817 {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"},
1818
1819 {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1820 {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1821 {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1822 {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1823 {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
1824
1825 {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1826 {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1827
1828 {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
1829 {"MM_UL1", NULL, "MultiMedia1 Mixer"},
1830 {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1831 {"MM_UL2", NULL, "MultiMedia2 Mixer"},
1832
1833 {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1834 {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1835 {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1836 {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1837 {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"},
1838
1839 {"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001840 {"PRI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001841 {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1842 {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
1843
1844 {"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001845 {"SEC_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001846 {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
1847 {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
1848
1849 {"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001850 {"SLIM_0_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001851 {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
1852 {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
1853
1854 {"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001855 {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001856 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
1857 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
1858
1859 {"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001860 {"AFE_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001861 {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1862 {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
1863
1864 {"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001865 {"AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001866 {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1867 {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
1868
1869 {"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001870 {"HDMI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001871 {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1872 {"HDMI", NULL, "HDMI_RX_Voice Mixer"},
1873 {"HDMI", NULL, "HDMI_DL_HL"},
1874
1875 {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001876 {"Voice_Tx Mixer", "MI2S_TX_Voice", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001877 {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
1878 {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
1879 {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
1880 {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
1881 {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001882 {"VoLTE_Tx Mixer", "PRI_TX_VoLTE", "PRI_I2S_TX"},
1883 {"VoLTE_Tx Mixer", "SLIM_0_TX_VoLTE", "SLIMBUS_0_TX"},
1884 {"VoLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_VoLTE", "INT_BT_SCO_TX"},
1885 {"VoLTE_Tx Mixer", "AFE_PCM_TX_VoLTE", "PCM_TX"},
1886 {"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
1887 {"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001888 {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001889 {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001890 {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
1891 {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"},
1892 {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"},
1893 {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
1894
1895 {"VOIP_UL", NULL, "Voip_Tx Mixer"},
1896 {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
1897 {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
1898 {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
1899 {"INT_FM_RX", NULL, "INTFM_DL_HL"},
1900 {"INTFM_UL_HL", NULL, "INT_FM_TX"},
1901 {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
1902 {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001903 {"PCM_RX_DL_HL", "Switch", "SLIM0_DL_HL"},
1904 {"PCM_RX", NULL, "PCM_RX_DL_HL"},
1905 {"MI2S_UL_HL", NULL, "MI2S_TX"},
1906 {"SEC_I2S_RX", NULL, "SEC_I2S_DL_HL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001907 {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1908 {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1909 {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001910 {"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001911 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001912 {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1913 {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001914
1915 {"AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1916 {"AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1917 {"AUX_PCM_RX", NULL, "AUXPCM_RX Port Mixer"},
1918
1919 {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
1920 {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1921 {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001922 {"Voice Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"},
1923 {"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001924 {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"},
1925
1926 {"STUB_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1927 {"STUB_RX", NULL, "STUB_RX Mixer"},
1928 {"SLIMBUS_1_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1929 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"},
1930 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001931 {"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1932 {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"},
1933
1934 {"SLIMBUS_3_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1935 {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001936
1937 {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1938 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"},
1939 {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1940 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001941 {"SLIMBUS_3_RX Port Mixer", "INTERNAL_BT_SCO_RX", "INT_BT_SCO_RX"},
1942 {"SLIMBUS_3_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1943 {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX Port Mixer"},
1944
1945
1946 {"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1947 {"HDMI", NULL, "HDMI_RX Port Mixer"},
1948
1949 {"SEC_I2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1950 {"SEC_I2S_RX", NULL, "SEC_I2S_RX Port Mixer"},
1951
1952 {"MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1953 {"MI2S_RX", NULL, "MI2S_RX Port Mixer"},
1954 /* Backend Enablement */
1955
1956 {"BE_OUT", NULL, "PRI_I2S_RX"},
1957 {"BE_OUT", NULL, "SEC_I2S_RX"},
1958 {"BE_OUT", NULL, "SLIMBUS_0_RX"},
1959 {"BE_OUT", NULL, "HDMI"},
1960 {"BE_OUT", NULL, "MI2S_RX"},
1961 {"PRI_I2S_TX", NULL, "BE_IN"},
1962 {"MI2S_TX", NULL, "BE_IN"},
1963 {"SLIMBUS_0_TX", NULL, "BE_IN" },
1964 {"BE_OUT", NULL, "INT_BT_SCO_RX"},
1965 {"INT_BT_SCO_TX", NULL, "BE_IN"},
1966 {"BE_OUT", NULL, "INT_FM_RX"},
1967 {"INT_FM_TX", NULL, "BE_IN"},
1968 {"BE_OUT", NULL, "PCM_RX"},
1969 {"PCM_TX", NULL, "BE_IN"},
1970 {"BE_OUT", NULL, "SLIMBUS_3_RX"},
1971 {"BE_OUT", NULL, "AUX_PCM_RX"},
1972 {"AUX_PCM_TX", NULL, "BE_IN"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001973};
1974
1975static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,
1976 struct snd_pcm_hw_params *params)
1977{
1978 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1979 unsigned int be_id = rtd->dai_link->be_id;
1980
1981 if (be_id >= MSM_BACKEND_DAI_MAX) {
1982 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1983 return -EINVAL;
1984 }
1985
1986 mutex_lock(&routing_lock);
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001987 msm_bedais[be_id].sample_rate = params_rate(params);
1988 msm_bedais[be_id].channel = params_channels(params);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001989 mutex_unlock(&routing_lock);
1990 return 0;
1991}
1992
1993static int msm_pcm_routing_close(struct snd_pcm_substream *substream)
1994{
1995 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1996 unsigned int be_id = rtd->dai_link->be_id;
1997 int i, session_type;
1998 struct msm_pcm_routing_bdai_data *bedai;
1999
2000 if (be_id >= MSM_BACKEND_DAI_MAX) {
2001 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
2002 return -EINVAL;
2003 }
2004
2005 bedai = &msm_bedais[be_id];
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002006 session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
2007 0 : 1);
2008
2009 mutex_lock(&routing_lock);
2010
2011 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
2012 if (fe_dai_map[i][session_type] != INVALID_SESSION)
2013 adm_close(bedai->port_id);
2014 }
2015
2016 bedai->active = 0;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002017 bedai->sample_rate = 0;
2018 bedai->channel = 0;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002019 mutex_unlock(&routing_lock);
2020
2021 return 0;
2022}
2023
2024static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
2025{
2026 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2027 unsigned int be_id = rtd->dai_link->be_id;
2028 int i, path_type, session_type;
2029 struct msm_pcm_routing_bdai_data *bedai;
2030 u32 channels;
2031
2032 if (be_id >= MSM_BACKEND_DAI_MAX) {
2033 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
2034 return -EINVAL;
2035 }
2036
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002037 bedai = &msm_bedais[be_id];
2038
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002039 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2040 path_type = ADM_PATH_PLAYBACK;
2041 session_type = SESSION_TYPE_RX;
2042 } else {
2043 path_type = ADM_PATH_LIVE_REC;
2044 session_type = SESSION_TYPE_TX;
2045 }
2046
2047 mutex_lock(&routing_lock);
2048
2049 if (bedai->active == 1)
2050 goto done; /* Ignore prepare if back-end already active */
2051
2052 /* AFE port is not active at this point. However, still
2053 * go ahead setting active flag under the notion that
2054 * QDSP6 is able to handle ADM starting before AFE port
2055 * is started.
2056 */
2057 bedai->active = 1;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002058 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
2059 if (fe_dai_map[i][session_type] != INVALID_SESSION) {
2060
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002061 channels = bedai->channel;
2062 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
2063 substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2064 && (channels > 2))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002065 adm_multi_ch_copp_open(bedai->port_id,
2066 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002067 bedai->sample_rate,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002068 channels,
2069 DEFAULT_COPP_TOPOLOGY);
2070 else
2071 adm_open(bedai->port_id,
2072 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002073 bedai->sample_rate,
2074 channels,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002075 DEFAULT_COPP_TOPOLOGY);
2076
2077 msm_pcm_routing_build_matrix(i,
2078 fe_dai_map[i][session_type], path_type);
2079 }
2080 }
2081
2082done:
2083 mutex_unlock(&routing_lock);
2084
2085 return 0;
2086}
2087
2088static struct snd_pcm_ops msm_routing_pcm_ops = {
2089 .hw_params = msm_pcm_routing_hw_params,
2090 .close = msm_pcm_routing_close,
2091 .prepare = msm_pcm_routing_prepare,
2092};
2093
2094static unsigned int msm_routing_read(struct snd_soc_platform *platform,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002095 unsigned int reg)
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002096{
2097 dev_dbg(platform->dev, "reg %x\n", reg);
2098 return 0;
2099}
2100
2101/* Not used but frame seems to require it */
2102static int msm_routing_write(struct snd_soc_platform *platform,
2103 unsigned int reg, unsigned int val)
2104{
2105 dev_dbg(platform->dev, "reg %x val %x\n", reg, val);
2106 return 0;
2107}
2108
2109/* Not used but frame seems to require it */
2110static int msm_routing_probe(struct snd_soc_platform *platform)
2111{
2112 snd_soc_dapm_new_controls(&platform->dapm, msm_qdsp6_widgets,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002113 ARRAY_SIZE(msm_qdsp6_widgets));
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002114 snd_soc_dapm_add_routes(&platform->dapm, intercon,
2115 ARRAY_SIZE(intercon));
2116
2117 snd_soc_dapm_new_widgets(&platform->dapm);
2118
2119 snd_soc_add_platform_controls(platform,
2120 int_fm_vol_mixer_controls,
2121 ARRAY_SIZE(int_fm_vol_mixer_controls));
2122
2123 snd_soc_add_platform_controls(platform,
2124 lpa_vol_mixer_controls,
2125 ARRAY_SIZE(lpa_vol_mixer_controls));
2126
2127 snd_soc_add_platform_controls(platform,
2128 eq_enable_mixer_controls,
2129 ARRAY_SIZE(eq_enable_mixer_controls));
2130
2131 snd_soc_add_platform_controls(platform,
2132 eq_band_mixer_controls,
2133 ARRAY_SIZE(eq_band_mixer_controls));
2134
2135 snd_soc_add_platform_controls(platform,
2136 eq_coeff_mixer_controls,
2137 ARRAY_SIZE(eq_coeff_mixer_controls));
2138
2139 snd_soc_add_platform_controls(platform,
2140 multimedia2_vol_mixer_controls,
2141 ARRAY_SIZE(multimedia2_vol_mixer_controls));
2142
2143 snd_soc_add_platform_controls(platform,
2144 compressed_vol_mixer_controls,
2145 ARRAY_SIZE(compressed_vol_mixer_controls));
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002146 return 0;
2147}
2148
2149static struct snd_soc_platform_driver msm_soc_routing_platform = {
2150 .ops = &msm_routing_pcm_ops,
2151 .probe = msm_routing_probe,
2152 .read = msm_routing_read,
2153 .write = msm_routing_write,
2154};
2155
2156static __devinit int msm_routing_pcm_probe(struct platform_device *pdev)
2157{
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -07002158 if (pdev->dev.of_node)
2159 dev_set_name(&pdev->dev, "%s", "msm-pcm-routing");
2160
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002161 dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev));
2162 return snd_soc_register_platform(&pdev->dev,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002163 &msm_soc_routing_platform);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002164}
2165
2166static int msm_routing_pcm_remove(struct platform_device *pdev)
2167{
2168 snd_soc_unregister_platform(&pdev->dev);
2169 return 0;
2170}
2171
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -07002172static const struct of_device_id msm_pcm_routing_dt_match[] = {
2173 {.compatible = "qcom,msm-pcm-routing"},
2174 {}
2175};
2176MODULE_DEVICE_TABLE(of, msm_pcm_routing_dt_match);
2177
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002178static struct platform_driver msm_routing_pcm_driver = {
2179 .driver = {
2180 .name = "msm-pcm-routing",
2181 .owner = THIS_MODULE,
Phani Kumar Uppalapati87841c82012-06-14 21:28:43 -07002182 .of_match_table = msm_pcm_routing_dt_match,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002183 },
2184 .probe = msm_routing_pcm_probe,
2185 .remove = __devexit_p(msm_routing_pcm_remove),
2186};
2187
2188int msm_routing_check_backend_enabled(int fedai_id)
2189{
2190 int i;
2191 if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) {
2192 /* bad ID assigned in machine driver */
2193 pr_err("%s: bad MM ID\n", __func__);
2194 return 0;
2195 }
2196 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002197 if (test_bit(fedai_id, &msm_bedais[i].fe_sessions))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002198 return msm_bedais[i].active;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002199 }
2200 return 0;
2201}
2202
2203static int __init msm_soc_routing_platform_init(void)
2204{
2205 mutex_init(&routing_lock);
2206 return platform_driver_register(&msm_routing_pcm_driver);
2207}
2208module_init(msm_soc_routing_platform_init);
2209
2210static void __exit msm_soc_routing_platform_exit(void)
2211{
2212 platform_driver_unregister(&msm_routing_pcm_driver);
2213}
2214module_exit(msm_soc_routing_platform_exit);
2215
2216MODULE_DESCRIPTION("MSM routing platform driver");
2217MODULE_LICENSE("GPL v2");