blob: b7aaf01f02a733aa4a5be55987c1d83196a6964f [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>
21#include <sound/core.h>
22#include <sound/soc.h>
23#include <sound/soc-dapm.h>
24#include <sound/pcm.h>
25#include <sound/initval.h>
26#include <sound/control.h>
27#include <sound/q6adm-v2.h>
28#include <sound/q6asm-v2.h>
29#include <sound/q6afe-v2.h>
30#include <sound/tlv.h>
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070031
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070032#include "msm-pcm-routing-v2.h"
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070033#include "q6voice.h"
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070034
35struct msm_pcm_routing_bdai_data {
36 u16 port_id; /* AFE port ID */
37 u8 active; /* track if this backend is enabled */
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070038 unsigned long fe_sessions; /* Front-end sessions */
39 unsigned long port_sessions; /* track Tx BE ports -> Rx BE */
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070040 unsigned int sample_rate;
41 unsigned int channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070042};
43
44#define INVALID_SESSION -1
45#define SESSION_TYPE_RX 0
46#define SESSION_TYPE_TX 1
47
48static struct mutex routing_lock;
49
50static int fm_switch_enable;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070051static int fm_pcmrx_switch_enable;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070052
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070053#define INT_RX_VOL_MAX_STEPS 0x2000
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070054#define INT_RX_VOL_GAIN 0x2000
55
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070056static int msm_route_fm_vol_control;
57static const DECLARE_TLV_DB_LINEAR(fm_rx_vol_gain, 0,
58 INT_RX_VOL_MAX_STEPS);
59
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070060static int msm_route_lpa_vol_control;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070061static const DECLARE_TLV_DB_LINEAR(lpa_rx_vol_gain, 0,
62 INT_RX_VOL_MAX_STEPS);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070063
64static int msm_route_multimedia2_vol_control;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070065static const DECLARE_TLV_DB_LINEAR(multimedia2_rx_vol_gain, 0,
66 INT_RX_VOL_MAX_STEPS);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070067
68static int msm_route_compressed_vol_control;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -070069static const DECLARE_TLV_DB_LINEAR(compressed_rx_vol_gain, 0,
70 INT_RX_VOL_MAX_STEPS);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -070071
72
73
74/* Equal to Frontend after last of the MULTIMEDIA SESSIONS */
75#define MAX_EQ_SESSIONS MSM_FRONTEND_DAI_CS_VOICE
76
77enum {
78 EQ_BAND1 = 0,
79 EQ_BAND2,
80 EQ_BAND3,
81 EQ_BAND4,
82 EQ_BAND5,
83 EQ_BAND6,
84 EQ_BAND7,
85 EQ_BAND8,
86 EQ_BAND9,
87 EQ_BAND10,
88 EQ_BAND11,
89 EQ_BAND12,
90 EQ_BAND_MAX,
91};
92
93struct msm_audio_eq_band {
94 uint16_t band_idx; /* The band index, 0 .. 11 */
95 uint32_t filter_type; /* Filter band type */
96 uint32_t center_freq_hz; /* Filter band center frequency */
97 uint32_t filter_gain; /* Filter band initial gain (dB) */
98 /* Range is +12 dB to -12 dB with 1dB increments. */
99 uint32_t q_factor;
100} __packed;
101
102struct msm_audio_eq_stream_config {
103 uint32_t enable; /* Number of consequtive bands specified */
104 uint32_t num_bands;
105 struct msm_audio_eq_band eq_bands[EQ_BAND_MAX];
106} __packed;
107
108struct msm_audio_eq_stream_config eq_data[MAX_EQ_SESSIONS];
109
110static void msm_send_eq_values(int eq_idx);
111/* This array is indexed by back-end DAI ID defined in msm-pcm-routing.h
112 * If new back-end is defined, add new back-end DAI ID at the end of enum
113 */
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700114#define SLIMBUS_EXTPROC_RX AFE_PORT_INVALID
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700115static struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700116 { PRIMARY_I2S_RX, 0, 0, 0, 0, 0},
117 { PRIMARY_I2S_TX, 0, 0, 0, 0, 0},
118 { SLIMBUS_0_RX, 0, 0, 0, 0, 0},
119 { SLIMBUS_0_TX, 0, 0, 0, 0, 0},
120 { HDMI_RX, 0, 0, 0, 0, 0},
121 { INT_BT_SCO_RX, 0, 0, 0, 0, 0},
122 { INT_BT_SCO_TX, 0, 0, 0, 0, 0},
123 { INT_FM_RX, 0, 0, 0, 0, 0},
124 { INT_FM_TX, 0, 0, 0, 0, 0},
125 { RT_PROXY_PORT_001_RX, 0, 0, 0, 0, 0},
126 { RT_PROXY_PORT_001_TX, 0, 0, 0, 0, 0},
127 { PCM_RX, 0, 0, 0, 0, 0},
128 { PCM_TX, 0, 0, 0, 0, 0},
129 { VOICE_PLAYBACK_TX, 0, 0, 0, 0, 0},
130 { VOICE_RECORD_RX, 0, 0, 0, 0, 0},
131 { VOICE_RECORD_TX, 0, 0, 0, 0, 0},
132 { MI2S_RX, 0, 0, 0, 0, 0},
133 { MI2S_TX, 0, 0, 0, 0},
134 { SECONDARY_I2S_RX, 0, 0, 0, 0, 0},
135 { SLIMBUS_1_RX, 0, 0, 0, 0, 0},
136 { SLIMBUS_1_TX, 0, 0, 0, 0, 0},
137 { SLIMBUS_4_RX, 0, 0, 0, 0, 0},
138 { SLIMBUS_4_TX, 0, 0, 0, 0, 0},
139 { SLIMBUS_3_RX, 0, 0, 0, 0, 0},
140 { SLIMBUS_EXTPROC_RX, 0, 0, 0, 0, 0},
141 { SLIMBUS_EXTPROC_RX, 0, 0, 0, 0, 0},
142 { SLIMBUS_EXTPROC_RX, 0, 0, 0, 0, 0},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700143};
144
145
146/* Track ASM playback & capture sessions of DAI */
147static int fe_dai_map[MSM_FRONTEND_DAI_MM_SIZE][2] = {
148 /* MULTIMEDIA1 */
149 {INVALID_SESSION, INVALID_SESSION},
150 /* MULTIMEDIA2 */
151 {INVALID_SESSION, INVALID_SESSION},
152 /* MULTIMEDIA3 */
153 {INVALID_SESSION, INVALID_SESSION},
154 /* MULTIMEDIA4 */
155 {INVALID_SESSION, INVALID_SESSION},
156};
157
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700158static uint8_t is_be_dai_extproc(int be_dai)
159{
160 if (be_dai == MSM_BACKEND_DAI_EXTPROC_RX ||
161 be_dai == MSM_BACKEND_DAI_EXTPROC_TX ||
162 be_dai == MSM_BACKEND_DAI_EXTPROC_EC_TX)
163 return 1;
164 else
165 return 0;
166}
167
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700168static void msm_pcm_routing_build_matrix(int fedai_id, int dspst_id,
169 int path_type)
170{
171 int i, port_type;
172 struct route_payload payload;
173
174 payload.num_copps = 0;
175 port_type = (path_type == ADM_PATH_PLAYBACK ?
176 MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX);
177
178 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700179 if (!is_be_dai_extproc(i) &&
180 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
181 (msm_bedais[i].active) &&
182 (test_bit(fedai_id, &msm_bedais[i].fe_sessions)))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700183 payload.copp_ids[payload.num_copps++] =
184 msm_bedais[i].port_id;
185 }
186
187 if (payload.num_copps)
188 adm_matrix_map(dspst_id, path_type,
189 payload.num_copps, payload.copp_ids, 0);
190}
191
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700192void msm_pcm_routing_reg_psthr_stream(int fedai_id, int dspst_id,
193 int stream_type)
194{
195 int i, session_type, path_type, port_type;
196 u32 mode = 0;
197
198 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
199 /* bad ID assigned in machine driver */
200 pr_err("%s: bad MM ID\n", __func__);
201 return;
202 }
203
204 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
205 session_type = SESSION_TYPE_RX;
206 path_type = ADM_PATH_PLAYBACK;
207 port_type = MSM_AFE_PORT_TYPE_RX;
208 } else {
209 session_type = SESSION_TYPE_TX;
210 path_type = ADM_PATH_LIVE_REC;
211 port_type = MSM_AFE_PORT_TYPE_TX;
212 }
213
214 mutex_lock(&routing_lock);
215
216 fe_dai_map[fedai_id][session_type] = dspst_id;
217 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
218 if (!is_be_dai_extproc(i) &&
219 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
220 (msm_bedais[i].active) &&
221 (test_bit(fedai_id, &msm_bedais[i].fe_sessions))) {
222 mode = afe_get_port_type(msm_bedais[i].port_id);
223 /*adm_connect_afe_port needs to be called*/
224 break;
225 }
226 }
227 mutex_unlock(&routing_lock);
228}
229
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700230void msm_pcm_routing_reg_phy_stream(int fedai_id, int dspst_id, int stream_type)
231{
232 int i, session_type, path_type, port_type;
233 struct route_payload payload;
234 u32 channels;
235
236 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
237 /* bad ID assigned in machine driver */
238 pr_err("%s: bad MM ID %d\n", __func__, fedai_id);
239 return;
240 }
241
242 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
243 session_type = SESSION_TYPE_RX;
244 path_type = ADM_PATH_PLAYBACK;
245 port_type = MSM_AFE_PORT_TYPE_RX;
246 } else {
247 session_type = SESSION_TYPE_TX;
248 path_type = ADM_PATH_LIVE_REC;
249 port_type = MSM_AFE_PORT_TYPE_TX;
250 }
251
252 mutex_lock(&routing_lock);
253
254 payload.num_copps = 0; /* only RX needs to use payload */
255 fe_dai_map[fedai_id][session_type] = dspst_id;
256 /* re-enable EQ if active */
257 if (eq_data[fedai_id].enable)
258 msm_send_eq_values(fedai_id);
259 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700260 if (!is_be_dai_extproc(i) &&
261 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
262 (msm_bedais[i].active) &&
263 (test_bit(fedai_id, &msm_bedais[i].fe_sessions))) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700264
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700265 channels = msm_bedais[i].channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700266
267 if ((stream_type == SNDRV_PCM_STREAM_PLAYBACK) &&
268 (channels > 2))
269 adm_multi_ch_copp_open(msm_bedais[i].port_id,
270 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700271 msm_bedais[i].sample_rate,
272 msm_bedais[i].channel,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700273 DEFAULT_COPP_TOPOLOGY);
274 else
275 adm_open(msm_bedais[i].port_id,
276 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700277 msm_bedais[i].sample_rate,
278 msm_bedais[i].channel,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700279 DEFAULT_COPP_TOPOLOGY);
280
281 payload.copp_ids[payload.num_copps++] =
282 msm_bedais[i].port_id;
283 }
284 }
285 if (payload.num_copps)
286 adm_matrix_map(dspst_id, path_type,
287 payload.num_copps, payload.copp_ids, 0);
288
289 mutex_unlock(&routing_lock);
290}
291
292void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type)
293{
294 int i, port_type, session_type;
295
296 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
297 /* bad ID assigned in machine driver */
298 pr_err("%s: bad MM ID\n", __func__);
299 return;
300 }
301
302 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
303 port_type = MSM_AFE_PORT_TYPE_RX;
304 session_type = SESSION_TYPE_RX;
305 } else {
306 port_type = MSM_AFE_PORT_TYPE_TX;
307 session_type = SESSION_TYPE_TX;
308 }
309
310 mutex_lock(&routing_lock);
311
312 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700313 if (!is_be_dai_extproc(i) &&
314 (afe_get_port_type(msm_bedais[i].port_id) == port_type) &&
315 (msm_bedais[i].active) &&
316 (test_bit(fedai_id, &msm_bedais[i].fe_sessions)))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700317 adm_close(msm_bedais[i].port_id);
318 }
319
320 fe_dai_map[fedai_id][session_type] = INVALID_SESSION;
321
322 mutex_unlock(&routing_lock);
323}
324
325/* Check if FE/BE route is set */
326static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id)
327{
328 bool rc = false;
329
330 if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
331 /* recheck FE ID in the mixer control defined in this file */
332 pr_err("%s: bad MM ID\n", __func__);
333 return rc;
334 }
335
336 if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions))
337 rc = true;
338
339 return rc;
340}
341
342static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
343{
344 int session_type, path_type;
345 u32 channels;
346
347 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
348
349 if (val > MSM_FRONTEND_DAI_MM_MAX_ID) {
350 /* recheck FE ID in the mixer control defined in this file */
351 pr_err("%s: bad MM ID\n", __func__);
352 return;
353 }
354
355 if (afe_get_port_type(msm_bedais[reg].port_id) ==
356 MSM_AFE_PORT_TYPE_RX) {
357 session_type = SESSION_TYPE_RX;
358 path_type = ADM_PATH_PLAYBACK;
359 } else {
360 session_type = SESSION_TYPE_TX;
361 path_type = ADM_PATH_LIVE_REC;
362 }
363
364 mutex_lock(&routing_lock);
365
366 if (set) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700367 if (!test_bit(val, &msm_bedais[reg].fe_sessions) &&
368 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
369 voc_start_playback(set);
370
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700371 set_bit(val, &msm_bedais[reg].fe_sessions);
372 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
373 INVALID_SESSION) {
374
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700375 channels = msm_bedais[reg].channel;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700376
377 if ((session_type == SESSION_TYPE_RX) && (channels > 2))
378 adm_multi_ch_copp_open(msm_bedais[reg].port_id,
379 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700380 msm_bedais[reg].sample_rate,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700381 channels,
382 DEFAULT_COPP_TOPOLOGY);
383 else
384 adm_open(msm_bedais[reg].port_id,
385 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700386 msm_bedais[reg].sample_rate, channels,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700387 DEFAULT_COPP_TOPOLOGY);
388
389 msm_pcm_routing_build_matrix(val,
390 fe_dai_map[val][session_type], path_type);
391 }
392 } else {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700393 if (test_bit(val, &msm_bedais[reg].fe_sessions) &&
394 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
395 voc_start_playback(set);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700396 clear_bit(val, &msm_bedais[reg].fe_sessions);
397 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
398 INVALID_SESSION) {
399 adm_close(msm_bedais[reg].port_id);
400 msm_pcm_routing_build_matrix(val,
401 fe_dai_map[val][session_type], path_type);
402 }
403 }
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700404 if ((msm_bedais[reg].port_id == VOICE_RECORD_RX)
405 || (msm_bedais[reg].port_id == VOICE_RECORD_TX))
406 voc_start_record(msm_bedais[reg].port_id, set);
407
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700408 mutex_unlock(&routing_lock);
409}
410
411static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
412 struct snd_ctl_elem_value *ucontrol)
413{
414 struct soc_mixer_control *mc =
415 (struct soc_mixer_control *)kcontrol->private_value;
416
417 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
418 ucontrol->value.integer.value[0] = 1;
419 else
420 ucontrol->value.integer.value[0] = 0;
421
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700422 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700423 ucontrol->value.integer.value[0]);
424
425 return 0;
426}
427
428static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
429 struct snd_ctl_elem_value *ucontrol)
430{
431 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
432 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
433 struct soc_mixer_control *mc =
434 (struct soc_mixer_control *)kcontrol->private_value;
435
436
437 if (ucontrol->value.integer.value[0] &&
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700438 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == false) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700439 msm_pcm_routing_process_audio(mc->reg, mc->shift, 1);
440 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
441 } else if (!ucontrol->value.integer.value[0] &&
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700442 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == true) {
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700443 msm_pcm_routing_process_audio(mc->reg, mc->shift, 0);
444 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
445 }
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700446
447 return 1;
448}
449
450static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
451{
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700452 u16 session_id = 0;
453
454 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
455
456 if (val == MSM_FRONTEND_DAI_CS_VOICE)
457 session_id = voc_get_session_id(VOICE_SESSION_NAME);
458 else if (val == MSM_FRONTEND_DAI_VOLTE)
459 session_id = voc_get_session_id(VOLTE_SESSION_NAME);
460 else
461 session_id = voc_get_session_id(VOIP_SESSION_NAME);
462
463 pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
464 __func__, val, session_id);
465
466 mutex_lock(&routing_lock);
467
468 if (set)
469 set_bit(val, &msm_bedais[reg].fe_sessions);
470 else
471 clear_bit(val, &msm_bedais[reg].fe_sessions);
472
473 mutex_unlock(&routing_lock);
474
475 if (afe_get_port_type(msm_bedais[reg].port_id) ==
476 MSM_AFE_PORT_TYPE_RX) {
477 voc_set_route_flag(session_id, RX_PATH, set);
478 if (set) {
479 voc_set_rxtx_port(session_id,
480 msm_bedais[reg].port_id, DEV_RX);
481
482 if (voc_get_route_flag(session_id, RX_PATH) &&
483 voc_get_route_flag(session_id, TX_PATH))
484 voc_enable_cvp(session_id);
485 } else {
486 voc_disable_cvp(session_id);
487 }
488 } else {
489 voc_set_route_flag(session_id, TX_PATH, set);
490 if (set) {
491 voc_set_rxtx_port(session_id,
492 msm_bedais[reg].port_id, DEV_TX);
493 if (voc_get_route_flag(session_id, RX_PATH) &&
494 voc_get_route_flag(session_id, TX_PATH))
495 voc_enable_cvp(session_id);
496 } else {
497 voc_disable_cvp(session_id);
498 }
499 }
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700500}
501
502static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol,
503 struct snd_ctl_elem_value *ucontrol)
504{
505 struct soc_mixer_control *mc =
506 (struct soc_mixer_control *)kcontrol->private_value;
507
508 mutex_lock(&routing_lock);
509
510 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
511 ucontrol->value.integer.value[0] = 1;
512 else
513 ucontrol->value.integer.value[0] = 0;
514
515 mutex_unlock(&routing_lock);
516
517 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
518 ucontrol->value.integer.value[0]);
519
520 return 0;
521}
522
523static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol,
524 struct snd_ctl_elem_value *ucontrol)
525{
526 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
527 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
528 struct soc_mixer_control *mc =
529 (struct soc_mixer_control *)kcontrol->private_value;
530
531 if (ucontrol->value.integer.value[0]) {
532 msm_pcm_routing_process_voice(mc->reg, mc->shift, 1);
533 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
534 } else {
535 msm_pcm_routing_process_voice(mc->reg, mc->shift, 0);
536 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
537 }
538
539 return 1;
540}
541
542static int msm_routing_get_voice_stub_mixer(struct snd_kcontrol *kcontrol,
543 struct snd_ctl_elem_value *ucontrol)
544{
545 struct soc_mixer_control *mc =
546 (struct soc_mixer_control *)kcontrol->private_value;
547
548 mutex_lock(&routing_lock);
549
550 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
551 ucontrol->value.integer.value[0] = 1;
552 else
553 ucontrol->value.integer.value[0] = 0;
554
555 mutex_unlock(&routing_lock);
556
557 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
558 ucontrol->value.integer.value[0]);
559
560 return 0;
561}
562
563static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol,
564 struct snd_ctl_elem_value *ucontrol)
565{
566 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
567 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
568 struct soc_mixer_control *mc =
569 (struct soc_mixer_control *)kcontrol->private_value;
570
571 if (ucontrol->value.integer.value[0]) {
572 mutex_lock(&routing_lock);
573 set_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
574 mutex_unlock(&routing_lock);
575
576 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
577 } else {
578 mutex_lock(&routing_lock);
579 clear_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
580 mutex_unlock(&routing_lock);
581
582 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
583 }
584
585 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
586 ucontrol->value.integer.value[0]);
587
588 return 1;
589}
590
591static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol,
592 struct snd_ctl_elem_value *ucontrol)
593{
594 ucontrol->value.integer.value[0] = fm_switch_enable;
595 pr_debug("%s: FM Switch enable %ld\n", __func__,
596 ucontrol->value.integer.value[0]);
597 return 0;
598}
599
600static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol,
601 struct snd_ctl_elem_value *ucontrol)
602{
603 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
604 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
605
606 pr_debug("%s: FM Switch enable %ld\n", __func__,
607 ucontrol->value.integer.value[0]);
608 if (ucontrol->value.integer.value[0])
609 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
610 else
611 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
612 fm_switch_enable = ucontrol->value.integer.value[0];
613 return 1;
614}
615
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700616static int msm_routing_get_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
617 struct snd_ctl_elem_value *ucontrol)
618{
619 ucontrol->value.integer.value[0] = fm_pcmrx_switch_enable;
620 pr_debug("%s: FM Switch enable %ld\n", __func__,
621 ucontrol->value.integer.value[0]);
622 return 0;
623}
624
625static int msm_routing_put_fm_pcmrx_switch_mixer(struct snd_kcontrol *kcontrol,
626 struct snd_ctl_elem_value *ucontrol)
627{
628 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
629 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
630
631 pr_debug("%s: FM Switch enable %ld\n", __func__,
632 ucontrol->value.integer.value[0]);
633 if (ucontrol->value.integer.value[0])
634 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
635 else
636 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
637 fm_pcmrx_switch_enable = ucontrol->value.integer.value[0];
638 return 1;
639}
640
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700641static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol,
642 struct snd_ctl_elem_value *ucontrol)
643{
644 struct soc_mixer_control *mc =
645 (struct soc_mixer_control *)kcontrol->private_value;
646
647 if (test_bit(mc->shift, &msm_bedais[mc->reg].port_sessions))
648 ucontrol->value.integer.value[0] = 1;
649 else
650 ucontrol->value.integer.value[0] = 0;
651
652 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
653 ucontrol->value.integer.value[0]);
654
655 return 0;
656}
657
658static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol,
659 struct snd_ctl_elem_value *ucontrol)
660{
661 struct soc_mixer_control *mc =
662 (struct soc_mixer_control *)kcontrol->private_value;
663
664 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg,
665 mc->shift, ucontrol->value.integer.value[0]);
666
667 if (ucontrol->value.integer.value[0]) {
668 afe_loopback(1, msm_bedais[mc->reg].port_id,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700669 msm_bedais[mc->shift].port_id);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700670 set_bit(mc->shift,
671 &msm_bedais[mc->reg].port_sessions);
672 } else {
673 afe_loopback(0, msm_bedais[mc->reg].port_id,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700674 msm_bedais[mc->shift].port_id);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700675 clear_bit(mc->shift,
676 &msm_bedais[mc->reg].port_sessions);
677 }
678
679 return 1;
680}
681
682static int msm_routing_get_fm_vol_mixer(struct snd_kcontrol *kcontrol,
683 struct snd_ctl_elem_value *ucontrol)
684{
685 ucontrol->value.integer.value[0] = msm_route_fm_vol_control;
686 return 0;
687}
688
689static int msm_routing_set_fm_vol_mixer(struct snd_kcontrol *kcontrol,
690 struct snd_ctl_elem_value *ucontrol)
691{
692 afe_loopback_gain(INT_FM_TX , ucontrol->value.integer.value[0]);
693
694 msm_route_fm_vol_control = ucontrol->value.integer.value[0];
695
696 return 0;
697}
698
699static int msm_routing_get_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
700 struct snd_ctl_elem_value *ucontrol)
701{
702 ucontrol->value.integer.value[0] = msm_route_lpa_vol_control;
703 return 0;
704}
705
706static int msm_routing_set_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
707 struct snd_ctl_elem_value *ucontrol)
708{
709 if (!lpa_set_volume(ucontrol->value.integer.value[0]))
710 msm_route_lpa_vol_control =
711 ucontrol->value.integer.value[0];
712
713 return 0;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700714}
715
716static int msm_routing_get_multimedia2_vol_mixer(struct snd_kcontrol *kcontrol,
717 struct snd_ctl_elem_value *ucontrol)
718{
719
720 ucontrol->value.integer.value[0] = msm_route_multimedia2_vol_control;
721 return 0;
722}
723
724static int msm_routing_set_multimedia2_vol_mixer(struct snd_kcontrol *kcontrol,
725 struct snd_ctl_elem_value *ucontrol)
726{
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700727
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700728 if (!multi_ch_pcm_set_volume(ucontrol->value.integer.value[0]))
729 msm_route_multimedia2_vol_control =
730 ucontrol->value.integer.value[0];
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700731
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700732 return 0;
733}
734
735static int msm_routing_get_compressed_vol_mixer(struct snd_kcontrol *kcontrol,
736 struct snd_ctl_elem_value *ucontrol)
737{
738
739 ucontrol->value.integer.value[0] = msm_route_compressed_vol_control;
740 return 0;
741}
742
743static int msm_routing_set_compressed_vol_mixer(struct snd_kcontrol *kcontrol,
744 struct snd_ctl_elem_value *ucontrol)
745{
746 if (!compressed_set_volume(ucontrol->value.integer.value[0]))
747 msm_route_compressed_vol_control =
748 ucontrol->value.integer.value[0];
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700749
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700750 return 0;
751}
752
753static void msm_send_eq_values(int eq_idx)
754{
755 int result;
756 struct audio_client *ac =
757 q6asm_get_audio_client(fe_dai_map[eq_idx][SESSION_TYPE_RX]);
758
759 if (ac == NULL) {
760 pr_err("%s: Could not get audio client for session: %d\n",
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700761 __func__, fe_dai_map[eq_idx][SESSION_TYPE_RX]);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700762 goto done;
763 }
764
765 result = q6asm_equalizer(ac, &eq_data[eq_idx]);
766
767 if (result < 0)
768 pr_err("%s: Call to ASM equalizer failed, returned = %d\n",
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700769 __func__, result);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700770done:
771 return;
772}
773
774static int msm_routing_get_eq_enable_mixer(struct snd_kcontrol *kcontrol,
775 struct snd_ctl_elem_value *ucontrol)
776{
777 int eq_idx = ((struct soc_multi_mixer_control *)
778 kcontrol->private_value)->reg;
779
780 ucontrol->value.integer.value[0] = eq_data[eq_idx].enable;
781
782 pr_debug("%s: EQ #%d enable %d\n", __func__,
783 eq_idx, eq_data[eq_idx].enable);
784 return 0;
785}
786
787static int msm_routing_put_eq_enable_mixer(struct snd_kcontrol *kcontrol,
788 struct snd_ctl_elem_value *ucontrol)
789{
790 int eq_idx = ((struct soc_multi_mixer_control *)
791 kcontrol->private_value)->reg;
792 int value = ucontrol->value.integer.value[0];
793
794 pr_debug("%s: EQ #%d enable %d\n", __func__,
795 eq_idx, value);
796 eq_data[eq_idx].enable = value;
797
798 msm_send_eq_values(eq_idx);
799 return 0;
800}
801
802static int msm_routing_get_eq_band_count_audio_mixer(
803 struct snd_kcontrol *kcontrol,
804 struct snd_ctl_elem_value *ucontrol)
805{
806 int eq_idx = ((struct soc_multi_mixer_control *)
807 kcontrol->private_value)->reg;
808
809 ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands;
810
811 pr_debug("%s: EQ #%d bands %d\n", __func__,
812 eq_idx, eq_data[eq_idx].num_bands);
813 return eq_data[eq_idx].num_bands;
814}
815
816static int msm_routing_put_eq_band_count_audio_mixer(
817 struct snd_kcontrol *kcontrol,
818 struct snd_ctl_elem_value *ucontrol)
819{
820 int eq_idx = ((struct soc_multi_mixer_control *)
821 kcontrol->private_value)->reg;
822 int value = ucontrol->value.integer.value[0];
823
824 pr_debug("%s: EQ #%d bands %d\n", __func__,
825 eq_idx, value);
826 eq_data[eq_idx].num_bands = value;
827 return 0;
828}
829
830static int msm_routing_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
831 struct snd_ctl_elem_value *ucontrol)
832{
833 int eq_idx = ((struct soc_multi_mixer_control *)
834 kcontrol->private_value)->reg;
835 int band_idx = ((struct soc_multi_mixer_control *)
836 kcontrol->private_value)->shift;
837
838 ucontrol->value.integer.value[0] =
839 eq_data[eq_idx].eq_bands[band_idx].band_idx;
840 ucontrol->value.integer.value[1] =
841 eq_data[eq_idx].eq_bands[band_idx].filter_type;
842 ucontrol->value.integer.value[2] =
843 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz;
844 ucontrol->value.integer.value[3] =
845 eq_data[eq_idx].eq_bands[band_idx].filter_gain;
846 ucontrol->value.integer.value[4] =
847 eq_data[eq_idx].eq_bands[band_idx].q_factor;
848
849 pr_debug("%s: band_idx = %d\n", __func__,
850 eq_data[eq_idx].eq_bands[band_idx].band_idx);
851 pr_debug("%s: filter_type = %d\n", __func__,
852 eq_data[eq_idx].eq_bands[band_idx].filter_type);
853 pr_debug("%s: center_freq_hz = %d\n", __func__,
854 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz);
855 pr_debug("%s: filter_gain = %d\n", __func__,
856 eq_data[eq_idx].eq_bands[band_idx].filter_gain);
857 pr_debug("%s: q_factor = %d\n", __func__,
858 eq_data[eq_idx].eq_bands[band_idx].q_factor);
859 return 0;
860}
861
862static int msm_routing_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
863 struct snd_ctl_elem_value *ucontrol)
864{
865 int eq_idx = ((struct soc_multi_mixer_control *)
866 kcontrol->private_value)->reg;
867 int band_idx = ((struct soc_multi_mixer_control *)
868 kcontrol->private_value)->shift;
869
870 eq_data[eq_idx].eq_bands[band_idx].band_idx =
871 ucontrol->value.integer.value[0];
872 eq_data[eq_idx].eq_bands[band_idx].filter_type =
873 ucontrol->value.integer.value[1];
874 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz =
875 ucontrol->value.integer.value[2];
876 eq_data[eq_idx].eq_bands[band_idx].filter_gain =
877 ucontrol->value.integer.value[3];
878 eq_data[eq_idx].eq_bands[band_idx].q_factor =
879 ucontrol->value.integer.value[4];
880 return 0;
881}
882
883static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = {
884 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_I2S_RX ,
885 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
886 msm_routing_put_audio_mixer),
887 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_PRI_I2S_RX,
888 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
889 msm_routing_put_audio_mixer),
890 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_PRI_I2S_RX,
891 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
892 msm_routing_put_audio_mixer),
893 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_PRI_I2S_RX,
894 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
895 msm_routing_put_audio_mixer),
896};
897
898static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = {
899 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SEC_I2S_RX ,
900 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
901 msm_routing_put_audio_mixer),
902 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SEC_I2S_RX,
903 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
904 msm_routing_put_audio_mixer),
905 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SEC_I2S_RX,
906 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
907 msm_routing_put_audio_mixer),
908 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SEC_I2S_RX,
909 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
910 msm_routing_put_audio_mixer),
911};
912
913static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
914 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
915 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
916 msm_routing_put_audio_mixer),
917 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_0_RX,
918 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
919 msm_routing_put_audio_mixer),
920 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SLIMBUS_0_RX,
921 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
922 msm_routing_put_audio_mixer),
923 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SLIMBUS_0_RX,
924 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
925 msm_routing_put_audio_mixer),
926};
927
928static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = {
929 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_MI2S_RX ,
930 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
931 msm_routing_put_audio_mixer),
932 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_MI2S_RX,
933 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
934 msm_routing_put_audio_mixer),
935 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_MI2S_RX,
936 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
937 msm_routing_put_audio_mixer),
938 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_MI2S_RX,
939 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
940 msm_routing_put_audio_mixer),
941};
942
943static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
944 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_HDMI_RX,
945 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
946 msm_routing_put_audio_mixer),
947 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_HDMI_RX,
948 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
949 msm_routing_put_audio_mixer),
950 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_HDMI_RX,
951 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
952 msm_routing_put_audio_mixer),
953 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_HDMI_RX,
954 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
955 msm_routing_put_audio_mixer),
956};
957 /* incall music delivery mixer */
958static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = {
959 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
960 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
961 msm_routing_put_audio_mixer),
962 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
963 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
964 msm_routing_put_audio_mixer),
965};
966
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -0700967static const struct snd_kcontrol_new slimbus_4_rx_mixer_controls[] = {
968 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_4_RX,
969 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
970 msm_routing_put_audio_mixer),
971 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_4_RX,
972 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
973 msm_routing_put_audio_mixer),
974};
975
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -0700976static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
977 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_BT_SCO_RX,
978 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
979 msm_routing_put_audio_mixer),
980 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_BT_SCO_RX,
981 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
982 msm_routing_put_audio_mixer),
983 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_BT_SCO_RX,
984 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
985 msm_routing_put_audio_mixer),
986 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_BT_SCO_RX,
987 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
988 msm_routing_put_audio_mixer),
989};
990
991static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
992 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_FM_RX,
993 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
994 msm_routing_put_audio_mixer),
995 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_FM_RX,
996 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
997 msm_routing_put_audio_mixer),
998 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_FM_RX,
999 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1000 msm_routing_put_audio_mixer),
1001 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_FM_RX,
1002 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1003 msm_routing_put_audio_mixer),
1004};
1005
1006static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
1007 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
1008 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1009 msm_routing_put_audio_mixer),
1010 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
1011 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1012 msm_routing_put_audio_mixer),
1013 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AFE_PCM_RX,
1014 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1015 msm_routing_put_audio_mixer),
1016 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AFE_PCM_RX,
1017 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1018 msm_routing_put_audio_mixer),
1019};
1020
1021static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
1022 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AUXPCM_RX,
1023 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1024 msm_routing_put_audio_mixer),
1025 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AUXPCM_RX,
1026 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1027 msm_routing_put_audio_mixer),
1028 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AUXPCM_RX,
1029 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
1030 msm_routing_put_audio_mixer),
1031 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AUXPCM_RX,
1032 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
1033 msm_routing_put_audio_mixer),
1034};
1035
1036static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
1037 SOC_SINGLE_EXT("PRI_TX", MSM_BACKEND_DAI_PRI_I2S_TX,
1038 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1039 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001040 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1041 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1042 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001043 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1044 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1045 msm_routing_put_audio_mixer),
1046 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_TX,
1047 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1048 msm_routing_put_audio_mixer),
1049 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1050 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1051 msm_routing_put_audio_mixer),
1052 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
1053 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1054 msm_routing_put_audio_mixer),
1055 SOC_SINGLE_EXT("AFE_PCM_TX", MSM_BACKEND_DAI_AFE_PCM_TX,
1056 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1057 msm_routing_put_audio_mixer),
1058 SOC_SINGLE_EXT("VOC_REC_DL", MSM_BACKEND_DAI_INCALL_RECORD_RX,
1059 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1060 msm_routing_put_audio_mixer),
1061 SOC_SINGLE_EXT("VOC_REC_UL", MSM_BACKEND_DAI_INCALL_RECORD_TX,
1062 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1063 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001064 SOC_SINGLE_EXT("SLIM_4_TX", MSM_BACKEND_DAI_SLIMBUS_4_TX,
1065 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
1066 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001067};
1068
1069static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
1070 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
1071 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1072 msm_routing_put_audio_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001073 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1074 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
1075 msm_routing_put_audio_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001076};
1077
1078static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
1079 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_PRI_I2S_RX,
1080 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1081 msm_routing_put_voice_mixer),
1082 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_PRI_I2S_RX,
1083 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1084 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001085 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_PRI_I2S_RX,
1086 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1087 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001088};
1089
1090static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
1091 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SEC_I2S_RX,
1092 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1093 msm_routing_put_voice_mixer),
1094 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SEC_I2S_RX,
1095 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1096 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001097 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SEC_I2S_RX,
1098 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1099 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001100};
1101
1102static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
1103 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1104 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1105 msm_routing_put_voice_mixer),
1106 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
1107 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1108 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001109 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
1110 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1111 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001112};
1113
1114static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
1115 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1116 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1117 msm_routing_put_voice_mixer),
1118 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
1119 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1120 msm_routing_put_voice_mixer),
1121 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1122 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1123 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001124 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
1125 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1126 msm_routing_put_voice_mixer),
1127};
1128
1129static const struct snd_kcontrol_new mi2s_rx_voice_mixer_controls[] = {
1130 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_MI2S_RX,
1131 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1132 msm_routing_put_voice_mixer),
1133 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_MI2S_RX,
1134 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1135 msm_routing_put_voice_mixer),
1136 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_MI2S_RX,
1137 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1138 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001139};
1140
1141static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
1142 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AFE_PCM_RX,
1143 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1144 msm_routing_put_voice_mixer),
1145 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AFE_PCM_RX,
1146 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1147 msm_routing_put_voice_mixer),
1148 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
1149 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1150 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001151 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AFE_PCM_RX,
1152 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1153 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001154};
1155
1156static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
1157 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AUXPCM_RX,
1158 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1159 msm_routing_put_voice_mixer),
1160 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AUXPCM_RX,
1161 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1162 msm_routing_put_voice_mixer),
1163 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AUXPCM_RX,
1164 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1165 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001166 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_AUXPCM_RX,
1167 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1168 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001169};
1170
1171static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
1172 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_HDMI_RX,
1173 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1174 msm_routing_put_voice_mixer),
1175 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_HDMI_RX,
1176 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1177 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001178 SOC_SINGLE_EXT("VoLTE", MSM_BACKEND_DAI_HDMI_RX,
1179 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1180 msm_routing_put_voice_mixer),
1181 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_HDMI_RX,
1182 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1183 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001184};
1185
1186static const struct snd_kcontrol_new stub_rx_mixer_controls[] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001187 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_EXTPROC_RX,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001188 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1189 msm_routing_put_voice_stub_mixer),
1190};
1191
1192static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
1193 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1194 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1195 msm_routing_put_voice_stub_mixer),
1196};
1197
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001198static const struct snd_kcontrol_new slimbus_3_rx_mixer_controls[] = {
1199 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1200 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1201 msm_routing_put_voice_stub_mixer),
1202};
1203
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001204static const struct snd_kcontrol_new tx_voice_mixer_controls[] = {
1205 SOC_SINGLE_EXT("PRI_TX_Voice", MSM_BACKEND_DAI_PRI_I2S_TX,
1206 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1207 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001208 SOC_SINGLE_EXT("MI2S_TX_Voice", MSM_BACKEND_DAI_MI2S_TX,
1209 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1210 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001211 SOC_SINGLE_EXT("SLIM_0_TX_Voice", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1212 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1213 msm_routing_put_voice_mixer),
1214 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voice",
1215 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_CS_VOICE, 1, 0,
1216 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
1217 SOC_SINGLE_EXT("AFE_PCM_TX_Voice", MSM_BACKEND_DAI_AFE_PCM_TX,
1218 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1219 msm_routing_put_voice_mixer),
1220 SOC_SINGLE_EXT("AUX_PCM_TX_Voice", MSM_BACKEND_DAI_AUXPCM_TX,
1221 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1222 msm_routing_put_voice_mixer),
1223};
1224
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001225static const struct snd_kcontrol_new tx_volte_mixer_controls[] = {
1226 SOC_SINGLE_EXT("PRI_TX_VoLTE", MSM_BACKEND_DAI_PRI_I2S_TX,
1227 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1228 msm_routing_put_voice_mixer),
1229 SOC_SINGLE_EXT("SLIM_0_TX_VoLTE", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1230 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1231 msm_routing_put_voice_mixer),
1232 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_VoLTE",
1233 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_VOLTE, 1, 0,
1234 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
1235 SOC_SINGLE_EXT("AFE_PCM_TX_VoLTE", MSM_BACKEND_DAI_AFE_PCM_TX,
1236 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1237 msm_routing_put_voice_mixer),
1238 SOC_SINGLE_EXT("AUX_PCM_TX_VoLTE", MSM_BACKEND_DAI_AUXPCM_TX,
1239 MSM_FRONTEND_DAI_VOLTE, 1, 0, msm_routing_get_voice_mixer,
1240 msm_routing_put_voice_mixer),
1241};
1242
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001243static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
1244 SOC_SINGLE_EXT("PRI_TX_Voip", MSM_BACKEND_DAI_PRI_I2S_TX,
1245 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1246 msm_routing_put_voice_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001247 SOC_SINGLE_EXT("MI2S_TX_Voip", MSM_BACKEND_DAI_MI2S_TX,
1248 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1249 msm_routing_put_voice_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001250 SOC_SINGLE_EXT("SLIM_0_TX_Voip", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1251 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1252 msm_routing_put_voice_mixer),
1253 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voip", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1254 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1255 msm_routing_put_voice_mixer),
1256 SOC_SINGLE_EXT("AFE_PCM_TX_Voip", MSM_BACKEND_DAI_AFE_PCM_TX,
1257 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1258 msm_routing_put_voice_mixer),
1259 SOC_SINGLE_EXT("AUX_PCM_TX_Voip", MSM_BACKEND_DAI_AUXPCM_TX,
1260 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1261 msm_routing_put_voice_mixer),
1262};
1263
1264static const struct snd_kcontrol_new tx_voice_stub_mixer_controls[] = {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001265 SOC_SINGLE_EXT("STUB_TX_HL", MSM_BACKEND_DAI_EXTPROC_TX,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001266 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1267 msm_routing_put_voice_stub_mixer),
1268 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1269 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1270 msm_routing_put_voice_stub_mixer),
1271 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_SLIMBUS_1_TX,
1272 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1273 msm_routing_put_voice_stub_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001274 SOC_SINGLE_EXT("STUB_1_TX_HL", MSM_BACKEND_DAI_EXTPROC_EC_TX,
1275 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1276 msm_routing_put_voice_stub_mixer),
1277 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_MI2S_TX,
1278 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1279 msm_routing_put_voice_stub_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001280};
1281
1282static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
1283 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1284 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1285 msm_routing_put_port_mixer),
1286 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1287 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1288 msm_routing_put_port_mixer),
1289 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1290 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1291 msm_routing_put_port_mixer),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001292 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1293 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1294 msm_routing_put_port_mixer),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001295};
1296
1297static const struct snd_kcontrol_new auxpcm_rx_port_mixer_controls[] = {
1298 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1299 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1300 msm_routing_put_port_mixer),
1301 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1302 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1303 msm_routing_put_port_mixer),
1304};
1305
1306static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = {
1307 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1308 MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
1309 msm_routing_put_port_mixer),
1310};
1311
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001312static const struct snd_kcontrol_new sbus_3_rx_port_mixer_controls[] = {
1313 SOC_SINGLE_EXT("INTERNAL_BT_SCO_RX", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1314 MSM_BACKEND_DAI_INT_BT_SCO_RX, 1, 0, msm_routing_get_port_mixer,
1315 msm_routing_put_port_mixer),
1316 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SLIMBUS_3_RX,
1317 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1318 msm_routing_put_port_mixer),
1319};
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001320static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = {
1321 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1322 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1323 msm_routing_put_port_mixer),
1324};
1325
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001326static const struct snd_kcontrol_new afe_pcm_rx_port_mixer_controls[] = {
1327 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_AFE_PCM_RX,
1328 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1329 msm_routing_put_port_mixer),
1330};
1331
1332
1333static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = {
1334 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_HDMI_RX,
1335 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1336 msm_routing_put_port_mixer),
1337};
1338
1339static const struct snd_kcontrol_new sec_i2s_rx_port_mixer_controls[] = {
1340 SOC_SINGLE_EXT("MI2S_TX", MSM_BACKEND_DAI_SEC_I2S_RX,
1341 MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
1342 msm_routing_put_port_mixer),
1343};
1344
1345static const struct snd_kcontrol_new mi2s_rx_port_mixer_controls[] = {
1346 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_MI2S_RX,
1347 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1348 msm_routing_put_port_mixer),
1349};
1350
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001351static const struct snd_kcontrol_new fm_switch_mixer_controls =
1352 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1353 0, 1, 0, msm_routing_get_switch_mixer,
1354 msm_routing_put_switch_mixer);
1355
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001356static const struct snd_kcontrol_new pcm_rx_switch_mixer_controls =
1357 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1358 0, 1, 0, msm_routing_get_fm_pcmrx_switch_mixer,
1359 msm_routing_put_fm_pcmrx_switch_mixer);
1360
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001361static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
1362 SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001363 INT_RX_VOL_GAIN, 0, msm_routing_get_fm_vol_mixer,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001364 msm_routing_set_fm_vol_mixer, fm_rx_vol_gain),
1365};
1366
1367static const struct snd_kcontrol_new lpa_vol_mixer_controls[] = {
1368 SOC_SINGLE_EXT_TLV("LPA RX Volume", SND_SOC_NOPM, 0,
1369 INT_RX_VOL_GAIN, 0, msm_routing_get_lpa_vol_mixer,
1370 msm_routing_set_lpa_vol_mixer, lpa_rx_vol_gain),
1371};
1372
1373static const struct snd_kcontrol_new multimedia2_vol_mixer_controls[] = {
1374 SOC_SINGLE_EXT_TLV("HIFI2 RX Volume", SND_SOC_NOPM, 0,
1375 INT_RX_VOL_GAIN, 0, msm_routing_get_multimedia2_vol_mixer,
1376 msm_routing_set_multimedia2_vol_mixer, multimedia2_rx_vol_gain),
1377};
1378
1379static const struct snd_kcontrol_new compressed_vol_mixer_controls[] = {
1380 SOC_SINGLE_EXT_TLV("COMPRESSED RX Volume", SND_SOC_NOPM, 0,
1381 INT_RX_VOL_GAIN, 0, msm_routing_get_compressed_vol_mixer,
1382 msm_routing_set_compressed_vol_mixer, compressed_rx_vol_gain),
1383};
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001384static const struct snd_kcontrol_new eq_enable_mixer_controls[] = {
1385 SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM,
1386 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_eq_enable_mixer,
1387 msm_routing_put_eq_enable_mixer),
1388 SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM,
1389 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_eq_enable_mixer,
1390 msm_routing_put_eq_enable_mixer),
1391 SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM,
1392 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_eq_enable_mixer,
1393 msm_routing_put_eq_enable_mixer),
1394};
1395
1396static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
1397 SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM,
1398 MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0,
1399 msm_routing_get_eq_band_count_audio_mixer,
1400 msm_routing_put_eq_band_count_audio_mixer),
1401 SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM,
1402 MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0,
1403 msm_routing_get_eq_band_count_audio_mixer,
1404 msm_routing_put_eq_band_count_audio_mixer),
1405 SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM,
1406 MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0,
1407 msm_routing_get_eq_band_count_audio_mixer,
1408 msm_routing_put_eq_band_count_audio_mixer),
1409};
1410
1411static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = {
1412 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1,
1413 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1414 msm_routing_get_eq_band_audio_mixer,
1415 msm_routing_put_eq_band_audio_mixer),
1416 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2,
1417 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1418 msm_routing_get_eq_band_audio_mixer,
1419 msm_routing_put_eq_band_audio_mixer),
1420 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3,
1421 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1422 msm_routing_get_eq_band_audio_mixer,
1423 msm_routing_put_eq_band_audio_mixer),
1424 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4,
1425 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1426 msm_routing_get_eq_band_audio_mixer,
1427 msm_routing_put_eq_band_audio_mixer),
1428 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5,
1429 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1430 msm_routing_get_eq_band_audio_mixer,
1431 msm_routing_put_eq_band_audio_mixer),
1432 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6,
1433 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1434 msm_routing_get_eq_band_audio_mixer,
1435 msm_routing_put_eq_band_audio_mixer),
1436 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7,
1437 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1438 msm_routing_get_eq_band_audio_mixer,
1439 msm_routing_put_eq_band_audio_mixer),
1440 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8,
1441 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1442 msm_routing_get_eq_band_audio_mixer,
1443 msm_routing_put_eq_band_audio_mixer),
1444 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9,
1445 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1446 msm_routing_get_eq_band_audio_mixer,
1447 msm_routing_put_eq_band_audio_mixer),
1448 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10,
1449 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1450 msm_routing_get_eq_band_audio_mixer,
1451 msm_routing_put_eq_band_audio_mixer),
1452 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11,
1453 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1454 msm_routing_get_eq_band_audio_mixer,
1455 msm_routing_put_eq_band_audio_mixer),
1456 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12,
1457 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1458 msm_routing_get_eq_band_audio_mixer,
1459 msm_routing_put_eq_band_audio_mixer),
1460 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1,
1461 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1462 msm_routing_get_eq_band_audio_mixer,
1463 msm_routing_put_eq_band_audio_mixer),
1464 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2,
1465 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1466 msm_routing_get_eq_band_audio_mixer,
1467 msm_routing_put_eq_band_audio_mixer),
1468 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3,
1469 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1470 msm_routing_get_eq_band_audio_mixer,
1471 msm_routing_put_eq_band_audio_mixer),
1472 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4,
1473 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1474 msm_routing_get_eq_band_audio_mixer,
1475 msm_routing_put_eq_band_audio_mixer),
1476 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5,
1477 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1478 msm_routing_get_eq_band_audio_mixer,
1479 msm_routing_put_eq_band_audio_mixer),
1480 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6,
1481 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1482 msm_routing_get_eq_band_audio_mixer,
1483 msm_routing_put_eq_band_audio_mixer),
1484 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7,
1485 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1486 msm_routing_get_eq_band_audio_mixer,
1487 msm_routing_put_eq_band_audio_mixer),
1488 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8,
1489 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1490 msm_routing_get_eq_band_audio_mixer,
1491 msm_routing_put_eq_band_audio_mixer),
1492 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9,
1493 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1494 msm_routing_get_eq_band_audio_mixer,
1495 msm_routing_put_eq_band_audio_mixer),
1496 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10,
1497 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1498 msm_routing_get_eq_band_audio_mixer,
1499 msm_routing_put_eq_band_audio_mixer),
1500 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11,
1501 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1502 msm_routing_get_eq_band_audio_mixer,
1503 msm_routing_put_eq_band_audio_mixer),
1504 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12,
1505 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1506 msm_routing_get_eq_band_audio_mixer,
1507 msm_routing_put_eq_band_audio_mixer),
1508 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1,
1509 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1510 msm_routing_get_eq_band_audio_mixer,
1511 msm_routing_put_eq_band_audio_mixer),
1512 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2,
1513 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1514 msm_routing_get_eq_band_audio_mixer,
1515 msm_routing_put_eq_band_audio_mixer),
1516 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3,
1517 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1518 msm_routing_get_eq_band_audio_mixer,
1519 msm_routing_put_eq_band_audio_mixer),
1520 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4,
1521 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1522 msm_routing_get_eq_band_audio_mixer,
1523 msm_routing_put_eq_band_audio_mixer),
1524 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5,
1525 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1526 msm_routing_get_eq_band_audio_mixer,
1527 msm_routing_put_eq_band_audio_mixer),
1528 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6,
1529 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1530 msm_routing_get_eq_band_audio_mixer,
1531 msm_routing_put_eq_band_audio_mixer),
1532 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7,
1533 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1534 msm_routing_get_eq_band_audio_mixer,
1535 msm_routing_put_eq_band_audio_mixer),
1536 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8,
1537 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1538 msm_routing_get_eq_band_audio_mixer,
1539 msm_routing_put_eq_band_audio_mixer),
1540 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9,
1541 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1542 msm_routing_get_eq_band_audio_mixer,
1543 msm_routing_put_eq_band_audio_mixer),
1544 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10,
1545 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1546 msm_routing_get_eq_band_audio_mixer,
1547 msm_routing_put_eq_band_audio_mixer),
1548 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11,
1549 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1550 msm_routing_get_eq_band_audio_mixer,
1551 msm_routing_put_eq_band_audio_mixer),
1552 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12,
1553 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1554 msm_routing_get_eq_band_audio_mixer,
1555 msm_routing_put_eq_band_audio_mixer),
1556};
1557
1558static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
1559 /* Frontend AIF */
1560 /* Widget name equals to Front-End DAI name<Need confirmation>,
1561 * Stream name must contains substring of front-end dai name
1562 */
1563 SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0),
1564 SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0),
1565 SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0),
1566 SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0),
1567 SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
1568 SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
1569 SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
1570 SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, 0, 0, 0),
1571 SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001572 SND_SOC_DAPM_AIF_IN("VoLTE_DL", "VoLTE Playback", 0, 0, 0, 0),
1573 SND_SOC_DAPM_AIF_OUT("VoLTE_UL", "VoLTE Capture", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001574 SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
1575 SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
1576 0, 0, 0, 0),
1577 SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture",
1578 0, 0, 0, 0),
1579 SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback",
1580 0, 0, 0, 0),
1581 SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture",
1582 0, 0, 0, 0),
1583 SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001584 SND_SOC_DAPM_AIF_IN("SEC_I2S_DL_HL", "SEC_I2S_RX_HOSTLESS Playback",
1585 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001586 SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
1587 0, 0, 0, 0),
1588 SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture",
1589 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001590 SND_SOC_DAPM_AIF_OUT("MI2S_UL_HL", "MI2S_TX_HOSTLESS Capture",
1591 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001592
1593 /* Backend AIF */
1594 /* Stream name equals to backend dai link stream name
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001595 */
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001596 SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0),
1597 SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback",
1598 0, 0, 0 , 0),
1599 SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0),
1600 SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0 , 0),
1601 SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0),
1602 SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001603 SND_SOC_DAPM_AIF_IN("MI2S_TX", "MI2S Capture", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001604 SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0),
1605 SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback",
1606 0, 0, 0 , 0),
1607 SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
1608 0, 0, 0, 0),
1609 SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
1610 0, 0, 0 , 0),
1611 SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
1612 0, 0, 0, 0),
1613 SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback",
1614 0, 0, 0 , 0),
1615 SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
1616 0, 0, 0 , 0),
1617 /* incall */
1618 SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
1619 0, 0, 0 , 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001620 SND_SOC_DAPM_AIF_OUT("SLIMBUS_4_RX", "Slimbus4 Playback",
1621 0, 0, 0 , 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001622 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture",
1623 0, 0, 0, 0),
1624 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture",
1625 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001626 SND_SOC_DAPM_AIF_IN("SLIMBUS_4_TX", "Slimbus4 Capture",
1627 0, 0, 0, 0),
1628
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001629 SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
1630 SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
1631 SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
1632 SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
1633 SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0),
1634 SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0),
1635 SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0),
1636 SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001637 SND_SOC_DAPM_AIF_IN("STUB_1_TX", "Stub1 Capture", 0, 0, 0, 0),
1638 SND_SOC_DAPM_AIF_OUT("SLIMBUS_3_RX", "Slimbus3 Playback", 0, 0, 0, 0),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001639
1640 /* Switch Definitions */
1641 SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
1642 &fm_switch_mixer_controls),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001643 SND_SOC_DAPM_SWITCH("PCM_RX_DL_HL", SND_SOC_NOPM, 0, 0,
1644 &pcm_rx_switch_mixer_controls),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001645 /* Mixer definitions */
1646 SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1647 pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
1648 SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1649 sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)),
1650 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1651 slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)),
1652 SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
1653 hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
1654 SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1655 mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)),
1656 SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
1657 mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
1658 SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
1659 mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
1660 SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1661 auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
1662 /* incall */
1663 SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
1664 incall_music_delivery_mixer_controls,
1665 ARRAY_SIZE(incall_music_delivery_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001666 SND_SOC_DAPM_MIXER("SLIMBUS_4_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1667 slimbus_4_rx_mixer_controls,
1668 ARRAY_SIZE(slimbus_4_rx_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001669 /* Voice Mixer */
1670 SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer",
1671 SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls,
1672 ARRAY_SIZE(pri_rx_voice_mixer_controls)),
1673 SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer",
1674 SND_SOC_NOPM, 0, 0,
1675 sec_i2s_rx_voice_mixer_controls,
1676 ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)),
1677 SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer",
1678 SND_SOC_NOPM, 0, 0,
1679 slimbus_rx_voice_mixer_controls,
1680 ARRAY_SIZE(slimbus_rx_voice_mixer_controls)),
1681 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer",
1682 SND_SOC_NOPM, 0, 0,
1683 bt_sco_rx_voice_mixer_controls,
1684 ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)),
1685 SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer",
1686 SND_SOC_NOPM, 0, 0,
1687 afe_pcm_rx_voice_mixer_controls,
1688 ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)),
1689 SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer",
1690 SND_SOC_NOPM, 0, 0,
1691 aux_pcm_rx_voice_mixer_controls,
1692 ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)),
1693 SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
1694 SND_SOC_NOPM, 0, 0,
1695 hdmi_rx_voice_mixer_controls,
1696 ARRAY_SIZE(hdmi_rx_voice_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001697 SND_SOC_DAPM_MIXER("MI2S_RX_Voice Mixer",
1698 SND_SOC_NOPM, 0, 0,
1699 mi2s_rx_voice_mixer_controls,
1700 ARRAY_SIZE(mi2s_rx_voice_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001701 SND_SOC_DAPM_MIXER("Voice_Tx Mixer",
1702 SND_SOC_NOPM, 0, 0, tx_voice_mixer_controls,
1703 ARRAY_SIZE(tx_voice_mixer_controls)),
1704 SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
1705 SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
1706 ARRAY_SIZE(tx_voip_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001707 SND_SOC_DAPM_MIXER("VoLTE_Tx Mixer",
1708 SND_SOC_NOPM, 0, 0, tx_volte_mixer_controls,
1709 ARRAY_SIZE(tx_volte_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001710 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1711 int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
1712 SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1713 int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
1714 SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1715 afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
1716 SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
1717 tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)),
1718 SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0,
1719 stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)),
1720 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0,
1721 slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001722 SND_SOC_DAPM_MIXER("SLIMBUS_3_RX_Voice Mixer", SND_SOC_NOPM, 0, 0,
1723 slimbus_3_rx_mixer_controls, ARRAY_SIZE(slimbus_3_rx_mixer_controls)),
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001724 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer",
1725 SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls,
1726 ARRAY_SIZE(sbus_0_rx_port_mixer_controls)),
1727 SND_SOC_DAPM_MIXER("AUXPCM_RX Port Mixer",
1728 SND_SOC_NOPM, 0, 0, auxpcm_rx_port_mixer_controls,
1729 ARRAY_SIZE(auxpcm_rx_port_mixer_controls)),
1730 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1731 sbus_1_rx_port_mixer_controls,
1732 ARRAY_SIZE(sbus_1_rx_port_mixer_controls)),
1733 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1734 bt_sco_rx_port_mixer_controls,
1735 ARRAY_SIZE(bt_sco_rx_port_mixer_controls)),
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001736 SND_SOC_DAPM_MIXER("AFE_PCM_RX Port Mixer",
1737 SND_SOC_NOPM, 0, 0, afe_pcm_rx_port_mixer_controls,
1738 ARRAY_SIZE(afe_pcm_rx_port_mixer_controls)),
1739 SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer",
1740 SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls,
1741 ARRAY_SIZE(hdmi_rx_port_mixer_controls)),
1742 SND_SOC_DAPM_MIXER("SEC_I2S_RX Port Mixer",
1743 SND_SOC_NOPM, 0, 0, sec_i2s_rx_port_mixer_controls,
1744 ARRAY_SIZE(sec_i2s_rx_port_mixer_controls)),
1745 SND_SOC_DAPM_MIXER("SLIMBUS_3_RX Port Mixer",
1746 SND_SOC_NOPM, 0, 0, sbus_3_rx_port_mixer_controls,
1747 ARRAY_SIZE(sbus_3_rx_port_mixer_controls)),
1748 SND_SOC_DAPM_MIXER("MI2S_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1749 mi2s_rx_port_mixer_controls, ARRAY_SIZE(mi2s_rx_port_mixer_controls)),
1750
1751 /* Virtual Pins to force backends ON atm */
1752 SND_SOC_DAPM_OUTPUT("BE_OUT"),
1753 SND_SOC_DAPM_INPUT("BE_IN"),
1754
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001755};
1756
1757static const struct snd_soc_dapm_route intercon[] = {
1758 {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1759 {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1760 {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1761 {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1762 {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
1763
1764 {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1765 {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1766 {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1767 {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1768 {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
1769
1770 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1771 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1772 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1773 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1774 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
1775
1776 {"HDMI Mixer", "MultiMedia1", "MM_DL1"},
1777 {"HDMI Mixer", "MultiMedia2", "MM_DL2"},
1778 {"HDMI Mixer", "MultiMedia3", "MM_DL3"},
1779 {"HDMI Mixer", "MultiMedia4", "MM_DL4"},
1780 {"HDMI", NULL, "HDMI Mixer"},
1781
1782 /* incall */
1783 {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"},
1784 {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
1785 {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001786 {"SLIMBUS_4_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1787 {"SLIMBUS_4_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1788 {"SLIMBUS_4_RX", NULL, "SLIMBUS_4_RX Audio Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001789
1790 {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
1791 {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001792 {"MultiMedia1 Mixer", "SLIM_4_TX", "SLIMBUS_4_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001793 {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1794 {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1795 {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1796 {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1797 {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
1798
1799 {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001800 {"MultiMedia1 Mixer", "MI2S_TX", "MI2S_TX"},
1801 {"MultiMedia2 Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001802 {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1803 {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1804
1805 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1806 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1807 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1808 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1809 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
1810
1811 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1812 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1813 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1814 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1815 {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"},
1816
1817 {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1818 {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1819 {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1820 {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1821 {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
1822
1823 {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1824 {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1825
1826 {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
1827 {"MM_UL1", NULL, "MultiMedia1 Mixer"},
1828 {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1829 {"MM_UL2", NULL, "MultiMedia2 Mixer"},
1830
1831 {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1832 {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1833 {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1834 {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1835 {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"},
1836
1837 {"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001838 {"PRI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001839 {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1840 {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
1841
1842 {"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001843 {"SEC_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001844 {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
1845 {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
1846
1847 {"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001848 {"SLIM_0_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001849 {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
1850 {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
1851
1852 {"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001853 {"INTERNAL_BT_SCO_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001854 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
1855 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
1856
1857 {"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001858 {"AFE_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001859 {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1860 {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
1861
1862 {"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001863 {"AUX_PCM_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001864 {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1865 {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
1866
1867 {"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001868 {"HDMI_RX_Voice Mixer", "VoLTE", "VoLTE_DL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001869 {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1870 {"HDMI", NULL, "HDMI_RX_Voice Mixer"},
1871 {"HDMI", NULL, "HDMI_DL_HL"},
1872
1873 {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001874 {"Voice_Tx Mixer", "MI2S_TX_Voice", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001875 {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
1876 {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
1877 {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
1878 {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
1879 {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001880 {"VoLTE_Tx Mixer", "PRI_TX_VoLTE", "PRI_I2S_TX"},
1881 {"VoLTE_Tx Mixer", "SLIM_0_TX_VoLTE", "SLIMBUS_0_TX"},
1882 {"VoLTE_Tx Mixer", "INTERNAL_BT_SCO_TX_VoLTE", "INT_BT_SCO_TX"},
1883 {"VoLTE_Tx Mixer", "AFE_PCM_TX_VoLTE", "PCM_TX"},
1884 {"VoLTE_Tx Mixer", "AUX_PCM_TX_VoLTE", "AUX_PCM_TX"},
1885 {"VoLTE_UL", NULL, "VoLTE_Tx Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001886 {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001887 {"Voip_Tx Mixer", "MI2S_TX_Voip", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001888 {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
1889 {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"},
1890 {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"},
1891 {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
1892
1893 {"VOIP_UL", NULL, "Voip_Tx Mixer"},
1894 {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
1895 {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
1896 {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
1897 {"INT_FM_RX", NULL, "INTFM_DL_HL"},
1898 {"INTFM_UL_HL", NULL, "INT_FM_TX"},
1899 {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
1900 {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001901 {"PCM_RX_DL_HL", "Switch", "SLIM0_DL_HL"},
1902 {"PCM_RX", NULL, "PCM_RX_DL_HL"},
1903 {"MI2S_UL_HL", NULL, "MI2S_TX"},
1904 {"SEC_I2S_RX", NULL, "SEC_I2S_DL_HL"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001905 {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1906 {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1907 {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001908 {"SLIMBUS_0_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001909 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001910 {"AFE_PCM_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1911 {"PCM_RX", NULL, "AFE_PCM_RX Port Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001912
1913 {"AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1914 {"AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1915 {"AUX_PCM_RX", NULL, "AUXPCM_RX Port Mixer"},
1916
1917 {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
1918 {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1919 {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001920 {"Voice Stub Tx Mixer", "STUB_1_TX_HL", "STUB_1_TX"},
1921 {"Voice Stub Tx Mixer", "MI2S_TX", "MI2S_TX"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001922 {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"},
1923
1924 {"STUB_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1925 {"STUB_RX", NULL, "STUB_RX Mixer"},
1926 {"SLIMBUS_1_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1927 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"},
1928 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001929 {"MI2S_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1930 {"MI2S_RX", NULL, "MI2S_RX_Voice Mixer"},
1931
1932 {"SLIMBUS_3_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1933 {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX_Voice Mixer"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001934
1935 {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1936 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"},
1937 {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1938 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"},
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001939 {"SLIMBUS_3_RX Port Mixer", "INTERNAL_BT_SCO_RX", "INT_BT_SCO_RX"},
1940 {"SLIMBUS_3_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1941 {"SLIMBUS_3_RX", NULL, "SLIMBUS_3_RX Port Mixer"},
1942
1943
1944 {"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1945 {"HDMI", NULL, "HDMI_RX Port Mixer"},
1946
1947 {"SEC_I2S_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
1948 {"SEC_I2S_RX", NULL, "SEC_I2S_RX Port Mixer"},
1949
1950 {"MI2S_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1951 {"MI2S_RX", NULL, "MI2S_RX Port Mixer"},
1952 /* Backend Enablement */
1953
1954 {"BE_OUT", NULL, "PRI_I2S_RX"},
1955 {"BE_OUT", NULL, "SEC_I2S_RX"},
1956 {"BE_OUT", NULL, "SLIMBUS_0_RX"},
1957 {"BE_OUT", NULL, "HDMI"},
1958 {"BE_OUT", NULL, "MI2S_RX"},
1959 {"PRI_I2S_TX", NULL, "BE_IN"},
1960 {"MI2S_TX", NULL, "BE_IN"},
1961 {"SLIMBUS_0_TX", NULL, "BE_IN" },
1962 {"BE_OUT", NULL, "INT_BT_SCO_RX"},
1963 {"INT_BT_SCO_TX", NULL, "BE_IN"},
1964 {"BE_OUT", NULL, "INT_FM_RX"},
1965 {"INT_FM_TX", NULL, "BE_IN"},
1966 {"BE_OUT", NULL, "PCM_RX"},
1967 {"PCM_TX", NULL, "BE_IN"},
1968 {"BE_OUT", NULL, "SLIMBUS_3_RX"},
1969 {"BE_OUT", NULL, "AUX_PCM_RX"},
1970 {"AUX_PCM_TX", NULL, "BE_IN"},
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001971};
1972
1973static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,
1974 struct snd_pcm_hw_params *params)
1975{
1976 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1977 unsigned int be_id = rtd->dai_link->be_id;
1978
1979 if (be_id >= MSM_BACKEND_DAI_MAX) {
1980 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1981 return -EINVAL;
1982 }
1983
1984 mutex_lock(&routing_lock);
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07001985 msm_bedais[be_id].sample_rate = params_rate(params);
1986 msm_bedais[be_id].channel = params_channels(params);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07001987 mutex_unlock(&routing_lock);
1988 return 0;
1989}
1990
1991static int msm_pcm_routing_close(struct snd_pcm_substream *substream)
1992{
1993 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1994 unsigned int be_id = rtd->dai_link->be_id;
1995 int i, session_type;
1996 struct msm_pcm_routing_bdai_data *bedai;
1997
1998 if (be_id >= MSM_BACKEND_DAI_MAX) {
1999 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
2000 return -EINVAL;
2001 }
2002
2003 bedai = &msm_bedais[be_id];
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002004 session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
2005 0 : 1);
2006
2007 mutex_lock(&routing_lock);
2008
2009 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
2010 if (fe_dai_map[i][session_type] != INVALID_SESSION)
2011 adm_close(bedai->port_id);
2012 }
2013
2014 bedai->active = 0;
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002015 bedai->sample_rate = 0;
2016 bedai->channel = 0;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002017 mutex_unlock(&routing_lock);
2018
2019 return 0;
2020}
2021
2022static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
2023{
2024 struct snd_soc_pcm_runtime *rtd = substream->private_data;
2025 unsigned int be_id = rtd->dai_link->be_id;
2026 int i, path_type, session_type;
2027 struct msm_pcm_routing_bdai_data *bedai;
2028 u32 channels;
2029
2030 if (be_id >= MSM_BACKEND_DAI_MAX) {
2031 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
2032 return -EINVAL;
2033 }
2034
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002035 bedai = &msm_bedais[be_id];
2036
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002037 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
2038 path_type = ADM_PATH_PLAYBACK;
2039 session_type = SESSION_TYPE_RX;
2040 } else {
2041 path_type = ADM_PATH_LIVE_REC;
2042 session_type = SESSION_TYPE_TX;
2043 }
2044
2045 mutex_lock(&routing_lock);
2046
2047 if (bedai->active == 1)
2048 goto done; /* Ignore prepare if back-end already active */
2049
2050 /* AFE port is not active at this point. However, still
2051 * go ahead setting active flag under the notion that
2052 * QDSP6 is able to handle ADM starting before AFE port
2053 * is started.
2054 */
2055 bedai->active = 1;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002056 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
2057 if (fe_dai_map[i][session_type] != INVALID_SESSION) {
2058
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002059 channels = bedai->channel;
2060 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK ||
2061 substream->stream == SNDRV_PCM_STREAM_CAPTURE)
2062 && (channels > 2))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002063 adm_multi_ch_copp_open(bedai->port_id,
2064 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002065 bedai->sample_rate,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002066 channels,
2067 DEFAULT_COPP_TOPOLOGY);
2068 else
2069 adm_open(bedai->port_id,
2070 path_type,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002071 bedai->sample_rate,
2072 channels,
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002073 DEFAULT_COPP_TOPOLOGY);
2074
2075 msm_pcm_routing_build_matrix(i,
2076 fe_dai_map[i][session_type], path_type);
2077 }
2078 }
2079
2080done:
2081 mutex_unlock(&routing_lock);
2082
2083 return 0;
2084}
2085
2086static struct snd_pcm_ops msm_routing_pcm_ops = {
2087 .hw_params = msm_pcm_routing_hw_params,
2088 .close = msm_pcm_routing_close,
2089 .prepare = msm_pcm_routing_prepare,
2090};
2091
2092static unsigned int msm_routing_read(struct snd_soc_platform *platform,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002093 unsigned int reg)
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002094{
2095 dev_dbg(platform->dev, "reg %x\n", reg);
2096 return 0;
2097}
2098
2099/* Not used but frame seems to require it */
2100static int msm_routing_write(struct snd_soc_platform *platform,
2101 unsigned int reg, unsigned int val)
2102{
2103 dev_dbg(platform->dev, "reg %x val %x\n", reg, val);
2104 return 0;
2105}
2106
2107/* Not used but frame seems to require it */
2108static int msm_routing_probe(struct snd_soc_platform *platform)
2109{
2110 snd_soc_dapm_new_controls(&platform->dapm, msm_qdsp6_widgets,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002111 ARRAY_SIZE(msm_qdsp6_widgets));
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002112 snd_soc_dapm_add_routes(&platform->dapm, intercon,
2113 ARRAY_SIZE(intercon));
2114
2115 snd_soc_dapm_new_widgets(&platform->dapm);
2116
2117 snd_soc_add_platform_controls(platform,
2118 int_fm_vol_mixer_controls,
2119 ARRAY_SIZE(int_fm_vol_mixer_controls));
2120
2121 snd_soc_add_platform_controls(platform,
2122 lpa_vol_mixer_controls,
2123 ARRAY_SIZE(lpa_vol_mixer_controls));
2124
2125 snd_soc_add_platform_controls(platform,
2126 eq_enable_mixer_controls,
2127 ARRAY_SIZE(eq_enable_mixer_controls));
2128
2129 snd_soc_add_platform_controls(platform,
2130 eq_band_mixer_controls,
2131 ARRAY_SIZE(eq_band_mixer_controls));
2132
2133 snd_soc_add_platform_controls(platform,
2134 eq_coeff_mixer_controls,
2135 ARRAY_SIZE(eq_coeff_mixer_controls));
2136
2137 snd_soc_add_platform_controls(platform,
2138 multimedia2_vol_mixer_controls,
2139 ARRAY_SIZE(multimedia2_vol_mixer_controls));
2140
2141 snd_soc_add_platform_controls(platform,
2142 compressed_vol_mixer_controls,
2143 ARRAY_SIZE(compressed_vol_mixer_controls));
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002144 return 0;
2145}
2146
2147static struct snd_soc_platform_driver msm_soc_routing_platform = {
2148 .ops = &msm_routing_pcm_ops,
2149 .probe = msm_routing_probe,
2150 .read = msm_routing_read,
2151 .write = msm_routing_write,
2152};
2153
2154static __devinit int msm_routing_pcm_probe(struct platform_device *pdev)
2155{
2156 dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev));
2157 return snd_soc_register_platform(&pdev->dev,
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002158 &msm_soc_routing_platform);
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002159}
2160
2161static int msm_routing_pcm_remove(struct platform_device *pdev)
2162{
2163 snd_soc_unregister_platform(&pdev->dev);
2164 return 0;
2165}
2166
2167static struct platform_driver msm_routing_pcm_driver = {
2168 .driver = {
2169 .name = "msm-pcm-routing",
2170 .owner = THIS_MODULE,
2171 },
2172 .probe = msm_routing_pcm_probe,
2173 .remove = __devexit_p(msm_routing_pcm_remove),
2174};
2175
2176int msm_routing_check_backend_enabled(int fedai_id)
2177{
2178 int i;
2179 if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) {
2180 /* bad ID assigned in machine driver */
2181 pr_err("%s: bad MM ID\n", __func__);
2182 return 0;
2183 }
2184 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
Phani Kumar Uppalapati4fbf4c42012-05-21 20:35:45 -07002185 if (test_bit(fedai_id, &msm_bedais[i].fe_sessions))
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002186 return msm_bedais[i].active;
Bharath Ramachandramurthy4d99b502012-05-04 18:52:52 -07002187 }
2188 return 0;
2189}
2190
2191static int __init msm_soc_routing_platform_init(void)
2192{
2193 mutex_init(&routing_lock);
2194 return platform_driver_register(&msm_routing_pcm_driver);
2195}
2196module_init(msm_soc_routing_platform_init);
2197
2198static void __exit msm_soc_routing_platform_exit(void)
2199{
2200 platform_driver_unregister(&msm_routing_pcm_driver);
2201}
2202module_exit(msm_soc_routing_platform_exit);
2203
2204MODULE_DESCRIPTION("MSM routing platform driver");
2205MODULE_LICENSE("GPL v2");