blob: 14da1ba3291c619835ef28a3432ca2a1b291278e [file] [log] [blame]
Alex Wongb3d06a02012-01-12 10:00:41 -08001/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07002 *
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>
Neema Shettyfeea7742011-09-11 12:30:36 -070020#include <linux/mutex.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070021#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.h>
Ben Romberger037dd2f2011-09-22 14:01:32 -070028#include <sound/q6asm.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070029#include <sound/q6afe.h>
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -070030#include <sound/tlv.h>
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070031#include "msm-pcm-routing.h"
32#include "qdsp6/q6voice.h"
33
Neema Shettyfeea7742011-09-11 12:30:36 -070034struct msm_pcm_routing_bdai_data {
35 u16 port_id; /* AFE port ID */
36 u8 active; /* track if this backend is enabled */
37 struct snd_pcm_hw_params *hw_params; /* to get freq and channel mode */
38 unsigned long fe_sessions; /* Front-end sessions */
39 unsigned long port_sessions; /* track Tx BE ports -> Rx BE */
40};
41
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070042#define INVALID_SESSION -1
Patrick Laicf999112011-08-23 11:27:20 -070043#define SESSION_TYPE_RX 0
44#define SESSION_TYPE_TX 1
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -070045
Neema Shettyfeea7742011-09-11 12:30:36 -070046static struct mutex routing_lock;
47
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -070048static int fm_switch_enable;
Neema Shetty2ced1ba2012-02-16 12:10:05 -080049
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -070050#define INT_FM_RX_VOL_MAX_STEPS 100
51#define INT_FM_RX_VOL_GAIN 2000
52
53static int msm_route_fm_vol_control;
54static const DECLARE_TLV_DB_SCALE(fm_rx_vol_gain, 0,
55 INT_FM_RX_VOL_MAX_STEPS, 0);
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -070056
Sriranjan Srikantam269de7f2011-09-06 18:24:45 -070057#define INT_LPA_RX_VOL_MAX_STEPS 100
58#define INT_LPA_RX_VOL_GAIN 0x2000
Asish Bhattacharya0ec76182011-07-29 16:58:11 +053059
60static int msm_route_lpa_vol_control;
61static const DECLARE_TLV_DB_SCALE(lpa_rx_vol_gain, 0,
62 INT_LPA_RX_VOL_MAX_STEPS, 0);
63
Ben Romberger037dd2f2011-09-22 14:01:32 -070064/* Equal to Frontend after last of the MULTIMEDIA SESSIONS */
65#define MAX_EQ_SESSIONS MSM_FRONTEND_DAI_CS_VOICE
66
67enum {
68 EQ_BAND1 = 0,
69 EQ_BAND2,
70 EQ_BAND3,
71 EQ_BAND4,
72 EQ_BAND5,
73 EQ_BAND6,
74 EQ_BAND7,
75 EQ_BAND8,
76 EQ_BAND9,
77 EQ_BAND10,
78 EQ_BAND11,
79 EQ_BAND12,
80 EQ_BAND_MAX,
81};
82
83struct msm_audio_eq_band {
84 uint16_t band_idx; /* The band index, 0 .. 11 */
85 uint32_t filter_type; /* Filter band type */
86 uint32_t center_freq_hz; /* Filter band center frequency */
87 uint32_t filter_gain; /* Filter band initial gain (dB) */
88 /* Range is +12 dB to -12 dB with 1dB increments. */
89 uint32_t q_factor;
90} __packed;
91
92struct msm_audio_eq_stream_config {
93 uint32_t enable; /* Number of consequtive bands specified */
94 uint32_t num_bands;
95 struct msm_audio_eq_band eq_bands[EQ_BAND_MAX];
96} __packed;
97
98struct msm_audio_eq_stream_config eq_data[MAX_EQ_SESSIONS];
99
100static void msm_send_eq_values(int eq_idx);
Neema Shettyfeea7742011-09-11 12:30:36 -0700101/* This array is indexed by back-end DAI ID defined in msm-pcm-routing.h
102 * If new back-end is defined, add new back-end DAI ID at the end of enum
103 */
104static struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
105 { PRIMARY_I2S_RX, 0, NULL, 0, 0},
106 { PRIMARY_I2S_TX, 0, NULL, 0, 0},
107 { SLIMBUS_0_RX, 0, NULL, 0, 0},
108 { SLIMBUS_0_TX, 0, NULL, 0, 0},
109 { HDMI_RX, 0, NULL, 0, 0},
110 { INT_BT_SCO_RX, 0, NULL, 0, 0},
111 { INT_BT_SCO_TX, 0, NULL, 0, 0},
112 { INT_FM_RX, 0, NULL, 0, 0},
113 { INT_FM_TX, 0, NULL, 0, 0},
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530114 { RT_PROXY_PORT_001_RX, 0, NULL, 0, 0},
115 { RT_PROXY_PORT_001_TX, 0, NULL, 0, 0},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700116 { PCM_RX, 0, NULL, 0, 0},
117 { PCM_TX, 0, NULL, 0, 0},
Helen Zeng0705a5f2011-10-14 15:29:52 -0700118 { VOICE_PLAYBACK_TX, 0, NULL, 0, 0},
Helen Zenge3d716a2011-10-14 16:32:16 -0700119 { VOICE_RECORD_RX, 0, NULL, 0, 0},
120 { VOICE_RECORD_TX, 0, NULL, 0, 0},
Kuirong Wang274f21a2011-12-15 21:29:08 -0800121 { MI2S_RX, 0, NULL, 0, 0},
Kuirong Wang9bbf6132012-01-10 18:28:49 -0800122 { SECONDARY_I2S_RX, 0, NULL, 0, 0},
Neema Shettyfeea7742011-09-11 12:30:36 -0700123};
124
125
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700126/* Track ASM playback & capture sessions of DAI */
Patrick Lai770ca3e42011-12-12 13:44:54 -0800127static int fe_dai_map[MSM_FRONTEND_DAI_MM_SIZE][2] = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700128 /* MULTIMEDIA1 */
129 {INVALID_SESSION, INVALID_SESSION},
130 /* MULTIMEDIA2 */
131 {INVALID_SESSION, INVALID_SESSION},
132 /* MULTIMEDIA3 */
133 {INVALID_SESSION, INVALID_SESSION},
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530134 /* MULTIMEDIA4 */
135 {INVALID_SESSION, INVALID_SESSION},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700136};
137
Patrick Laicf999112011-08-23 11:27:20 -0700138static void msm_pcm_routing_build_matrix(int fedai_id, int dspst_id,
139 int path_type)
140{
141 int i, port_type;
142 struct route_payload payload;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700143
Patrick Laicf999112011-08-23 11:27:20 -0700144 payload.num_copps = 0;
145 port_type = (path_type == ADM_PATH_PLAYBACK ?
146 MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX);
147
148 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
149 if ((afe_get_port_type(msm_bedais[i].port_id) ==
150 port_type) &&
151 msm_bedais[i].active && (test_bit(fedai_id,
152 &msm_bedais[i].fe_sessions)))
153 payload.copp_ids[payload.num_copps++] =
154 msm_bedais[i].port_id;
155 }
156
157 if (payload.num_copps)
158 adm_matrix_map(dspst_id, path_type,
159 payload.num_copps, payload.copp_ids, 0);
160}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700161
162void msm_pcm_routing_reg_phy_stream(int fedai_id, int dspst_id, int stream_type)
163{
Patrick Laicf999112011-08-23 11:27:20 -0700164 int i, session_type, path_type, port_type;
165 struct route_payload payload;
Kiran Kandi5e809b02012-01-31 00:24:33 -0800166 u32 channels;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700167
Patrick Lai770ca3e42011-12-12 13:44:54 -0800168 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
169 /* bad ID assigned in machine driver */
170 pr_err("%s: bad MM ID\n", __func__);
171 return;
172 }
173
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700174 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
Patrick Laicf999112011-08-23 11:27:20 -0700175 session_type = SESSION_TYPE_RX;
176 path_type = ADM_PATH_PLAYBACK;
177 port_type = MSM_AFE_PORT_TYPE_RX;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700178 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700179 session_type = SESSION_TYPE_TX;
180 path_type = ADM_PATH_LIVE_REC;
181 port_type = MSM_AFE_PORT_TYPE_TX;
182 }
183
184 mutex_lock(&routing_lock);
185
186 payload.num_copps = 0; /* only RX needs to use payload */
187 fe_dai_map[fedai_id][session_type] = dspst_id;
Ben Romberger037dd2f2011-09-22 14:01:32 -0700188 /* re-enable EQ if active */
189 if (eq_data[fedai_id].enable)
190 msm_send_eq_values(fedai_id);
Patrick Laicf999112011-08-23 11:27:20 -0700191 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
192 if ((afe_get_port_type(msm_bedais[i].port_id) ==
193 port_type) && msm_bedais[i].active &&
194 (test_bit(fedai_id,
195 &msm_bedais[i].fe_sessions))) {
Kiran Kandi5e809b02012-01-31 00:24:33 -0800196
197 channels = params_channels(msm_bedais[i].hw_params);
198
199 if ((stream_type == SNDRV_PCM_STREAM_PLAYBACK) &&
200 (channels > 2))
201 adm_multi_ch_copp_open(msm_bedais[i].port_id,
202 path_type,
203 params_rate(msm_bedais[i].hw_params),
204 channels,
205 DEFAULT_COPP_TOPOLOGY);
206 else
207 adm_open(msm_bedais[i].port_id,
Patrick Laicf999112011-08-23 11:27:20 -0700208 path_type,
209 params_rate(msm_bedais[i].hw_params),
210 params_channels(msm_bedais[i].hw_params),
211 DEFAULT_COPP_TOPOLOGY);
Kiran Kandi5e809b02012-01-31 00:24:33 -0800212
Patrick Laicf999112011-08-23 11:27:20 -0700213 payload.copp_ids[payload.num_copps++] =
214 msm_bedais[i].port_id;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700215 }
216 }
Patrick Laicf999112011-08-23 11:27:20 -0700217 if (payload.num_copps)
218 adm_matrix_map(dspst_id, path_type,
219 payload.num_copps, payload.copp_ids, 0);
220
221 mutex_unlock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700222}
223
224void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type)
225{
Patrick Laicf999112011-08-23 11:27:20 -0700226 int i, port_type, session_type;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700227
Patrick Lai770ca3e42011-12-12 13:44:54 -0800228 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
229 /* bad ID assigned in machine driver */
230 pr_err("%s: bad MM ID\n", __func__);
231 return;
232 }
233
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700234 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
Patrick Laicf999112011-08-23 11:27:20 -0700235 port_type = MSM_AFE_PORT_TYPE_RX;
236 session_type = SESSION_TYPE_RX;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700237 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700238 port_type = MSM_AFE_PORT_TYPE_TX;
239 session_type = SESSION_TYPE_TX;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700240 }
Patrick Laicf999112011-08-23 11:27:20 -0700241
242 mutex_lock(&routing_lock);
243
244 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
245 if ((afe_get_port_type(msm_bedais[i].port_id) ==
246 port_type) && msm_bedais[i].active &&
247 (test_bit(fedai_id,
248 &msm_bedais[i].fe_sessions)))
249 adm_close(msm_bedais[i].port_id);
250 }
251
252 fe_dai_map[fedai_id][session_type] = INVALID_SESSION;
253
254 mutex_unlock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700255}
256
Patrick Lai62314582012-02-17 21:33:05 -0800257/* Check if FE/BE route is set */
258static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id)
259{
260 bool rc = false;
261
262 if (be_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
263 /* recheck FE ID in the mixer control defined in this file */
264 pr_err("%s: bad MM ID\n", __func__);
265 return rc;
266 }
267
268 if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions))
269 rc = true;
270
271 return rc;
272}
273
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700274static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
275{
Patrick Laicf999112011-08-23 11:27:20 -0700276 int session_type, path_type;
Kiran Kandi5e809b02012-01-31 00:24:33 -0800277 u32 channels;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700278
279 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
280
Patrick Lai770ca3e42011-12-12 13:44:54 -0800281 if (val > MSM_FRONTEND_DAI_MM_MAX_ID) {
282 /* recheck FE ID in the mixer control defined in this file */
283 pr_err("%s: bad MM ID\n", __func__);
284 return;
285 }
286
Patrick Laicf999112011-08-23 11:27:20 -0700287 if (afe_get_port_type(msm_bedais[reg].port_id) ==
288 MSM_AFE_PORT_TYPE_RX) {
289 session_type = SESSION_TYPE_RX;
290 path_type = ADM_PATH_PLAYBACK;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700291 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700292 session_type = SESSION_TYPE_TX;
293 path_type = ADM_PATH_LIVE_REC;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700294 }
Patrick Laicf999112011-08-23 11:27:20 -0700295
296 mutex_lock(&routing_lock);
297
298 if (set) {
Helen Zeng0705a5f2011-10-14 15:29:52 -0700299 if (!test_bit(val, &msm_bedais[reg].fe_sessions) &&
300 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
301 voc_start_playback(set);
302
Patrick Laicf999112011-08-23 11:27:20 -0700303 set_bit(val, &msm_bedais[reg].fe_sessions);
304 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
305 INVALID_SESSION) {
Kiran Kandi5e809b02012-01-31 00:24:33 -0800306
307 channels = params_channels(msm_bedais[reg].hw_params);
308
309 if ((session_type == SESSION_TYPE_RX) && (channels > 2))
310 adm_multi_ch_copp_open(msm_bedais[reg].port_id,
311 path_type,
312 params_rate(msm_bedais[reg].hw_params),
313 channels,
314 DEFAULT_COPP_TOPOLOGY);
315 else
316 adm_open(msm_bedais[reg].port_id,
317 path_type,
Patrick Laicf999112011-08-23 11:27:20 -0700318 params_rate(msm_bedais[reg].hw_params),
319 params_channels(msm_bedais[reg].hw_params),
320 DEFAULT_COPP_TOPOLOGY);
Kiran Kandi5e809b02012-01-31 00:24:33 -0800321
Patrick Laicf999112011-08-23 11:27:20 -0700322 msm_pcm_routing_build_matrix(val,
323 fe_dai_map[val][session_type], path_type);
324 }
325 } else {
Helen Zeng0705a5f2011-10-14 15:29:52 -0700326 if (test_bit(val, &msm_bedais[reg].fe_sessions) &&
327 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
328 voc_start_playback(set);
Patrick Laicf999112011-08-23 11:27:20 -0700329 clear_bit(val, &msm_bedais[reg].fe_sessions);
330 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
331 INVALID_SESSION) {
332 adm_close(msm_bedais[reg].port_id);
333 msm_pcm_routing_build_matrix(val,
334 fe_dai_map[val][session_type], path_type);
335 }
336 }
Helen Zenge3d716a2011-10-14 16:32:16 -0700337 if ((msm_bedais[reg].port_id == VOICE_RECORD_RX)
338 || (msm_bedais[reg].port_id == VOICE_RECORD_TX))
339 voc_start_record(msm_bedais[reg].port_id, set);
Patrick Laicf999112011-08-23 11:27:20 -0700340
341 mutex_unlock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700342}
343
344static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
345 struct snd_ctl_elem_value *ucontrol)
346{
347 struct soc_mixer_control *mc =
348 (struct soc_mixer_control *)kcontrol->private_value;
349
Patrick Laicf999112011-08-23 11:27:20 -0700350 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700351 ucontrol->value.integer.value[0] = 1;
352 else
353 ucontrol->value.integer.value[0] = 0;
354
355 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
356 ucontrol->value.integer.value[0]);
357
358 return 0;
359}
360
361static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
362 struct snd_ctl_elem_value *ucontrol)
363{
Patrick Laiec2b8942011-09-01 11:01:51 -0700364 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
365 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700366 struct soc_mixer_control *mc =
367 (struct soc_mixer_control *)kcontrol->private_value;
368
369
Patrick Lai62314582012-02-17 21:33:05 -0800370 if (ucontrol->value.integer.value[0] &&
371 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == false) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700372 msm_pcm_routing_process_audio(mc->reg, mc->shift, 1);
373 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
Patrick Lai62314582012-02-17 21:33:05 -0800374 } else if (!ucontrol->value.integer.value[0] &&
375 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == true) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700376 msm_pcm_routing_process_audio(mc->reg, mc->shift, 0);
377 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
378 }
379
380 return 1;
381}
382
Neema Shettyfeea7742011-09-11 12:30:36 -0700383static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700384{
Neema Shetty2c07eb52011-08-21 20:33:52 -0700385 u16 session_id = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700386
Neema Shettyfeea7742011-09-11 12:30:36 -0700387 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
Neema Shetty2c07eb52011-08-21 20:33:52 -0700388
Neema Shettyfeea7742011-09-11 12:30:36 -0700389 if (val == MSM_FRONTEND_DAI_CS_VOICE)
Neema Shetty2c07eb52011-08-21 20:33:52 -0700390 session_id = voc_get_session_id(VOICE_SESSION_NAME);
391 else
392 session_id = voc_get_session_id(VOIP_SESSION_NAME);
393
394 pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
Neema Shettyfeea7742011-09-11 12:30:36 -0700395 __func__, val, session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700396
Neema Shettyfeea7742011-09-11 12:30:36 -0700397 mutex_lock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700398
399 if (set)
Neema Shettyfeea7742011-09-11 12:30:36 -0700400 set_bit(val, &msm_bedais[reg].fe_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700401 else
Neema Shettyfeea7742011-09-11 12:30:36 -0700402 clear_bit(val, &msm_bedais[reg].fe_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700403
Neema Shettyfeea7742011-09-11 12:30:36 -0700404 mutex_unlock(&routing_lock);
405
406 if (afe_get_port_type(msm_bedais[reg].port_id) ==
407 MSM_AFE_PORT_TYPE_RX) {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700408 voc_set_route_flag(session_id, RX_PATH, set);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700409 if (set) {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700410 voc_set_rxtx_port(session_id,
Neema Shettyfeea7742011-09-11 12:30:36 -0700411 msm_bedais[reg].port_id, DEV_RX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700412
Neema Shetty2c07eb52011-08-21 20:33:52 -0700413 if (voc_get_route_flag(session_id, RX_PATH) &&
414 voc_get_route_flag(session_id, TX_PATH))
415 voc_enable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700416 } else {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700417 voc_disable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700418 }
419 } else {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700420 voc_set_route_flag(session_id, TX_PATH, set);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700421 if (set) {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700422 voc_set_rxtx_port(session_id,
Neema Shettyfeea7742011-09-11 12:30:36 -0700423 msm_bedais[reg].port_id, DEV_TX);
Neema Shetty2c07eb52011-08-21 20:33:52 -0700424 if (voc_get_route_flag(session_id, RX_PATH) &&
425 voc_get_route_flag(session_id, TX_PATH))
426 voc_enable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700427 } else {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700428 voc_disable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700429 }
430 }
431}
432
433static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol,
434 struct snd_ctl_elem_value *ucontrol)
435{
436 struct soc_mixer_control *mc =
437 (struct soc_mixer_control *)kcontrol->private_value;
438
Neema Shettyfeea7742011-09-11 12:30:36 -0700439 mutex_lock(&routing_lock);
440
441 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700442 ucontrol->value.integer.value[0] = 1;
443 else
444 ucontrol->value.integer.value[0] = 0;
445
Neema Shettyfeea7742011-09-11 12:30:36 -0700446 mutex_unlock(&routing_lock);
447
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700448 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
449 ucontrol->value.integer.value[0]);
450
451 return 0;
452}
453
454static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol,
455 struct snd_ctl_elem_value *ucontrol)
456{
Patrick Laiec2b8942011-09-01 11:01:51 -0700457 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
458 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700459 struct soc_mixer_control *mc =
460 (struct soc_mixer_control *)kcontrol->private_value;
461
462 if (ucontrol->value.integer.value[0]) {
Neema Shettyfeea7742011-09-11 12:30:36 -0700463 msm_pcm_routing_process_voice(mc->reg, mc->shift, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700464 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
465 } else {
Neema Shettyfeea7742011-09-11 12:30:36 -0700466 msm_pcm_routing_process_voice(mc->reg, mc->shift, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700467 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
468 }
469
470 return 1;
471}
472
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -0700473static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol,
474 struct snd_ctl_elem_value *ucontrol)
475{
476 ucontrol->value.integer.value[0] = fm_switch_enable;
477 pr_debug("%s: FM Switch enable %ld\n", __func__,
478 ucontrol->value.integer.value[0]);
479 return 0;
480}
481
482static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol,
483 struct snd_ctl_elem_value *ucontrol)
484{
Sriranjan Srikantamdf509d12011-10-24 17:53:27 -0700485 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
486 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -0700487
488 pr_debug("%s: FM Switch enable %ld\n", __func__,
489 ucontrol->value.integer.value[0]);
490 if (ucontrol->value.integer.value[0])
491 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
492 else
493 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
494 fm_switch_enable = ucontrol->value.integer.value[0];
495 return 1;
496}
497
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700498static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol,
499 struct snd_ctl_elem_value *ucontrol)
500{
501 struct soc_mixer_control *mc =
502 (struct soc_mixer_control *)kcontrol->private_value;
503
Patrick Laicf999112011-08-23 11:27:20 -0700504 if (test_bit(mc->shift, &msm_bedais[mc->reg].port_sessions))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700505 ucontrol->value.integer.value[0] = 1;
506 else
507 ucontrol->value.integer.value[0] = 0;
508
509 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
510 ucontrol->value.integer.value[0]);
511
512 return 0;
513}
514
515static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol,
516 struct snd_ctl_elem_value *ucontrol)
517{
518 struct soc_mixer_control *mc =
519 (struct soc_mixer_control *)kcontrol->private_value;
520
521 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg,
522 mc->shift, ucontrol->value.integer.value[0]);
523
524 if (ucontrol->value.integer.value[0]) {
Patrick Laicf999112011-08-23 11:27:20 -0700525 afe_loopback(1, msm_bedais[mc->reg].port_id,
526 msm_bedais[mc->shift].port_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700527 set_bit(mc->shift,
Patrick Laicf999112011-08-23 11:27:20 -0700528 &msm_bedais[mc->reg].port_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700529 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700530 afe_loopback(0, msm_bedais[mc->reg].port_id,
531 msm_bedais[mc->shift].port_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700532 clear_bit(mc->shift,
Patrick Laicf999112011-08-23 11:27:20 -0700533 &msm_bedais[mc->reg].port_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700534 }
535
536 return 1;
537}
538
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -0700539static int msm_routing_get_fm_vol_mixer(struct snd_kcontrol *kcontrol,
540 struct snd_ctl_elem_value *ucontrol)
541{
542 ucontrol->value.integer.value[0] = msm_route_fm_vol_control;
543 return 0;
544}
545
546static int msm_routing_set_fm_vol_mixer(struct snd_kcontrol *kcontrol,
547 struct snd_ctl_elem_value *ucontrol)
548{
549 afe_loopback_gain(INT_FM_TX , ucontrol->value.integer.value[0]);
550
551 msm_route_fm_vol_control = ucontrol->value.integer.value[0];
552
553 return 0;
554}
555
Asish Bhattacharya0ec76182011-07-29 16:58:11 +0530556static int msm_routing_get_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
557 struct snd_ctl_elem_value *ucontrol)
558{
559 ucontrol->value.integer.value[0] = msm_route_lpa_vol_control;
560 return 0;
561}
562
563static int msm_routing_set_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
564 struct snd_ctl_elem_value *ucontrol)
565{
566 if (!lpa_set_volume(ucontrol->value.integer.value[0]))
567 msm_route_lpa_vol_control =
568 ucontrol->value.integer.value[0];
569
570 return 0;
571}
572
Ben Romberger037dd2f2011-09-22 14:01:32 -0700573static void msm_send_eq_values(int eq_idx)
574{
575 int result;
576 struct audio_client *ac =
577 q6asm_get_audio_client(fe_dai_map[eq_idx][SESSION_TYPE_RX]);
578
579 if (ac == NULL) {
580 pr_err("%s: Could not get audio client for session: %d\n",
581 __func__, fe_dai_map[eq_idx][SESSION_TYPE_RX]);
582 goto done;
583 }
584
585 result = q6asm_equalizer(ac, &eq_data[eq_idx]);
586
587 if (result < 0)
588 pr_err("%s: Call to ASM equalizer failed, returned = %d\n",
589 __func__, result);
590done:
591 return;
592}
593
594static int msm_routing_get_eq_enable_mixer(struct snd_kcontrol *kcontrol,
595 struct snd_ctl_elem_value *ucontrol)
596{
597 int eq_idx = ((struct soc_multi_mixer_control *)
598 kcontrol->private_value)->reg;
599
Ben Romberger76f57032011-12-08 20:07:34 -0800600 ucontrol->value.integer.value[0] = eq_data[eq_idx].enable;
601
Ben Romberger037dd2f2011-09-22 14:01:32 -0700602 pr_debug("%s: EQ #%d enable %d\n", __func__,
603 eq_idx, eq_data[eq_idx].enable);
Ben Romberger76f57032011-12-08 20:07:34 -0800604 return 0;
Ben Romberger037dd2f2011-09-22 14:01:32 -0700605}
606
607static int msm_routing_put_eq_enable_mixer(struct snd_kcontrol *kcontrol,
608 struct snd_ctl_elem_value *ucontrol)
609{
610 int eq_idx = ((struct soc_multi_mixer_control *)
611 kcontrol->private_value)->reg;
612 int value = ucontrol->value.integer.value[0];
613
614 pr_debug("%s: EQ #%d enable %d\n", __func__,
615 eq_idx, value);
616 eq_data[eq_idx].enable = value;
617
618 msm_send_eq_values(eq_idx);
619 return 0;
620}
621
622static int msm_routing_get_eq_band_count_audio_mixer(
623 struct snd_kcontrol *kcontrol,
624 struct snd_ctl_elem_value *ucontrol)
625{
626 int eq_idx = ((struct soc_multi_mixer_control *)
627 kcontrol->private_value)->reg;
628
Ben Romberger76f57032011-12-08 20:07:34 -0800629 ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands;
630
Ben Romberger037dd2f2011-09-22 14:01:32 -0700631 pr_debug("%s: EQ #%d bands %d\n", __func__,
632 eq_idx, eq_data[eq_idx].num_bands);
633 return eq_data[eq_idx].num_bands;
634}
635
636static int msm_routing_put_eq_band_count_audio_mixer(
637 struct snd_kcontrol *kcontrol,
638 struct snd_ctl_elem_value *ucontrol)
639{
640 int eq_idx = ((struct soc_multi_mixer_control *)
641 kcontrol->private_value)->reg;
642 int value = ucontrol->value.integer.value[0];
643
Ben Romberger037dd2f2011-09-22 14:01:32 -0700644 pr_debug("%s: EQ #%d bands %d\n", __func__,
645 eq_idx, value);
646 eq_data[eq_idx].num_bands = value;
647 return 0;
648}
649
650static int msm_routing_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
651 struct snd_ctl_elem_value *ucontrol)
652{
653 int eq_idx = ((struct soc_multi_mixer_control *)
654 kcontrol->private_value)->reg;
655 int band_idx = ((struct soc_multi_mixer_control *)
656 kcontrol->private_value)->shift;
657
Ben Romberger76f57032011-12-08 20:07:34 -0800658 ucontrol->value.integer.value[0] =
659 eq_data[eq_idx].eq_bands[band_idx].band_idx;
660 ucontrol->value.integer.value[1] =
661 eq_data[eq_idx].eq_bands[band_idx].filter_type;
662 ucontrol->value.integer.value[2] =
663 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz;
664 ucontrol->value.integer.value[3] =
665 eq_data[eq_idx].eq_bands[band_idx].filter_gain;
666 ucontrol->value.integer.value[4] =
667 eq_data[eq_idx].eq_bands[band_idx].q_factor;
668
Ben Romberger037dd2f2011-09-22 14:01:32 -0700669 pr_debug("%s: band_idx = %d\n", __func__,
670 eq_data[eq_idx].eq_bands[band_idx].band_idx);
671 pr_debug("%s: filter_type = %d\n", __func__,
672 eq_data[eq_idx].eq_bands[band_idx].filter_type);
673 pr_debug("%s: center_freq_hz = %d\n", __func__,
674 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz);
675 pr_debug("%s: filter_gain = %d\n", __func__,
676 eq_data[eq_idx].eq_bands[band_idx].filter_gain);
677 pr_debug("%s: q_factor = %d\n", __func__,
678 eq_data[eq_idx].eq_bands[band_idx].q_factor);
679 return 0;
680}
681
682static int msm_routing_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
683 struct snd_ctl_elem_value *ucontrol)
684{
685 int eq_idx = ((struct soc_multi_mixer_control *)
686 kcontrol->private_value)->reg;
687 int band_idx = ((struct soc_multi_mixer_control *)
688 kcontrol->private_value)->shift;
689
690 eq_data[eq_idx].eq_bands[band_idx].band_idx =
691 ucontrol->value.integer.value[0];
692 eq_data[eq_idx].eq_bands[band_idx].filter_type =
693 ucontrol->value.integer.value[1];
694 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz =
695 ucontrol->value.integer.value[2];
696 eq_data[eq_idx].eq_bands[band_idx].filter_gain =
697 ucontrol->value.integer.value[3];
698 eq_data[eq_idx].eq_bands[band_idx].q_factor =
699 ucontrol->value.integer.value[4];
700 return 0;
701}
702
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700703static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700704 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_I2S_RX ,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700705 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
706 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700707 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_PRI_I2S_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700708 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
709 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700710 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_PRI_I2S_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700711 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
712 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530713 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_PRI_I2S_RX,
714 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
715 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700716};
717
Kuirong Wang9bbf6132012-01-10 18:28:49 -0800718static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = {
719 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SEC_I2S_RX ,
720 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
721 msm_routing_put_audio_mixer),
722 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SEC_I2S_RX,
723 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
724 msm_routing_put_audio_mixer),
725 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SEC_I2S_RX,
726 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
727 msm_routing_put_audio_mixer),
728 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SEC_I2S_RX,
729 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
730 msm_routing_put_audio_mixer),
731};
732
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700733static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700734 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700735 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
736 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700737 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700738 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
739 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700740 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700741 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
742 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530743 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SLIMBUS_0_RX,
744 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
745 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700746};
747
Kuirong Wang274f21a2011-12-15 21:29:08 -0800748static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = {
749 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_MI2S_RX ,
750 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
751 msm_routing_put_audio_mixer),
752 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_MI2S_RX,
753 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
754 msm_routing_put_audio_mixer),
755 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_MI2S_RX,
756 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
757 msm_routing_put_audio_mixer),
758 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_MI2S_RX,
759 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
760 msm_routing_put_audio_mixer),
761};
762
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700763static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700764 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_HDMI_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700765 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
766 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700767 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_HDMI_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700768 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
769 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700770 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_HDMI_RX,
Asish Bhattacharyac592eed2011-09-16 17:43:02 +0530771 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
772 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530773 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_HDMI_RX,
774 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
775 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700776};
Helen Zeng0705a5f2011-10-14 15:29:52 -0700777 /* incall music delivery mixer */
778static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = {
779 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
780 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
781 msm_routing_put_audio_mixer),
782 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
783 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
784 msm_routing_put_audio_mixer),
785};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700786
787static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700788 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_BT_SCO_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700789 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
790 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700791 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_BT_SCO_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700792 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
793 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700794 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_BT_SCO_RX,
Asish Bhattacharyac592eed2011-09-16 17:43:02 +0530795 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
796 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530797 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_BT_SCO_RX,
798 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
799 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700800};
801
802static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700803 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_FM_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700804 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
805 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700806 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_FM_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700807 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
808 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700809 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_FM_RX,
Asish Bhattacharyac592eed2011-09-16 17:43:02 +0530810 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
811 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530812 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_FM_RX,
813 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
814 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700815};
816
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530817static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700818 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530819 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
820 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700821 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530822 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
823 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700824 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AFE_PCM_RX,
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530825 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
826 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530827 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AFE_PCM_RX,
828 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
829 msm_routing_put_audio_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530830};
831
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700832static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700833 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AUXPCM_RX,
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700834 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
835 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700836 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AUXPCM_RX,
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700837 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
838 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700839 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AUXPCM_RX,
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700840 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
841 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530842 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AUXPCM_RX,
843 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
844 msm_routing_put_audio_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700845};
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530846
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700847static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700848 SOC_SINGLE_EXT("PRI_TX", MSM_BACKEND_DAI_PRI_I2S_TX,
849 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
850 msm_routing_put_audio_mixer),
851 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
852 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
853 msm_routing_put_audio_mixer),
854 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_TX,
855 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
856 msm_routing_put_audio_mixer),
857 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
858 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
859 msm_routing_put_audio_mixer),
860 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
861 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
862 msm_routing_put_audio_mixer),
863 SOC_SINGLE_EXT("AFE_PCM_TX", MSM_BACKEND_DAI_AFE_PCM_TX,
864 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
865 msm_routing_put_audio_mixer),
Helen Zenge3d716a2011-10-14 16:32:16 -0700866 SOC_SINGLE_EXT("VOC_REC_DL", MSM_BACKEND_DAI_INCALL_RECORD_RX,
867 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
868 msm_routing_put_audio_mixer),
869 SOC_SINGLE_EXT("VOC_REC_UL", MSM_BACKEND_DAI_INCALL_RECORD_TX,
870 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
871 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700872};
873
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -0700874static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700875 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
876 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -0700877 msm_routing_put_audio_mixer),
878};
879
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700880static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700881 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_PRI_I2S_RX,
882 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
883 msm_routing_put_voice_mixer),
884 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_PRI_I2S_RX,
885 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
886 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700887};
888
Kuirong Wang9bbf6132012-01-10 18:28:49 -0800889static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
890 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SEC_I2S_RX,
891 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
892 msm_routing_put_voice_mixer),
893 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SEC_I2S_RX,
894 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
895 msm_routing_put_voice_mixer),
896};
897
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700898static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700899 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SLIMBUS_0_RX,
900 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
901 msm_routing_put_voice_mixer),
902 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
903 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
904 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700905};
906
907static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700908 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_INT_BT_SCO_RX,
909 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
910 msm_routing_put_voice_mixer),
911 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
912 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
913 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700914};
915
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530916static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
917 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AFE_PCM_RX,
918 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
919 msm_routing_put_voice_mixer),
920 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AFE_PCM_RX,
921 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
922 msm_routing_put_voice_mixer),
923};
924
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700925static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
926 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AUXPCM_RX,
927 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
928 msm_routing_put_voice_mixer),
929 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AUXPCM_RX,
930 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
931 msm_routing_put_voice_mixer),
932};
933
Alex Wong593576c2011-11-15 08:03:24 -0800934static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
935 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_HDMI_RX,
936 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
937 msm_routing_put_voice_mixer),
938 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_HDMI_RX,
939 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
940 msm_routing_put_voice_mixer),
941};
942
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700943static const struct snd_kcontrol_new tx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700944 SOC_SINGLE_EXT("PRI_TX_Voice", MSM_BACKEND_DAI_PRI_I2S_TX,
945 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
946 msm_routing_put_voice_mixer),
947 SOC_SINGLE_EXT("SLIM_0_TX_Voice", MSM_BACKEND_DAI_SLIMBUS_0_TX,
948 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
949 msm_routing_put_voice_mixer),
950 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voice",
951 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_CS_VOICE, 1, 0,
Neema Shetty2c07eb52011-08-21 20:33:52 -0700952 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530953 SOC_SINGLE_EXT("AFE_PCM_TX_Voice", MSM_BACKEND_DAI_AFE_PCM_TX,
954 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
955 msm_routing_put_voice_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700956 SOC_SINGLE_EXT("AUX_PCM_TX_Voice", MSM_BACKEND_DAI_AUXPCM_TX,
957 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
958 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700959};
960
961static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700962 SOC_SINGLE_EXT("PRI_TX_Voip", MSM_BACKEND_DAI_PRI_I2S_TX,
963 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
964 msm_routing_put_voice_mixer),
965 SOC_SINGLE_EXT("SLIM_0_TX_Voip", MSM_BACKEND_DAI_SLIMBUS_0_TX,
966 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
967 msm_routing_put_voice_mixer),
968 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voip", MSM_BACKEND_DAI_INT_BT_SCO_TX,
969 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
970 msm_routing_put_voice_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530971 SOC_SINGLE_EXT("AFE_PCM_TX_Voip", MSM_BACKEND_DAI_AFE_PCM_TX,
972 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
973 msm_routing_put_voice_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700974 SOC_SINGLE_EXT("AUX_PCM_TX_Voip", MSM_BACKEND_DAI_AUXPCM_TX,
975 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
976 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700977};
978
979static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700980 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700981 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
982 msm_routing_put_port_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700983 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700984 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
985 msm_routing_put_port_mixer),
Patrick Lai897baf92011-10-11 14:53:00 -0700986 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
987 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
988 msm_routing_put_port_mixer),
989};
990
991static const struct snd_kcontrol_new auxpcm_rx_port_mixer_controls[] = {
992 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_RX,
993 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
994 msm_routing_put_port_mixer),
995 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_AUXPCM_RX,
996 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
997 msm_routing_put_port_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700998};
999
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -07001000static const struct snd_kcontrol_new fm_switch_mixer_controls =
1001 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1002 0, 1, 0, msm_routing_get_switch_mixer,
1003 msm_routing_put_switch_mixer);
1004
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -07001005static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
1006 SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
1007 INT_FM_RX_VOL_GAIN, 0, msm_routing_get_fm_vol_mixer,
1008 msm_routing_set_fm_vol_mixer, fm_rx_vol_gain),
1009};
1010
Asish Bhattacharya0ec76182011-07-29 16:58:11 +05301011static const struct snd_kcontrol_new lpa_vol_mixer_controls[] = {
1012 SOC_SINGLE_EXT_TLV("LPA RX Volume", SND_SOC_NOPM, 0,
1013 INT_LPA_RX_VOL_GAIN, 0, msm_routing_get_lpa_vol_mixer,
1014 msm_routing_set_lpa_vol_mixer, lpa_rx_vol_gain),
1015};
1016
Ben Romberger037dd2f2011-09-22 14:01:32 -07001017static const struct snd_kcontrol_new eq_enable_mixer_controls[] = {
1018 SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM,
1019 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_eq_enable_mixer,
1020 msm_routing_put_eq_enable_mixer),
1021 SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM,
1022 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_eq_enable_mixer,
1023 msm_routing_put_eq_enable_mixer),
1024 SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM,
1025 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_eq_enable_mixer,
1026 msm_routing_put_eq_enable_mixer),
1027};
1028
1029static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
1030 SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM,
1031 MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0,
1032 msm_routing_get_eq_band_count_audio_mixer,
1033 msm_routing_put_eq_band_count_audio_mixer),
1034 SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM,
1035 MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0,
1036 msm_routing_get_eq_band_count_audio_mixer,
1037 msm_routing_put_eq_band_count_audio_mixer),
1038 SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM,
1039 MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0,
1040 msm_routing_get_eq_band_count_audio_mixer,
1041 msm_routing_put_eq_band_count_audio_mixer),
1042};
1043
1044static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = {
1045 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1,
1046 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1047 msm_routing_get_eq_band_audio_mixer,
1048 msm_routing_put_eq_band_audio_mixer),
1049 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2,
1050 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1051 msm_routing_get_eq_band_audio_mixer,
1052 msm_routing_put_eq_band_audio_mixer),
1053 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3,
1054 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1055 msm_routing_get_eq_band_audio_mixer,
1056 msm_routing_put_eq_band_audio_mixer),
1057 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4,
1058 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1059 msm_routing_get_eq_band_audio_mixer,
1060 msm_routing_put_eq_band_audio_mixer),
1061 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5,
1062 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1063 msm_routing_get_eq_band_audio_mixer,
1064 msm_routing_put_eq_band_audio_mixer),
1065 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6,
1066 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1067 msm_routing_get_eq_band_audio_mixer,
1068 msm_routing_put_eq_band_audio_mixer),
1069 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7,
1070 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1071 msm_routing_get_eq_band_audio_mixer,
1072 msm_routing_put_eq_band_audio_mixer),
1073 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8,
1074 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1075 msm_routing_get_eq_band_audio_mixer,
1076 msm_routing_put_eq_band_audio_mixer),
1077 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9,
1078 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1079 msm_routing_get_eq_band_audio_mixer,
1080 msm_routing_put_eq_band_audio_mixer),
1081 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10,
1082 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1083 msm_routing_get_eq_band_audio_mixer,
1084 msm_routing_put_eq_band_audio_mixer),
1085 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11,
1086 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1087 msm_routing_get_eq_band_audio_mixer,
1088 msm_routing_put_eq_band_audio_mixer),
1089 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12,
1090 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1091 msm_routing_get_eq_band_audio_mixer,
1092 msm_routing_put_eq_band_audio_mixer),
1093 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1,
1094 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1095 msm_routing_get_eq_band_audio_mixer,
1096 msm_routing_put_eq_band_audio_mixer),
1097 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2,
1098 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1099 msm_routing_get_eq_band_audio_mixer,
1100 msm_routing_put_eq_band_audio_mixer),
1101 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3,
1102 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1103 msm_routing_get_eq_band_audio_mixer,
1104 msm_routing_put_eq_band_audio_mixer),
1105 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4,
1106 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1107 msm_routing_get_eq_band_audio_mixer,
1108 msm_routing_put_eq_band_audio_mixer),
1109 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5,
1110 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1111 msm_routing_get_eq_band_audio_mixer,
1112 msm_routing_put_eq_band_audio_mixer),
1113 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6,
1114 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1115 msm_routing_get_eq_band_audio_mixer,
1116 msm_routing_put_eq_band_audio_mixer),
1117 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7,
1118 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1119 msm_routing_get_eq_band_audio_mixer,
1120 msm_routing_put_eq_band_audio_mixer),
1121 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8,
1122 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1123 msm_routing_get_eq_band_audio_mixer,
1124 msm_routing_put_eq_band_audio_mixer),
1125 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9,
1126 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1127 msm_routing_get_eq_band_audio_mixer,
1128 msm_routing_put_eq_band_audio_mixer),
1129 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10,
1130 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1131 msm_routing_get_eq_band_audio_mixer,
1132 msm_routing_put_eq_band_audio_mixer),
1133 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11,
1134 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1135 msm_routing_get_eq_band_audio_mixer,
1136 msm_routing_put_eq_band_audio_mixer),
1137 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12,
1138 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1139 msm_routing_get_eq_band_audio_mixer,
1140 msm_routing_put_eq_band_audio_mixer),
1141 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1,
1142 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1143 msm_routing_get_eq_band_audio_mixer,
1144 msm_routing_put_eq_band_audio_mixer),
1145 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2,
1146 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1147 msm_routing_get_eq_band_audio_mixer,
1148 msm_routing_put_eq_band_audio_mixer),
1149 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3,
1150 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1151 msm_routing_get_eq_band_audio_mixer,
1152 msm_routing_put_eq_band_audio_mixer),
1153 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4,
1154 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1155 msm_routing_get_eq_band_audio_mixer,
1156 msm_routing_put_eq_band_audio_mixer),
1157 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5,
1158 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1159 msm_routing_get_eq_band_audio_mixer,
1160 msm_routing_put_eq_band_audio_mixer),
1161 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6,
1162 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1163 msm_routing_get_eq_band_audio_mixer,
1164 msm_routing_put_eq_band_audio_mixer),
1165 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7,
1166 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1167 msm_routing_get_eq_band_audio_mixer,
1168 msm_routing_put_eq_band_audio_mixer),
1169 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8,
1170 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1171 msm_routing_get_eq_band_audio_mixer,
1172 msm_routing_put_eq_band_audio_mixer),
1173 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9,
1174 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1175 msm_routing_get_eq_band_audio_mixer,
1176 msm_routing_put_eq_band_audio_mixer),
1177 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10,
1178 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1179 msm_routing_get_eq_band_audio_mixer,
1180 msm_routing_put_eq_band_audio_mixer),
1181 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11,
1182 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1183 msm_routing_get_eq_band_audio_mixer,
1184 msm_routing_put_eq_band_audio_mixer),
1185 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12,
1186 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1187 msm_routing_get_eq_band_audio_mixer,
1188 msm_routing_put_eq_band_audio_mixer),
1189};
1190
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001191static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
1192 /* Frontend AIF */
1193 /* Widget name equals to Front-End DAI name<Need confirmation>,
1194 * Stream name must contains substring of front-end dai name
1195 */
1196 SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0),
1197 SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0),
1198 SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0),
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301199 SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001200 SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
1201 SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -07001202 SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001203 SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, 0, 0, 0),
1204 SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
1205 SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
1206 SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
1207 0, 0, 0, 0),
1208 SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture",
1209 0, 0, 0, 0),
1210 SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback",
1211 0, 0, 0, 0),
1212 SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture",
1213 0, 0, 0, 0),
Alex Wongb3d06a02012-01-12 10:00:41 -08001214 SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0),
Patrick Laie66c31a2012-01-22 22:00:45 -08001215 SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
1216 0, 0, 0, 0),
1217 SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture",
1218 0, 0, 0, 0),
Alex Wongb3d06a02012-01-12 10:00:41 -08001219
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001220 /* Backend AIF */
1221 /* Stream name equals to backend dai link stream name
1222 */
1223 SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0),
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001224 SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback",
1225 0, 0, 0 , 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001226 SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0),
1227 SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0 , 0),
Kuirong Wang274f21a2011-12-15 21:29:08 -08001228 SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001229 SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
1230 SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0),
1231 SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback",
1232 0, 0, 0 , 0),
1233 SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
1234 0, 0, 0, 0),
1235 SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
1236 0, 0, 0 , 0),
1237 SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
1238 0, 0, 0, 0),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301239 SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback",
1240 0, 0, 0 , 0),
1241 SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
Helen Zeng0705a5f2011-10-14 15:29:52 -07001242 0, 0, 0 , 0),
1243 /* incall */
1244 SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
1245 0, 0, 0 , 0),
Helen Zenge3d716a2011-10-14 16:32:16 -07001246 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture",
1247 0, 0, 0, 0),
1248 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture",
1249 0, 0, 0, 0),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001250 SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
1251 SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
Neema Shetty2ced1ba2012-02-16 12:10:05 -08001252 SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
1253 SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
1254 SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0),
1255 SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0),
1256
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -07001257 /* Switch Definitions */
Sriranjan Srikantamdf509d12011-10-24 17:53:27 -07001258 SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -07001259 &fm_switch_mixer_controls),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001260 /* Mixer definitions */
1261 SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1262 pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001263 SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1264 sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001265 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1266 slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)),
1267 SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
1268 hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
Kuirong Wang274f21a2011-12-15 21:29:08 -08001269 SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1270 mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001271 SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
1272 mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -07001273 SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
1274 mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001275 SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1276 auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
Helen Zeng0705a5f2011-10-14 15:29:52 -07001277 /* incall */
1278 SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
1279 incall_music_delivery_mixer_controls,
1280 ARRAY_SIZE(incall_music_delivery_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001281 /* Voice Mixer */
1282 SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer",
1283 SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls,
1284 ARRAY_SIZE(pri_rx_voice_mixer_controls)),
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001285 SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer",
1286 SND_SOC_NOPM, 0, 0,
1287 sec_i2s_rx_voice_mixer_controls,
1288 ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001289 SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer",
1290 SND_SOC_NOPM, 0, 0,
1291 slimbus_rx_voice_mixer_controls,
1292 ARRAY_SIZE(slimbus_rx_voice_mixer_controls)),
1293 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer",
1294 SND_SOC_NOPM, 0, 0,
1295 bt_sco_rx_voice_mixer_controls,
1296 ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301297 SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer",
1298 SND_SOC_NOPM, 0, 0,
1299 afe_pcm_rx_voice_mixer_controls,
1300 ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001301 SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer",
1302 SND_SOC_NOPM, 0, 0,
1303 aux_pcm_rx_voice_mixer_controls,
1304 ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)),
Alex Wong593576c2011-11-15 08:03:24 -08001305 SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
1306 SND_SOC_NOPM, 0, 0,
1307 hdmi_rx_voice_mixer_controls,
1308 ARRAY_SIZE(hdmi_rx_voice_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001309 SND_SOC_DAPM_MIXER("Voice_Tx Mixer",
1310 SND_SOC_NOPM, 0, 0, tx_voice_mixer_controls,
1311 ARRAY_SIZE(tx_voice_mixer_controls)),
1312 SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
1313 SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
1314 ARRAY_SIZE(tx_voip_mixer_controls)),
1315 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1316 int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
1317 SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1318 int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301319 SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1320 afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001321 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer",
1322 SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls,
1323 ARRAY_SIZE(sbus_0_rx_port_mixer_controls)),
Patrick Lai897baf92011-10-11 14:53:00 -07001324 SND_SOC_DAPM_MIXER("AUXPCM_RX Port Mixer",
1325 SND_SOC_NOPM, 0, 0, auxpcm_rx_port_mixer_controls,
1326 ARRAY_SIZE(auxpcm_rx_port_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001327};
1328
1329static const struct snd_soc_dapm_route intercon[] = {
1330 {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1331 {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1332 {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301333 {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001334 {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
1335
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001336 {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1337 {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1338 {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1339 {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1340 {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
1341
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001342 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1343 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1344 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301345 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001346 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
1347
1348 {"HDMI Mixer", "MultiMedia1", "MM_DL1"},
1349 {"HDMI Mixer", "MultiMedia2", "MM_DL2"},
Asish Bhattacharyac592eed2011-09-16 17:43:02 +05301350 {"HDMI Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301351 {"HDMI Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001352 {"HDMI", NULL, "HDMI Mixer"},
1353
Helen Zeng0705a5f2011-10-14 15:29:52 -07001354 /* incall */
1355 {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"},
1356 {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
1357 {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
Helen Zenge3d716a2011-10-14 16:32:16 -07001358
1359 {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
1360 {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
Kuirong Wang274f21a2011-12-15 21:29:08 -08001361 {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1362 {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1363 {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1364 {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1365 {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
Helen Zenge3d716a2011-10-14 16:32:16 -07001366
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001367 {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
1368 {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001369 {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001370
1371 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1372 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
Asish Bhattacharyac592eed2011-09-16 17:43:02 +05301373 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301374 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001375 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
1376
1377 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1378 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
Asish Bhattacharyac592eed2011-09-16 17:43:02 +05301379 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301380 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001381 {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"},
1382
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301383 {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1384 {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1385 {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301386 {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301387 {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
1388
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001389 {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1390 {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301391
1392 {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001393 {"MM_UL1", NULL, "MultiMedia1 Mixer"},
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -07001394 {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1395 {"MM_UL2", NULL, "MultiMedia2 Mixer"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001396
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001397 {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1398 {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1399 {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301400 {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001401 {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"},
1402
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001403 {"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1404 {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1405 {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
1406
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001407 {"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1408 {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
1409 {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
1410
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001411 {"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1412 {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
1413 {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
1414
1415 {"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1416 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
1417 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
1418
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301419 {"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1420 {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1421 {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
1422
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001423 {"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1424 {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1425 {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
1426
Alex Wong593576c2011-11-15 08:03:24 -08001427 {"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1428 {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1429 {"HDMI", NULL, "HDMI_RX_Voice Mixer"},
Alex Wongb3d06a02012-01-12 10:00:41 -08001430 {"HDMI", NULL, "HDMI_DL_HL"},
Alex Wong593576c2011-11-15 08:03:24 -08001431
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001432 {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
1433 {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
1434 {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301435 {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001436 {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001437 {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
1438 {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
1439 {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
1440 {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301441 {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001442 {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
1443
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001444 {"VOIP_UL", NULL, "Voip_Tx Mixer"},
Sriranjan Srikantamdf509d12011-10-24 17:53:27 -07001445 {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
1446 {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001447 {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
1448 {"INT_FM_RX", NULL, "INTFM_DL_HL"},
1449 {"INTFM_UL_HL", NULL, "INT_FM_TX"},
Patrick Laie66c31a2012-01-22 22:00:45 -08001450 {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
1451 {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001452 {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1453 {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
Patrick Lai897baf92011-10-11 14:53:00 -07001454 {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001455 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
Patrick Lai897baf92011-10-11 14:53:00 -07001456
1457 {"AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1458 {"AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1459 {"AUX_PCM_RX", NULL, "AUXPCM_RX Port Mixer"},
Neema Shetty2ced1ba2012-02-16 12:10:05 -08001460 {"STUB_RX", NULL, "VOICE_STUB_DL"},
1461 {"VOICE_STUB_UL", NULL, "STUB_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001462};
1463
Patrick Laicf999112011-08-23 11:27:20 -07001464static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,
1465 struct snd_pcm_hw_params *params)
1466{
1467 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1468 unsigned int be_id = rtd->dai_link->be_id;
1469
Patrick Lai770ca3e42011-12-12 13:44:54 -08001470 if (be_id >= MSM_BACKEND_DAI_MAX) {
1471 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1472 return -EINVAL;
1473 }
1474
Patrick Laicf999112011-08-23 11:27:20 -07001475 mutex_lock(&routing_lock);
1476 msm_bedais[be_id].hw_params = params;
1477 mutex_unlock(&routing_lock);
1478 return 0;
1479}
1480
1481static int msm_pcm_routing_close(struct snd_pcm_substream *substream)
1482{
1483 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1484 unsigned int be_id = rtd->dai_link->be_id;
1485 int i, session_type;
1486 struct msm_pcm_routing_bdai_data *bedai;
1487
1488 if (be_id >= MSM_BACKEND_DAI_MAX) {
1489 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1490 return -EINVAL;
1491 }
1492
1493 bedai = &msm_bedais[be_id];
1494
1495 session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
1496 0 : 1);
1497
1498 mutex_lock(&routing_lock);
1499
Asish Bhattacharya70b43c72011-12-29 00:50:38 +05301500 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
Patrick Laicf999112011-08-23 11:27:20 -07001501 if (fe_dai_map[i][session_type] != INVALID_SESSION)
1502 adm_close(bedai->port_id);
1503 }
1504
1505 bedai->active = 0;
1506 bedai->hw_params = NULL;
1507
1508 mutex_unlock(&routing_lock);
1509
1510 return 0;
1511}
1512
1513static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
1514{
1515 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1516 unsigned int be_id = rtd->dai_link->be_id;
1517 int i, path_type, session_type;
1518 struct msm_pcm_routing_bdai_data *bedai;
Kiran Kandi5e809b02012-01-31 00:24:33 -08001519 u32 channels;
Patrick Laicf999112011-08-23 11:27:20 -07001520
1521 if (be_id >= MSM_BACKEND_DAI_MAX) {
1522 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1523 return -EINVAL;
1524 }
1525
1526
1527 bedai = &msm_bedais[be_id];
1528
Jay Wangc8e03a82011-10-31 11:53:23 -07001529 if (bedai->hw_params == NULL) {
1530 pr_err("%s: HW param is not configured", __func__);
1531 return -EINVAL;
1532 }
1533
1534
Patrick Laicf999112011-08-23 11:27:20 -07001535 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1536 path_type = ADM_PATH_PLAYBACK;
1537 session_type = SESSION_TYPE_RX;
1538 } else {
1539 path_type = ADM_PATH_LIVE_REC;
1540 session_type = SESSION_TYPE_TX;
1541 }
1542
1543 mutex_lock(&routing_lock);
1544
1545 if (bedai->active == 1)
1546 goto done; /* Ignore prepare if back-end already active */
1547
1548 /* AFE port is not active at this point. However, still
1549 * go ahead setting active flag under the notion that
1550 * QDSP6 is able to handle ADM starting before AFE port
1551 * is started.
1552 */
1553 bedai->active = 1;
1554
Asish Bhattacharya70b43c72011-12-29 00:50:38 +05301555 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
Patrick Laicf999112011-08-23 11:27:20 -07001556 if (fe_dai_map[i][session_type] != INVALID_SESSION) {
Kiran Kandi5e809b02012-01-31 00:24:33 -08001557
1558 channels = params_channels(bedai->hw_params);
1559 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) &&
1560 (channels > 2))
1561 adm_multi_ch_copp_open(bedai->port_id,
1562 path_type,
1563 params_rate(bedai->hw_params),
1564 channels,
1565 DEFAULT_COPP_TOPOLOGY);
1566 else
1567 adm_open(bedai->port_id,
1568 path_type,
Patrick Laicf999112011-08-23 11:27:20 -07001569 params_rate(bedai->hw_params),
1570 params_channels(bedai->hw_params),
1571 DEFAULT_COPP_TOPOLOGY);
Kiran Kandi5e809b02012-01-31 00:24:33 -08001572
Patrick Laicf999112011-08-23 11:27:20 -07001573 msm_pcm_routing_build_matrix(i,
1574 fe_dai_map[i][session_type], path_type);
1575 }
1576 }
1577
1578done:
1579 mutex_unlock(&routing_lock);
1580
1581 return 0;
1582}
1583
1584static struct snd_pcm_ops msm_routing_pcm_ops = {
1585 .hw_params = msm_pcm_routing_hw_params,
1586 .close = msm_pcm_routing_close,
1587 .prepare = msm_pcm_routing_prepare,
1588};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001589
1590static unsigned int msm_routing_read(struct snd_soc_platform *platform,
1591 unsigned int reg)
1592{
1593 dev_dbg(platform->dev, "reg %x\n", reg);
1594 return 0;
1595}
1596
1597/* Not used but frame seems to require it */
1598static int msm_routing_write(struct snd_soc_platform *platform,
1599 unsigned int reg, unsigned int val)
1600{
1601 dev_dbg(platform->dev, "reg %x val %x\n", reg, val);
1602 return 0;
1603}
1604
1605/* Not used but frame seems to require it */
1606static int msm_routing_probe(struct snd_soc_platform *platform)
1607{
1608 snd_soc_dapm_new_controls(&platform->dapm, msm_qdsp6_widgets,
1609 ARRAY_SIZE(msm_qdsp6_widgets));
1610 snd_soc_dapm_add_routes(&platform->dapm, intercon,
1611 ARRAY_SIZE(intercon));
1612
1613 snd_soc_dapm_new_widgets(&platform->dapm);
1614
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -07001615 snd_soc_add_platform_controls(platform,
1616 int_fm_vol_mixer_controls,
1617 ARRAY_SIZE(int_fm_vol_mixer_controls));
Asish Bhattacharya0ec76182011-07-29 16:58:11 +05301618
1619 snd_soc_add_platform_controls(platform,
1620 lpa_vol_mixer_controls,
1621 ARRAY_SIZE(lpa_vol_mixer_controls));
Ben Romberger037dd2f2011-09-22 14:01:32 -07001622
1623 snd_soc_add_platform_controls(platform,
1624 eq_enable_mixer_controls,
1625 ARRAY_SIZE(eq_enable_mixer_controls));
1626
1627 snd_soc_add_platform_controls(platform,
1628 eq_band_mixer_controls,
1629 ARRAY_SIZE(eq_band_mixer_controls));
1630
1631 snd_soc_add_platform_controls(platform,
1632 eq_coeff_mixer_controls,
1633 ARRAY_SIZE(eq_coeff_mixer_controls));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001634 return 0;
1635}
1636
1637static struct snd_soc_platform_driver msm_soc_routing_platform = {
1638 .ops = &msm_routing_pcm_ops,
1639 .probe = msm_routing_probe,
1640 .read = msm_routing_read,
1641 .write = msm_routing_write,
1642};
1643
1644static __devinit int msm_routing_pcm_probe(struct platform_device *pdev)
1645{
1646 dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev));
1647 return snd_soc_register_platform(&pdev->dev,
1648 &msm_soc_routing_platform);
1649}
1650
1651static int msm_routing_pcm_remove(struct platform_device *pdev)
1652{
1653 snd_soc_unregister_platform(&pdev->dev);
1654 return 0;
1655}
1656
1657static struct platform_driver msm_routing_pcm_driver = {
1658 .driver = {
1659 .name = "msm-pcm-routing",
1660 .owner = THIS_MODULE,
1661 },
1662 .probe = msm_routing_pcm_probe,
1663 .remove = __devexit_p(msm_routing_pcm_remove),
1664};
1665
Tejas Shikhare6fd0e002012-01-31 21:17:29 -08001666int msm_routing_check_backend_enabled(int fedai_id)
1667{
1668 int i;
1669 if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) {
1670 /* bad ID assigned in machine driver */
1671 pr_err("%s: bad MM ID\n", __func__);
1672 return 0;
1673 }
1674 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
1675 if ((test_bit(fedai_id,
1676 &msm_bedais[i].fe_sessions))) {
1677 return msm_bedais[i].active;
1678 }
1679 }
1680 return 0;
1681}
1682
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001683static int __init msm_soc_routing_platform_init(void)
1684{
Neema Shettyfeea7742011-09-11 12:30:36 -07001685 mutex_init(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001686 return platform_driver_register(&msm_routing_pcm_driver);
1687}
1688module_init(msm_soc_routing_platform_init);
1689
1690static void __exit msm_soc_routing_platform_exit(void)
1691{
1692 platform_driver_unregister(&msm_routing_pcm_driver);
1693}
1694module_exit(msm_soc_routing_platform_exit);
1695
1696MODULE_DESCRIPTION("MSM routing platform driver");
1697MODULE_LICENSE("GPL v2");