blob: bce1455b2cfacd9761352ca987b5ad2c79d355ad [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 Shetty3c9d2862012-03-11 01:25:32 -0800123 { SLIMBUS_1_RX, 0, NULL, 0, 0},
124 { SLIMBUS_1_TX, 0, NULL, 0, 0},
125 { SLIMBUS_INVALID, 0, NULL, 0, 0},
Neema Shettyfeea7742011-09-11 12:30:36 -0700126};
127
128
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700129/* Track ASM playback & capture sessions of DAI */
Patrick Lai770ca3e42011-12-12 13:44:54 -0800130static int fe_dai_map[MSM_FRONTEND_DAI_MM_SIZE][2] = {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700131 /* MULTIMEDIA1 */
132 {INVALID_SESSION, INVALID_SESSION},
133 /* MULTIMEDIA2 */
134 {INVALID_SESSION, INVALID_SESSION},
135 /* MULTIMEDIA3 */
136 {INVALID_SESSION, INVALID_SESSION},
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530137 /* MULTIMEDIA4 */
138 {INVALID_SESSION, INVALID_SESSION},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700139};
140
Patrick Laicf999112011-08-23 11:27:20 -0700141static void msm_pcm_routing_build_matrix(int fedai_id, int dspst_id,
142 int path_type)
143{
144 int i, port_type;
145 struct route_payload payload;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700146
Patrick Laicf999112011-08-23 11:27:20 -0700147 payload.num_copps = 0;
148 port_type = (path_type == ADM_PATH_PLAYBACK ?
149 MSM_AFE_PORT_TYPE_RX : MSM_AFE_PORT_TYPE_TX);
150
151 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
152 if ((afe_get_port_type(msm_bedais[i].port_id) ==
153 port_type) &&
154 msm_bedais[i].active && (test_bit(fedai_id,
155 &msm_bedais[i].fe_sessions)))
156 payload.copp_ids[payload.num_copps++] =
157 msm_bedais[i].port_id;
158 }
159
160 if (payload.num_copps)
161 adm_matrix_map(dspst_id, path_type,
162 payload.num_copps, payload.copp_ids, 0);
163}
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700164
165void msm_pcm_routing_reg_phy_stream(int fedai_id, int dspst_id, int stream_type)
166{
Patrick Laicf999112011-08-23 11:27:20 -0700167 int i, session_type, path_type, port_type;
168 struct route_payload payload;
Kiran Kandi5e809b02012-01-31 00:24:33 -0800169 u32 channels;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700170
Patrick Lai770ca3e42011-12-12 13:44:54 -0800171 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
172 /* bad ID assigned in machine driver */
Neema Shetty3c9d2862012-03-11 01:25:32 -0800173 pr_err("%s: bad MM ID %d\n", __func__, fedai_id);
Patrick Lai770ca3e42011-12-12 13:44:54 -0800174 return;
175 }
176
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700177 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
Patrick Laicf999112011-08-23 11:27:20 -0700178 session_type = SESSION_TYPE_RX;
179 path_type = ADM_PATH_PLAYBACK;
180 port_type = MSM_AFE_PORT_TYPE_RX;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700181 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700182 session_type = SESSION_TYPE_TX;
183 path_type = ADM_PATH_LIVE_REC;
184 port_type = MSM_AFE_PORT_TYPE_TX;
185 }
186
187 mutex_lock(&routing_lock);
188
189 payload.num_copps = 0; /* only RX needs to use payload */
190 fe_dai_map[fedai_id][session_type] = dspst_id;
Ben Romberger037dd2f2011-09-22 14:01:32 -0700191 /* re-enable EQ if active */
192 if (eq_data[fedai_id].enable)
193 msm_send_eq_values(fedai_id);
Patrick Laicf999112011-08-23 11:27:20 -0700194 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
195 if ((afe_get_port_type(msm_bedais[i].port_id) ==
196 port_type) && msm_bedais[i].active &&
197 (test_bit(fedai_id,
198 &msm_bedais[i].fe_sessions))) {
Kiran Kandi5e809b02012-01-31 00:24:33 -0800199
200 channels = params_channels(msm_bedais[i].hw_params);
201
202 if ((stream_type == SNDRV_PCM_STREAM_PLAYBACK) &&
203 (channels > 2))
204 adm_multi_ch_copp_open(msm_bedais[i].port_id,
205 path_type,
206 params_rate(msm_bedais[i].hw_params),
207 channels,
208 DEFAULT_COPP_TOPOLOGY);
209 else
210 adm_open(msm_bedais[i].port_id,
Patrick Laicf999112011-08-23 11:27:20 -0700211 path_type,
212 params_rate(msm_bedais[i].hw_params),
213 params_channels(msm_bedais[i].hw_params),
214 DEFAULT_COPP_TOPOLOGY);
Kiran Kandi5e809b02012-01-31 00:24:33 -0800215
Patrick Laicf999112011-08-23 11:27:20 -0700216 payload.copp_ids[payload.num_copps++] =
217 msm_bedais[i].port_id;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700218 }
219 }
Patrick Laicf999112011-08-23 11:27:20 -0700220 if (payload.num_copps)
221 adm_matrix_map(dspst_id, path_type,
222 payload.num_copps, payload.copp_ids, 0);
223
224 mutex_unlock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700225}
226
227void msm_pcm_routing_dereg_phy_stream(int fedai_id, int stream_type)
228{
Patrick Laicf999112011-08-23 11:27:20 -0700229 int i, port_type, session_type;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700230
Patrick Lai770ca3e42011-12-12 13:44:54 -0800231 if (fedai_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
232 /* bad ID assigned in machine driver */
233 pr_err("%s: bad MM ID\n", __func__);
234 return;
235 }
236
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700237 if (stream_type == SNDRV_PCM_STREAM_PLAYBACK) {
Patrick Laicf999112011-08-23 11:27:20 -0700238 port_type = MSM_AFE_PORT_TYPE_RX;
239 session_type = SESSION_TYPE_RX;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700240 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700241 port_type = MSM_AFE_PORT_TYPE_TX;
242 session_type = SESSION_TYPE_TX;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700243 }
Patrick Laicf999112011-08-23 11:27:20 -0700244
245 mutex_lock(&routing_lock);
246
247 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
248 if ((afe_get_port_type(msm_bedais[i].port_id) ==
249 port_type) && msm_bedais[i].active &&
250 (test_bit(fedai_id,
251 &msm_bedais[i].fe_sessions)))
252 adm_close(msm_bedais[i].port_id);
253 }
254
255 fe_dai_map[fedai_id][session_type] = INVALID_SESSION;
256
257 mutex_unlock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700258}
259
Patrick Lai62314582012-02-17 21:33:05 -0800260/* Check if FE/BE route is set */
261static bool msm_pcm_routing_route_is_set(u16 be_id, u16 fe_id)
262{
263 bool rc = false;
264
Kuirong Wang1bd26c62012-03-09 17:02:23 -0800265 if (fe_id > MSM_FRONTEND_DAI_MM_MAX_ID) {
Patrick Lai62314582012-02-17 21:33:05 -0800266 /* recheck FE ID in the mixer control defined in this file */
267 pr_err("%s: bad MM ID\n", __func__);
268 return rc;
269 }
270
271 if (test_bit(fe_id, &msm_bedais[be_id].fe_sessions))
272 rc = true;
273
274 return rc;
275}
276
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700277static void msm_pcm_routing_process_audio(u16 reg, u16 val, int set)
278{
Patrick Laicf999112011-08-23 11:27:20 -0700279 int session_type, path_type;
Kiran Kandi5e809b02012-01-31 00:24:33 -0800280 u32 channels;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700281
282 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
283
Patrick Lai770ca3e42011-12-12 13:44:54 -0800284 if (val > MSM_FRONTEND_DAI_MM_MAX_ID) {
285 /* recheck FE ID in the mixer control defined in this file */
286 pr_err("%s: bad MM ID\n", __func__);
287 return;
288 }
289
Patrick Laicf999112011-08-23 11:27:20 -0700290 if (afe_get_port_type(msm_bedais[reg].port_id) ==
291 MSM_AFE_PORT_TYPE_RX) {
292 session_type = SESSION_TYPE_RX;
293 path_type = ADM_PATH_PLAYBACK;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700294 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700295 session_type = SESSION_TYPE_TX;
296 path_type = ADM_PATH_LIVE_REC;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700297 }
Patrick Laicf999112011-08-23 11:27:20 -0700298
299 mutex_lock(&routing_lock);
300
301 if (set) {
Helen Zeng0705a5f2011-10-14 15:29:52 -0700302 if (!test_bit(val, &msm_bedais[reg].fe_sessions) &&
303 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
304 voc_start_playback(set);
305
Patrick Laicf999112011-08-23 11:27:20 -0700306 set_bit(val, &msm_bedais[reg].fe_sessions);
307 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
308 INVALID_SESSION) {
Kiran Kandi5e809b02012-01-31 00:24:33 -0800309
310 channels = params_channels(msm_bedais[reg].hw_params);
311
312 if ((session_type == SESSION_TYPE_RX) && (channels > 2))
313 adm_multi_ch_copp_open(msm_bedais[reg].port_id,
314 path_type,
315 params_rate(msm_bedais[reg].hw_params),
316 channels,
317 DEFAULT_COPP_TOPOLOGY);
318 else
319 adm_open(msm_bedais[reg].port_id,
320 path_type,
Patrick Laicf999112011-08-23 11:27:20 -0700321 params_rate(msm_bedais[reg].hw_params),
322 params_channels(msm_bedais[reg].hw_params),
323 DEFAULT_COPP_TOPOLOGY);
Kiran Kandi5e809b02012-01-31 00:24:33 -0800324
Patrick Laicf999112011-08-23 11:27:20 -0700325 msm_pcm_routing_build_matrix(val,
326 fe_dai_map[val][session_type], path_type);
327 }
328 } else {
Helen Zeng0705a5f2011-10-14 15:29:52 -0700329 if (test_bit(val, &msm_bedais[reg].fe_sessions) &&
330 (msm_bedais[reg].port_id == VOICE_PLAYBACK_TX))
331 voc_start_playback(set);
Patrick Laicf999112011-08-23 11:27:20 -0700332 clear_bit(val, &msm_bedais[reg].fe_sessions);
333 if (msm_bedais[reg].active && fe_dai_map[val][session_type] !=
334 INVALID_SESSION) {
335 adm_close(msm_bedais[reg].port_id);
336 msm_pcm_routing_build_matrix(val,
337 fe_dai_map[val][session_type], path_type);
338 }
339 }
Helen Zenge3d716a2011-10-14 16:32:16 -0700340 if ((msm_bedais[reg].port_id == VOICE_RECORD_RX)
341 || (msm_bedais[reg].port_id == VOICE_RECORD_TX))
342 voc_start_record(msm_bedais[reg].port_id, set);
Patrick Laicf999112011-08-23 11:27:20 -0700343
344 mutex_unlock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700345}
346
347static int msm_routing_get_audio_mixer(struct snd_kcontrol *kcontrol,
348 struct snd_ctl_elem_value *ucontrol)
349{
350 struct soc_mixer_control *mc =
351 (struct soc_mixer_control *)kcontrol->private_value;
352
Patrick Laicf999112011-08-23 11:27:20 -0700353 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700354 ucontrol->value.integer.value[0] = 1;
355 else
356 ucontrol->value.integer.value[0] = 0;
357
358 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
359 ucontrol->value.integer.value[0]);
360
361 return 0;
362}
363
364static int msm_routing_put_audio_mixer(struct snd_kcontrol *kcontrol,
365 struct snd_ctl_elem_value *ucontrol)
366{
Patrick Laiec2b8942011-09-01 11:01:51 -0700367 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
368 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700369 struct soc_mixer_control *mc =
370 (struct soc_mixer_control *)kcontrol->private_value;
371
372
Patrick Lai62314582012-02-17 21:33:05 -0800373 if (ucontrol->value.integer.value[0] &&
374 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == false) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700375 msm_pcm_routing_process_audio(mc->reg, mc->shift, 1);
376 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
Patrick Lai62314582012-02-17 21:33:05 -0800377 } else if (!ucontrol->value.integer.value[0] &&
378 msm_pcm_routing_route_is_set(mc->reg, mc->shift) == true) {
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700379 msm_pcm_routing_process_audio(mc->reg, mc->shift, 0);
380 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
381 }
382
383 return 1;
384}
385
Neema Shettyfeea7742011-09-11 12:30:36 -0700386static void msm_pcm_routing_process_voice(u16 reg, u16 val, int set)
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700387{
Neema Shetty2c07eb52011-08-21 20:33:52 -0700388 u16 session_id = 0;
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700389
Neema Shettyfeea7742011-09-11 12:30:36 -0700390 pr_debug("%s: reg %x val %x set %x\n", __func__, reg, val, set);
Neema Shetty2c07eb52011-08-21 20:33:52 -0700391
Neema Shettyfeea7742011-09-11 12:30:36 -0700392 if (val == MSM_FRONTEND_DAI_CS_VOICE)
Neema Shetty2c07eb52011-08-21 20:33:52 -0700393 session_id = voc_get_session_id(VOICE_SESSION_NAME);
394 else
395 session_id = voc_get_session_id(VOIP_SESSION_NAME);
396
397 pr_debug("%s: FE DAI 0x%x session_id 0x%x\n",
Neema Shettyfeea7742011-09-11 12:30:36 -0700398 __func__, val, session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700399
Neema Shettyfeea7742011-09-11 12:30:36 -0700400 mutex_lock(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700401
402 if (set)
Neema Shettyfeea7742011-09-11 12:30:36 -0700403 set_bit(val, &msm_bedais[reg].fe_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700404 else
Neema Shettyfeea7742011-09-11 12:30:36 -0700405 clear_bit(val, &msm_bedais[reg].fe_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700406
Neema Shettyfeea7742011-09-11 12:30:36 -0700407 mutex_unlock(&routing_lock);
408
409 if (afe_get_port_type(msm_bedais[reg].port_id) ==
410 MSM_AFE_PORT_TYPE_RX) {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700411 voc_set_route_flag(session_id, RX_PATH, set);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700412 if (set) {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700413 voc_set_rxtx_port(session_id,
Neema Shettyfeea7742011-09-11 12:30:36 -0700414 msm_bedais[reg].port_id, DEV_RX);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700415
Neema Shetty2c07eb52011-08-21 20:33:52 -0700416 if (voc_get_route_flag(session_id, RX_PATH) &&
417 voc_get_route_flag(session_id, TX_PATH))
418 voc_enable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700419 } else {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700420 voc_disable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700421 }
422 } else {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700423 voc_set_route_flag(session_id, TX_PATH, set);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700424 if (set) {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700425 voc_set_rxtx_port(session_id,
Neema Shettyfeea7742011-09-11 12:30:36 -0700426 msm_bedais[reg].port_id, DEV_TX);
Neema Shetty2c07eb52011-08-21 20:33:52 -0700427 if (voc_get_route_flag(session_id, RX_PATH) &&
428 voc_get_route_flag(session_id, TX_PATH))
429 voc_enable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700430 } else {
Neema Shetty2c07eb52011-08-21 20:33:52 -0700431 voc_disable_cvp(session_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700432 }
433 }
434}
435
436static int msm_routing_get_voice_mixer(struct snd_kcontrol *kcontrol,
437 struct snd_ctl_elem_value *ucontrol)
438{
439 struct soc_mixer_control *mc =
440 (struct soc_mixer_control *)kcontrol->private_value;
441
Neema Shettyfeea7742011-09-11 12:30:36 -0700442 mutex_lock(&routing_lock);
443
444 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700445 ucontrol->value.integer.value[0] = 1;
446 else
447 ucontrol->value.integer.value[0] = 0;
448
Neema Shettyfeea7742011-09-11 12:30:36 -0700449 mutex_unlock(&routing_lock);
450
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700451 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
452 ucontrol->value.integer.value[0]);
453
454 return 0;
455}
456
457static int msm_routing_put_voice_mixer(struct snd_kcontrol *kcontrol,
458 struct snd_ctl_elem_value *ucontrol)
459{
Patrick Laiec2b8942011-09-01 11:01:51 -0700460 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
461 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700462 struct soc_mixer_control *mc =
463 (struct soc_mixer_control *)kcontrol->private_value;
464
465 if (ucontrol->value.integer.value[0]) {
Neema Shettyfeea7742011-09-11 12:30:36 -0700466 msm_pcm_routing_process_voice(mc->reg, mc->shift, 1);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700467 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
468 } else {
Neema Shettyfeea7742011-09-11 12:30:36 -0700469 msm_pcm_routing_process_voice(mc->reg, mc->shift, 0);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700470 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
471 }
472
473 return 1;
474}
475
Neema Shetty3c9d2862012-03-11 01:25:32 -0800476static int msm_routing_get_voice_stub_mixer(struct snd_kcontrol *kcontrol,
477 struct snd_ctl_elem_value *ucontrol)
478{
479 struct soc_mixer_control *mc =
480 (struct soc_mixer_control *)kcontrol->private_value;
481
482 mutex_lock(&routing_lock);
483
484 if (test_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions))
485 ucontrol->value.integer.value[0] = 1;
486 else
487 ucontrol->value.integer.value[0] = 0;
488
489 mutex_unlock(&routing_lock);
490
491 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
492 ucontrol->value.integer.value[0]);
493
494 return 0;
495}
496
497static int msm_routing_put_voice_stub_mixer(struct snd_kcontrol *kcontrol,
498 struct snd_ctl_elem_value *ucontrol)
499{
500 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
501 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
502 struct soc_mixer_control *mc =
503 (struct soc_mixer_control *)kcontrol->private_value;
504
505 if (ucontrol->value.integer.value[0]) {
506 mutex_lock(&routing_lock);
507 set_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
508 mutex_unlock(&routing_lock);
509
510 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
511 } else {
512 mutex_lock(&routing_lock);
513 clear_bit(mc->shift, &msm_bedais[mc->reg].fe_sessions);
514 mutex_unlock(&routing_lock);
515
516 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
517 }
518
519 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
520 ucontrol->value.integer.value[0]);
521
522 return 1;
523}
524
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -0700525static int msm_routing_get_switch_mixer(struct snd_kcontrol *kcontrol,
526 struct snd_ctl_elem_value *ucontrol)
527{
528 ucontrol->value.integer.value[0] = fm_switch_enable;
529 pr_debug("%s: FM Switch enable %ld\n", __func__,
530 ucontrol->value.integer.value[0]);
531 return 0;
532}
533
534static int msm_routing_put_switch_mixer(struct snd_kcontrol *kcontrol,
535 struct snd_ctl_elem_value *ucontrol)
536{
Sriranjan Srikantamdf509d12011-10-24 17:53:27 -0700537 struct snd_soc_dapm_widget_list *wlist = snd_kcontrol_chip(kcontrol);
538 struct snd_soc_dapm_widget *widget = wlist->widgets[0];
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -0700539
540 pr_debug("%s: FM Switch enable %ld\n", __func__,
541 ucontrol->value.integer.value[0]);
542 if (ucontrol->value.integer.value[0])
543 snd_soc_dapm_mixer_update_power(widget, kcontrol, 1);
544 else
545 snd_soc_dapm_mixer_update_power(widget, kcontrol, 0);
546 fm_switch_enable = ucontrol->value.integer.value[0];
547 return 1;
548}
549
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700550static int msm_routing_get_port_mixer(struct snd_kcontrol *kcontrol,
551 struct snd_ctl_elem_value *ucontrol)
552{
553 struct soc_mixer_control *mc =
554 (struct soc_mixer_control *)kcontrol->private_value;
555
Patrick Laicf999112011-08-23 11:27:20 -0700556 if (test_bit(mc->shift, &msm_bedais[mc->reg].port_sessions))
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700557 ucontrol->value.integer.value[0] = 1;
558 else
559 ucontrol->value.integer.value[0] = 0;
560
561 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg, mc->shift,
562 ucontrol->value.integer.value[0]);
563
564 return 0;
565}
566
567static int msm_routing_put_port_mixer(struct snd_kcontrol *kcontrol,
568 struct snd_ctl_elem_value *ucontrol)
569{
570 struct soc_mixer_control *mc =
571 (struct soc_mixer_control *)kcontrol->private_value;
572
573 pr_debug("%s: reg %x shift %x val %ld\n", __func__, mc->reg,
574 mc->shift, ucontrol->value.integer.value[0]);
575
576 if (ucontrol->value.integer.value[0]) {
Patrick Laicf999112011-08-23 11:27:20 -0700577 afe_loopback(1, msm_bedais[mc->reg].port_id,
578 msm_bedais[mc->shift].port_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700579 set_bit(mc->shift,
Patrick Laicf999112011-08-23 11:27:20 -0700580 &msm_bedais[mc->reg].port_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700581 } else {
Patrick Laicf999112011-08-23 11:27:20 -0700582 afe_loopback(0, msm_bedais[mc->reg].port_id,
583 msm_bedais[mc->shift].port_id);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700584 clear_bit(mc->shift,
Patrick Laicf999112011-08-23 11:27:20 -0700585 &msm_bedais[mc->reg].port_sessions);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700586 }
587
588 return 1;
589}
590
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -0700591static int msm_routing_get_fm_vol_mixer(struct snd_kcontrol *kcontrol,
592 struct snd_ctl_elem_value *ucontrol)
593{
594 ucontrol->value.integer.value[0] = msm_route_fm_vol_control;
595 return 0;
596}
597
598static int msm_routing_set_fm_vol_mixer(struct snd_kcontrol *kcontrol,
599 struct snd_ctl_elem_value *ucontrol)
600{
601 afe_loopback_gain(INT_FM_TX , ucontrol->value.integer.value[0]);
602
603 msm_route_fm_vol_control = ucontrol->value.integer.value[0];
604
605 return 0;
606}
607
Asish Bhattacharya0ec76182011-07-29 16:58:11 +0530608static int msm_routing_get_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
609 struct snd_ctl_elem_value *ucontrol)
610{
611 ucontrol->value.integer.value[0] = msm_route_lpa_vol_control;
612 return 0;
613}
614
615static int msm_routing_set_lpa_vol_mixer(struct snd_kcontrol *kcontrol,
616 struct snd_ctl_elem_value *ucontrol)
617{
618 if (!lpa_set_volume(ucontrol->value.integer.value[0]))
619 msm_route_lpa_vol_control =
620 ucontrol->value.integer.value[0];
621
622 return 0;
623}
624
Ben Romberger037dd2f2011-09-22 14:01:32 -0700625static void msm_send_eq_values(int eq_idx)
626{
627 int result;
628 struct audio_client *ac =
629 q6asm_get_audio_client(fe_dai_map[eq_idx][SESSION_TYPE_RX]);
630
631 if (ac == NULL) {
632 pr_err("%s: Could not get audio client for session: %d\n",
633 __func__, fe_dai_map[eq_idx][SESSION_TYPE_RX]);
634 goto done;
635 }
636
637 result = q6asm_equalizer(ac, &eq_data[eq_idx]);
638
639 if (result < 0)
640 pr_err("%s: Call to ASM equalizer failed, returned = %d\n",
641 __func__, result);
642done:
643 return;
644}
645
646static int msm_routing_get_eq_enable_mixer(struct snd_kcontrol *kcontrol,
647 struct snd_ctl_elem_value *ucontrol)
648{
649 int eq_idx = ((struct soc_multi_mixer_control *)
650 kcontrol->private_value)->reg;
651
Ben Romberger76f57032011-12-08 20:07:34 -0800652 ucontrol->value.integer.value[0] = eq_data[eq_idx].enable;
653
Ben Romberger037dd2f2011-09-22 14:01:32 -0700654 pr_debug("%s: EQ #%d enable %d\n", __func__,
655 eq_idx, eq_data[eq_idx].enable);
Ben Romberger76f57032011-12-08 20:07:34 -0800656 return 0;
Ben Romberger037dd2f2011-09-22 14:01:32 -0700657}
658
659static int msm_routing_put_eq_enable_mixer(struct snd_kcontrol *kcontrol,
660 struct snd_ctl_elem_value *ucontrol)
661{
662 int eq_idx = ((struct soc_multi_mixer_control *)
663 kcontrol->private_value)->reg;
664 int value = ucontrol->value.integer.value[0];
665
666 pr_debug("%s: EQ #%d enable %d\n", __func__,
667 eq_idx, value);
668 eq_data[eq_idx].enable = value;
669
670 msm_send_eq_values(eq_idx);
671 return 0;
672}
673
674static int msm_routing_get_eq_band_count_audio_mixer(
675 struct snd_kcontrol *kcontrol,
676 struct snd_ctl_elem_value *ucontrol)
677{
678 int eq_idx = ((struct soc_multi_mixer_control *)
679 kcontrol->private_value)->reg;
680
Ben Romberger76f57032011-12-08 20:07:34 -0800681 ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands;
682
Ben Romberger037dd2f2011-09-22 14:01:32 -0700683 pr_debug("%s: EQ #%d bands %d\n", __func__,
684 eq_idx, eq_data[eq_idx].num_bands);
685 return eq_data[eq_idx].num_bands;
686}
687
688static int msm_routing_put_eq_band_count_audio_mixer(
689 struct snd_kcontrol *kcontrol,
690 struct snd_ctl_elem_value *ucontrol)
691{
692 int eq_idx = ((struct soc_multi_mixer_control *)
693 kcontrol->private_value)->reg;
694 int value = ucontrol->value.integer.value[0];
695
Ben Romberger037dd2f2011-09-22 14:01:32 -0700696 pr_debug("%s: EQ #%d bands %d\n", __func__,
697 eq_idx, value);
698 eq_data[eq_idx].num_bands = value;
699 return 0;
700}
701
702static int msm_routing_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
703 struct snd_ctl_elem_value *ucontrol)
704{
705 int eq_idx = ((struct soc_multi_mixer_control *)
706 kcontrol->private_value)->reg;
707 int band_idx = ((struct soc_multi_mixer_control *)
708 kcontrol->private_value)->shift;
709
Ben Romberger76f57032011-12-08 20:07:34 -0800710 ucontrol->value.integer.value[0] =
711 eq_data[eq_idx].eq_bands[band_idx].band_idx;
712 ucontrol->value.integer.value[1] =
713 eq_data[eq_idx].eq_bands[band_idx].filter_type;
714 ucontrol->value.integer.value[2] =
715 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz;
716 ucontrol->value.integer.value[3] =
717 eq_data[eq_idx].eq_bands[band_idx].filter_gain;
718 ucontrol->value.integer.value[4] =
719 eq_data[eq_idx].eq_bands[band_idx].q_factor;
720
Ben Romberger037dd2f2011-09-22 14:01:32 -0700721 pr_debug("%s: band_idx = %d\n", __func__,
722 eq_data[eq_idx].eq_bands[band_idx].band_idx);
723 pr_debug("%s: filter_type = %d\n", __func__,
724 eq_data[eq_idx].eq_bands[band_idx].filter_type);
725 pr_debug("%s: center_freq_hz = %d\n", __func__,
726 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz);
727 pr_debug("%s: filter_gain = %d\n", __func__,
728 eq_data[eq_idx].eq_bands[band_idx].filter_gain);
729 pr_debug("%s: q_factor = %d\n", __func__,
730 eq_data[eq_idx].eq_bands[band_idx].q_factor);
731 return 0;
732}
733
734static int msm_routing_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
735 struct snd_ctl_elem_value *ucontrol)
736{
737 int eq_idx = ((struct soc_multi_mixer_control *)
738 kcontrol->private_value)->reg;
739 int band_idx = ((struct soc_multi_mixer_control *)
740 kcontrol->private_value)->shift;
741
742 eq_data[eq_idx].eq_bands[band_idx].band_idx =
743 ucontrol->value.integer.value[0];
744 eq_data[eq_idx].eq_bands[band_idx].filter_type =
745 ucontrol->value.integer.value[1];
746 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz =
747 ucontrol->value.integer.value[2];
748 eq_data[eq_idx].eq_bands[band_idx].filter_gain =
749 ucontrol->value.integer.value[3];
750 eq_data[eq_idx].eq_bands[band_idx].q_factor =
751 ucontrol->value.integer.value[4];
752 return 0;
753}
754
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700755static const struct snd_kcontrol_new pri_i2s_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700756 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_PRI_I2S_RX ,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700757 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
758 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700759 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_PRI_I2S_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700760 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
761 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700762 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_PRI_I2S_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700763 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
764 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530765 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_PRI_I2S_RX,
766 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
767 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700768};
769
Kuirong Wang9bbf6132012-01-10 18:28:49 -0800770static const struct snd_kcontrol_new sec_i2s_rx_mixer_controls[] = {
771 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SEC_I2S_RX ,
772 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
773 msm_routing_put_audio_mixer),
774 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SEC_I2S_RX,
775 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
776 msm_routing_put_audio_mixer),
777 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SEC_I2S_RX,
778 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
779 msm_routing_put_audio_mixer),
780 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SEC_I2S_RX,
781 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
782 msm_routing_put_audio_mixer),
783};
784
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700785static const struct snd_kcontrol_new slimbus_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700786 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700787 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
788 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700789 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700790 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
791 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700792 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700793 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
794 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530795 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_SLIMBUS_0_RX,
796 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
797 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700798};
799
Kuirong Wang274f21a2011-12-15 21:29:08 -0800800static const struct snd_kcontrol_new mi2s_rx_mixer_controls[] = {
801 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_MI2S_RX ,
802 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
803 msm_routing_put_audio_mixer),
804 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_MI2S_RX,
805 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
806 msm_routing_put_audio_mixer),
807 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_MI2S_RX,
808 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
809 msm_routing_put_audio_mixer),
810 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_MI2S_RX,
811 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
812 msm_routing_put_audio_mixer),
813};
814
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700815static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700816 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_HDMI_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700817 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
818 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700819 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_HDMI_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700820 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
821 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700822 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_HDMI_RX,
Asish Bhattacharyac592eed2011-09-16 17:43:02 +0530823 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
824 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530825 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_HDMI_RX,
826 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
827 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700828};
Helen Zeng0705a5f2011-10-14 15:29:52 -0700829 /* incall music delivery mixer */
830static const struct snd_kcontrol_new incall_music_delivery_mixer_controls[] = {
831 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
832 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
833 msm_routing_put_audio_mixer),
834 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_VOICE_PLAYBACK_TX,
835 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
836 msm_routing_put_audio_mixer),
837};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700838
839static const struct snd_kcontrol_new int_bt_sco_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700840 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_BT_SCO_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700841 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
842 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700843 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_BT_SCO_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700844 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
845 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700846 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_BT_SCO_RX,
Asish Bhattacharyac592eed2011-09-16 17:43:02 +0530847 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
848 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530849 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_BT_SCO_RX,
850 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
851 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700852};
853
854static const struct snd_kcontrol_new int_fm_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700855 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_INT_FM_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700856 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
857 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700858 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_INT_FM_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700859 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
860 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700861 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_INT_FM_RX,
Asish Bhattacharyac592eed2011-09-16 17:43:02 +0530862 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
863 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530864 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_INT_FM_RX,
865 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
866 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700867};
868
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530869static const struct snd_kcontrol_new afe_pcm_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700870 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AFE_PCM_RX,
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530871 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
872 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700873 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AFE_PCM_RX,
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530874 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
875 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700876 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AFE_PCM_RX,
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530877 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
878 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530879 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AFE_PCM_RX,
880 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
881 msm_routing_put_audio_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530882};
883
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700884static const struct snd_kcontrol_new auxpcm_rx_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700885 SOC_SINGLE_EXT("MultiMedia1", MSM_BACKEND_DAI_AUXPCM_RX,
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700886 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
887 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700888 SOC_SINGLE_EXT("MultiMedia2", MSM_BACKEND_DAI_AUXPCM_RX,
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700889 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
890 msm_routing_put_audio_mixer),
Patrick Laicf999112011-08-23 11:27:20 -0700891 SOC_SINGLE_EXT("MultiMedia3", MSM_BACKEND_DAI_AUXPCM_RX,
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700892 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
893 msm_routing_put_audio_mixer),
Asish Bhattacharya305d1752011-11-01 20:38:26 +0530894 SOC_SINGLE_EXT("MultiMedia4", MSM_BACKEND_DAI_AUXPCM_RX,
895 MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
896 msm_routing_put_audio_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700897};
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530898
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700899static const struct snd_kcontrol_new mmul1_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700900 SOC_SINGLE_EXT("PRI_TX", MSM_BACKEND_DAI_PRI_I2S_TX,
901 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
902 msm_routing_put_audio_mixer),
903 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_TX,
904 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
905 msm_routing_put_audio_mixer),
906 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_TX,
907 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
908 msm_routing_put_audio_mixer),
909 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
910 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
911 msm_routing_put_audio_mixer),
912 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
913 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
914 msm_routing_put_audio_mixer),
915 SOC_SINGLE_EXT("AFE_PCM_TX", MSM_BACKEND_DAI_AFE_PCM_TX,
916 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
917 msm_routing_put_audio_mixer),
Helen Zenge3d716a2011-10-14 16:32:16 -0700918 SOC_SINGLE_EXT("VOC_REC_DL", MSM_BACKEND_DAI_INCALL_RECORD_RX,
919 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
920 msm_routing_put_audio_mixer),
921 SOC_SINGLE_EXT("VOC_REC_UL", MSM_BACKEND_DAI_INCALL_RECORD_TX,
922 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
923 msm_routing_put_audio_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700924};
925
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -0700926static const struct snd_kcontrol_new mmul2_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -0700927 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_INT_FM_TX,
928 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -0700929 msm_routing_put_audio_mixer),
930};
931
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700932static const struct snd_kcontrol_new pri_rx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700933 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_PRI_I2S_RX,
934 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
935 msm_routing_put_voice_mixer),
936 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_PRI_I2S_RX,
937 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
938 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700939};
940
Kuirong Wang9bbf6132012-01-10 18:28:49 -0800941static const struct snd_kcontrol_new sec_i2s_rx_voice_mixer_controls[] = {
942 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SEC_I2S_RX,
943 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
944 msm_routing_put_voice_mixer),
945 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SEC_I2S_RX,
946 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
947 msm_routing_put_voice_mixer),
948};
949
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700950static const struct snd_kcontrol_new slimbus_rx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700951 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_SLIMBUS_0_RX,
952 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
953 msm_routing_put_voice_mixer),
954 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_SLIMBUS_0_RX ,
955 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
956 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700957};
958
959static const struct snd_kcontrol_new bt_sco_rx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -0700960 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_INT_BT_SCO_RX,
961 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
962 msm_routing_put_voice_mixer),
963 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_INT_BT_SCO_RX ,
964 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
965 msm_routing_put_voice_mixer),
Neema Shetty3c9d2862012-03-11 01:25:32 -0800966 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_INT_BT_SCO_RX,
967 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
968 msm_routing_put_voice_stub_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -0700969};
970
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530971static const struct snd_kcontrol_new afe_pcm_rx_voice_mixer_controls[] = {
972 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AFE_PCM_RX,
973 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
974 msm_routing_put_voice_mixer),
975 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AFE_PCM_RX,
976 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
977 msm_routing_put_voice_mixer),
Neema Shetty3c9d2862012-03-11 01:25:32 -0800978 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AFE_PCM_RX,
979 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
980 msm_routing_put_voice_stub_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +0530981};
982
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700983static const struct snd_kcontrol_new aux_pcm_rx_voice_mixer_controls[] = {
984 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_AUXPCM_RX,
985 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
986 msm_routing_put_voice_mixer),
987 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_AUXPCM_RX,
988 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
989 msm_routing_put_voice_mixer),
Neema Shetty3c9d2862012-03-11 01:25:32 -0800990 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_AUXPCM_RX,
991 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
992 msm_routing_put_voice_stub_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -0700993};
994
Alex Wong593576c2011-11-15 08:03:24 -0800995static const struct snd_kcontrol_new hdmi_rx_voice_mixer_controls[] = {
996 SOC_SINGLE_EXT("CSVoice", MSM_BACKEND_DAI_HDMI_RX,
997 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
998 msm_routing_put_voice_mixer),
999 SOC_SINGLE_EXT("Voip", MSM_BACKEND_DAI_HDMI_RX,
1000 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1001 msm_routing_put_voice_mixer),
1002};
1003
Neema Shetty3c9d2862012-03-11 01:25:32 -08001004static const struct snd_kcontrol_new stub_rx_mixer_controls[] = {
1005 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_INVALID,
1006 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1007 msm_routing_put_voice_stub_mixer),
1008};
1009
1010static const struct snd_kcontrol_new slimbus_1_rx_mixer_controls[] = {
1011 SOC_SINGLE_EXT("Voice Stub", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1012 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1013 msm_routing_put_voice_stub_mixer),
1014};
1015
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001016static const struct snd_kcontrol_new tx_voice_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -07001017 SOC_SINGLE_EXT("PRI_TX_Voice", MSM_BACKEND_DAI_PRI_I2S_TX,
1018 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1019 msm_routing_put_voice_mixer),
1020 SOC_SINGLE_EXT("SLIM_0_TX_Voice", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1021 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1022 msm_routing_put_voice_mixer),
1023 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voice",
1024 MSM_BACKEND_DAI_INT_BT_SCO_TX, MSM_FRONTEND_DAI_CS_VOICE, 1, 0,
Neema Shetty2c07eb52011-08-21 20:33:52 -07001025 msm_routing_get_voice_mixer, msm_routing_put_voice_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301026 SOC_SINGLE_EXT("AFE_PCM_TX_Voice", MSM_BACKEND_DAI_AFE_PCM_TX,
1027 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1028 msm_routing_put_voice_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001029 SOC_SINGLE_EXT("AUX_PCM_TX_Voice", MSM_BACKEND_DAI_AUXPCM_TX,
1030 MSM_FRONTEND_DAI_CS_VOICE, 1, 0, msm_routing_get_voice_mixer,
1031 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001032};
1033
1034static const struct snd_kcontrol_new tx_voip_mixer_controls[] = {
Neema Shettyfeea7742011-09-11 12:30:36 -07001035 SOC_SINGLE_EXT("PRI_TX_Voip", MSM_BACKEND_DAI_PRI_I2S_TX,
1036 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1037 msm_routing_put_voice_mixer),
1038 SOC_SINGLE_EXT("SLIM_0_TX_Voip", MSM_BACKEND_DAI_SLIMBUS_0_TX,
1039 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1040 msm_routing_put_voice_mixer),
1041 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX_Voip", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1042 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1043 msm_routing_put_voice_mixer),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301044 SOC_SINGLE_EXT("AFE_PCM_TX_Voip", MSM_BACKEND_DAI_AFE_PCM_TX,
1045 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1046 msm_routing_put_voice_mixer),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001047 SOC_SINGLE_EXT("AUX_PCM_TX_Voip", MSM_BACKEND_DAI_AUXPCM_TX,
1048 MSM_FRONTEND_DAI_VOIP, 1, 0, msm_routing_get_voice_mixer,
1049 msm_routing_put_voice_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001050};
1051
Neema Shetty3c9d2862012-03-11 01:25:32 -08001052static const struct snd_kcontrol_new tx_voice_stub_mixer_controls[] = {
1053 SOC_SINGLE_EXT("STUB_TX_HL", MSM_BACKEND_DAI_INVALID,
1054 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1055 msm_routing_put_voice_stub_mixer),
1056 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_INT_BT_SCO_TX,
1057 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1058 msm_routing_put_voice_stub_mixer),
1059 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_SLIMBUS_1_TX,
1060 MSM_FRONTEND_DAI_VOICE_STUB, 1, 0, msm_routing_get_voice_stub_mixer,
1061 msm_routing_put_voice_stub_mixer),
1062};
1063
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001064static const struct snd_kcontrol_new sbus_0_rx_port_mixer_controls[] = {
Patrick Laicf999112011-08-23 11:27:20 -07001065 SOC_SINGLE_EXT("INTERNAL_FM_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001066 MSM_BACKEND_DAI_INT_FM_TX, 1, 0, msm_routing_get_port_mixer,
1067 msm_routing_put_port_mixer),
Patrick Laicf999112011-08-23 11:27:20 -07001068 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001069 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1070 msm_routing_put_port_mixer),
Patrick Lai897baf92011-10-11 14:53:00 -07001071 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_SLIMBUS_0_RX,
1072 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1073 msm_routing_put_port_mixer),
1074};
1075
1076static const struct snd_kcontrol_new auxpcm_rx_port_mixer_controls[] = {
1077 SOC_SINGLE_EXT("AUX_PCM_UL_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1078 MSM_BACKEND_DAI_AUXPCM_TX, 1, 0, msm_routing_get_port_mixer,
1079 msm_routing_put_port_mixer),
1080 SOC_SINGLE_EXT("SLIM_0_TX", MSM_BACKEND_DAI_AUXPCM_RX,
1081 MSM_BACKEND_DAI_SLIMBUS_0_TX, 1, 0, msm_routing_get_port_mixer,
1082 msm_routing_put_port_mixer),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001083};
1084
Neema Shetty3c9d2862012-03-11 01:25:32 -08001085static const struct snd_kcontrol_new sbus_1_rx_port_mixer_controls[] = {
1086 SOC_SINGLE_EXT("INTERNAL_BT_SCO_TX", MSM_BACKEND_DAI_SLIMBUS_1_RX,
1087 MSM_BACKEND_DAI_INT_BT_SCO_TX, 1, 0, msm_routing_get_port_mixer,
1088 msm_routing_put_port_mixer),
1089};
1090
1091static const struct snd_kcontrol_new bt_sco_rx_port_mixer_controls[] = {
1092 SOC_SINGLE_EXT("SLIM_1_TX", MSM_BACKEND_DAI_INT_BT_SCO_RX,
1093 MSM_BACKEND_DAI_SLIMBUS_1_TX, 1, 0, msm_routing_get_port_mixer,
1094 msm_routing_put_port_mixer),
1095};
1096
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -07001097static const struct snd_kcontrol_new fm_switch_mixer_controls =
1098 SOC_SINGLE_EXT("Switch", SND_SOC_NOPM,
1099 0, 1, 0, msm_routing_get_switch_mixer,
1100 msm_routing_put_switch_mixer);
1101
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -07001102static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
1103 SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
1104 INT_FM_RX_VOL_GAIN, 0, msm_routing_get_fm_vol_mixer,
1105 msm_routing_set_fm_vol_mixer, fm_rx_vol_gain),
1106};
1107
Asish Bhattacharya0ec76182011-07-29 16:58:11 +05301108static const struct snd_kcontrol_new lpa_vol_mixer_controls[] = {
1109 SOC_SINGLE_EXT_TLV("LPA RX Volume", SND_SOC_NOPM, 0,
1110 INT_LPA_RX_VOL_GAIN, 0, msm_routing_get_lpa_vol_mixer,
1111 msm_routing_set_lpa_vol_mixer, lpa_rx_vol_gain),
1112};
1113
Ben Romberger037dd2f2011-09-22 14:01:32 -07001114static const struct snd_kcontrol_new eq_enable_mixer_controls[] = {
1115 SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM,
1116 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_eq_enable_mixer,
1117 msm_routing_put_eq_enable_mixer),
1118 SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM,
1119 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_eq_enable_mixer,
1120 msm_routing_put_eq_enable_mixer),
1121 SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM,
1122 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_eq_enable_mixer,
1123 msm_routing_put_eq_enable_mixer),
1124};
1125
1126static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
1127 SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM,
1128 MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0,
1129 msm_routing_get_eq_band_count_audio_mixer,
1130 msm_routing_put_eq_band_count_audio_mixer),
1131 SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM,
1132 MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0,
1133 msm_routing_get_eq_band_count_audio_mixer,
1134 msm_routing_put_eq_band_count_audio_mixer),
1135 SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM,
1136 MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0,
1137 msm_routing_get_eq_band_count_audio_mixer,
1138 msm_routing_put_eq_band_count_audio_mixer),
1139};
1140
1141static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = {
1142 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1,
1143 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1144 msm_routing_get_eq_band_audio_mixer,
1145 msm_routing_put_eq_band_audio_mixer),
1146 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2,
1147 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1148 msm_routing_get_eq_band_audio_mixer,
1149 msm_routing_put_eq_band_audio_mixer),
1150 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3,
1151 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1152 msm_routing_get_eq_band_audio_mixer,
1153 msm_routing_put_eq_band_audio_mixer),
1154 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4,
1155 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1156 msm_routing_get_eq_band_audio_mixer,
1157 msm_routing_put_eq_band_audio_mixer),
1158 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5,
1159 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1160 msm_routing_get_eq_band_audio_mixer,
1161 msm_routing_put_eq_band_audio_mixer),
1162 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6,
1163 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1164 msm_routing_get_eq_band_audio_mixer,
1165 msm_routing_put_eq_band_audio_mixer),
1166 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7,
1167 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1168 msm_routing_get_eq_band_audio_mixer,
1169 msm_routing_put_eq_band_audio_mixer),
1170 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8,
1171 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1172 msm_routing_get_eq_band_audio_mixer,
1173 msm_routing_put_eq_band_audio_mixer),
1174 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9,
1175 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1176 msm_routing_get_eq_band_audio_mixer,
1177 msm_routing_put_eq_band_audio_mixer),
1178 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10,
1179 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1180 msm_routing_get_eq_band_audio_mixer,
1181 msm_routing_put_eq_band_audio_mixer),
1182 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11,
1183 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1184 msm_routing_get_eq_band_audio_mixer,
1185 msm_routing_put_eq_band_audio_mixer),
1186 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12,
1187 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
1188 msm_routing_get_eq_band_audio_mixer,
1189 msm_routing_put_eq_band_audio_mixer),
1190 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1,
1191 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1192 msm_routing_get_eq_band_audio_mixer,
1193 msm_routing_put_eq_band_audio_mixer),
1194 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2,
1195 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1196 msm_routing_get_eq_band_audio_mixer,
1197 msm_routing_put_eq_band_audio_mixer),
1198 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3,
1199 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1200 msm_routing_get_eq_band_audio_mixer,
1201 msm_routing_put_eq_band_audio_mixer),
1202 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4,
1203 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1204 msm_routing_get_eq_band_audio_mixer,
1205 msm_routing_put_eq_band_audio_mixer),
1206 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5,
1207 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1208 msm_routing_get_eq_band_audio_mixer,
1209 msm_routing_put_eq_band_audio_mixer),
1210 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6,
1211 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1212 msm_routing_get_eq_band_audio_mixer,
1213 msm_routing_put_eq_band_audio_mixer),
1214 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7,
1215 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1216 msm_routing_get_eq_band_audio_mixer,
1217 msm_routing_put_eq_band_audio_mixer),
1218 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8,
1219 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1220 msm_routing_get_eq_band_audio_mixer,
1221 msm_routing_put_eq_band_audio_mixer),
1222 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9,
1223 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1224 msm_routing_get_eq_band_audio_mixer,
1225 msm_routing_put_eq_band_audio_mixer),
1226 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10,
1227 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1228 msm_routing_get_eq_band_audio_mixer,
1229 msm_routing_put_eq_band_audio_mixer),
1230 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11,
1231 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1232 msm_routing_get_eq_band_audio_mixer,
1233 msm_routing_put_eq_band_audio_mixer),
1234 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12,
1235 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
1236 msm_routing_get_eq_band_audio_mixer,
1237 msm_routing_put_eq_band_audio_mixer),
1238 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1,
1239 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1240 msm_routing_get_eq_band_audio_mixer,
1241 msm_routing_put_eq_band_audio_mixer),
1242 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2,
1243 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1244 msm_routing_get_eq_band_audio_mixer,
1245 msm_routing_put_eq_band_audio_mixer),
1246 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3,
1247 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1248 msm_routing_get_eq_band_audio_mixer,
1249 msm_routing_put_eq_band_audio_mixer),
1250 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4,
1251 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1252 msm_routing_get_eq_band_audio_mixer,
1253 msm_routing_put_eq_band_audio_mixer),
1254 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5,
1255 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1256 msm_routing_get_eq_band_audio_mixer,
1257 msm_routing_put_eq_band_audio_mixer),
1258 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6,
1259 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1260 msm_routing_get_eq_band_audio_mixer,
1261 msm_routing_put_eq_band_audio_mixer),
1262 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7,
1263 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1264 msm_routing_get_eq_band_audio_mixer,
1265 msm_routing_put_eq_band_audio_mixer),
1266 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8,
1267 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1268 msm_routing_get_eq_band_audio_mixer,
1269 msm_routing_put_eq_band_audio_mixer),
1270 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9,
1271 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1272 msm_routing_get_eq_band_audio_mixer,
1273 msm_routing_put_eq_band_audio_mixer),
1274 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10,
1275 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1276 msm_routing_get_eq_band_audio_mixer,
1277 msm_routing_put_eq_band_audio_mixer),
1278 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11,
1279 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1280 msm_routing_get_eq_band_audio_mixer,
1281 msm_routing_put_eq_band_audio_mixer),
1282 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12,
1283 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1284 msm_routing_get_eq_band_audio_mixer,
1285 msm_routing_put_eq_band_audio_mixer),
1286};
1287
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001288static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
1289 /* Frontend AIF */
1290 /* Widget name equals to Front-End DAI name<Need confirmation>,
1291 * Stream name must contains substring of front-end dai name
1292 */
1293 SND_SOC_DAPM_AIF_IN("MM_DL1", "MultiMedia1 Playback", 0, 0, 0, 0),
1294 SND_SOC_DAPM_AIF_IN("MM_DL2", "MultiMedia2 Playback", 0, 0, 0, 0),
1295 SND_SOC_DAPM_AIF_IN("MM_DL3", "MultiMedia3 Playback", 0, 0, 0, 0),
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301296 SND_SOC_DAPM_AIF_IN("MM_DL4", "MultiMedia4 Playback", 0, 0, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001297 SND_SOC_DAPM_AIF_IN("VOIP_DL", "VoIP Playback", 0, 0, 0, 0),
1298 SND_SOC_DAPM_AIF_OUT("MM_UL1", "MultiMedia1 Capture", 0, 0, 0, 0),
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -07001299 SND_SOC_DAPM_AIF_OUT("MM_UL2", "MultiMedia2 Capture", 0, 0, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001300 SND_SOC_DAPM_AIF_IN("CS-VOICE_DL1", "CS-VOICE Playback", 0, 0, 0, 0),
1301 SND_SOC_DAPM_AIF_OUT("CS-VOICE_UL1", "CS-VOICE Capture", 0, 0, 0, 0),
1302 SND_SOC_DAPM_AIF_OUT("VOIP_UL", "VoIP Capture", 0, 0, 0, 0),
1303 SND_SOC_DAPM_AIF_IN("SLIM0_DL_HL", "SLIMBUS0_HOSTLESS Playback",
1304 0, 0, 0, 0),
1305 SND_SOC_DAPM_AIF_OUT("SLIM0_UL_HL", "SLIMBUS0_HOSTLESS Capture",
1306 0, 0, 0, 0),
1307 SND_SOC_DAPM_AIF_IN("INTFM_DL_HL", "INT_FM_HOSTLESS Playback",
1308 0, 0, 0, 0),
1309 SND_SOC_DAPM_AIF_OUT("INTFM_UL_HL", "INT_FM_HOSTLESS Capture",
1310 0, 0, 0, 0),
Alex Wongb3d06a02012-01-12 10:00:41 -08001311 SND_SOC_DAPM_AIF_IN("HDMI_DL_HL", "HDMI_HOSTLESS Playback", 0, 0, 0, 0),
Patrick Laie66c31a2012-01-22 22:00:45 -08001312 SND_SOC_DAPM_AIF_IN("AUXPCM_DL_HL", "AUXPCM_HOSTLESS Playback",
1313 0, 0, 0, 0),
1314 SND_SOC_DAPM_AIF_OUT("AUXPCM_UL_HL", "AUXPCM_HOSTLESS Capture",
1315 0, 0, 0, 0),
Alex Wongb3d06a02012-01-12 10:00:41 -08001316
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001317 /* Backend AIF */
1318 /* Stream name equals to backend dai link stream name
1319 */
1320 SND_SOC_DAPM_AIF_OUT("PRI_I2S_RX", "Primary I2S Playback", 0, 0, 0, 0),
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001321 SND_SOC_DAPM_AIF_OUT("SEC_I2S_RX", "Secondary I2S Playback",
1322 0, 0, 0 , 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001323 SND_SOC_DAPM_AIF_OUT("SLIMBUS_0_RX", "Slimbus Playback", 0, 0, 0, 0),
1324 SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0 , 0),
Kuirong Wang274f21a2011-12-15 21:29:08 -08001325 SND_SOC_DAPM_AIF_OUT("MI2S_RX", "MI2S Playback", 0, 0, 0, 0),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001326 SND_SOC_DAPM_AIF_IN("PRI_I2S_TX", "Primary I2S Capture", 0, 0, 0, 0),
1327 SND_SOC_DAPM_AIF_IN("SLIMBUS_0_TX", "Slimbus Capture", 0, 0, 0, 0),
1328 SND_SOC_DAPM_AIF_OUT("INT_BT_SCO_RX", "Internal BT-SCO Playback",
1329 0, 0, 0 , 0),
1330 SND_SOC_DAPM_AIF_IN("INT_BT_SCO_TX", "Internal BT-SCO Capture",
1331 0, 0, 0, 0),
1332 SND_SOC_DAPM_AIF_OUT("INT_FM_RX", "Internal FM Playback",
1333 0, 0, 0 , 0),
1334 SND_SOC_DAPM_AIF_IN("INT_FM_TX", "Internal FM Capture",
1335 0, 0, 0, 0),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301336 SND_SOC_DAPM_AIF_OUT("PCM_RX", "AFE Playback",
1337 0, 0, 0 , 0),
1338 SND_SOC_DAPM_AIF_IN("PCM_TX", "AFE Capture",
Helen Zeng0705a5f2011-10-14 15:29:52 -07001339 0, 0, 0 , 0),
1340 /* incall */
1341 SND_SOC_DAPM_AIF_OUT("VOICE_PLAYBACK_TX", "Voice Farend Playback",
1342 0, 0, 0 , 0),
Helen Zenge3d716a2011-10-14 16:32:16 -07001343 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_TX", "Voice Uplink Capture",
1344 0, 0, 0, 0),
1345 SND_SOC_DAPM_AIF_IN("INCALL_RECORD_RX", "Voice Downlink Capture",
1346 0, 0, 0, 0),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001347 SND_SOC_DAPM_AIF_OUT("AUX_PCM_RX", "AUX PCM Playback", 0, 0, 0, 0),
1348 SND_SOC_DAPM_AIF_IN("AUX_PCM_TX", "AUX PCM Capture", 0, 0, 0, 0),
Neema Shetty2ced1ba2012-02-16 12:10:05 -08001349 SND_SOC_DAPM_AIF_IN("VOICE_STUB_DL", "VOICE_STUB Playback", 0, 0, 0, 0),
1350 SND_SOC_DAPM_AIF_OUT("VOICE_STUB_UL", "VOICE_STUB Capture", 0, 0, 0, 0),
1351 SND_SOC_DAPM_AIF_OUT("STUB_RX", "Stub Playback", 0, 0, 0, 0),
1352 SND_SOC_DAPM_AIF_IN("STUB_TX", "Stub Capture", 0, 0, 0, 0),
Neema Shetty3c9d2862012-03-11 01:25:32 -08001353 SND_SOC_DAPM_AIF_OUT("SLIMBUS_1_RX", "Slimbus1 Playback", 0, 0, 0, 0),
1354 SND_SOC_DAPM_AIF_IN("SLIMBUS_1_TX", "Slimbus1 Capture", 0, 0, 0, 0),
Neema Shetty2ced1ba2012-02-16 12:10:05 -08001355
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -07001356 /* Switch Definitions */
Sriranjan Srikantamdf509d12011-10-24 17:53:27 -07001357 SND_SOC_DAPM_SWITCH("SLIMBUS_DL_HL", SND_SOC_NOPM, 0, 0,
Sriranjan Srikantama4969dd2011-07-14 00:34:56 -07001358 &fm_switch_mixer_controls),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001359 /* Mixer definitions */
1360 SND_SOC_DAPM_MIXER("PRI_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1361 pri_i2s_rx_mixer_controls, ARRAY_SIZE(pri_i2s_rx_mixer_controls)),
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001362 SND_SOC_DAPM_MIXER("SEC_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1363 sec_i2s_rx_mixer_controls, ARRAY_SIZE(sec_i2s_rx_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001364 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1365 slimbus_rx_mixer_controls, ARRAY_SIZE(slimbus_rx_mixer_controls)),
1366 SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
1367 hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
Kuirong Wang274f21a2011-12-15 21:29:08 -08001368 SND_SOC_DAPM_MIXER("MI2S_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1369 mi2s_rx_mixer_controls, ARRAY_SIZE(mi2s_rx_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001370 SND_SOC_DAPM_MIXER("MultiMedia1 Mixer", SND_SOC_NOPM, 0, 0,
1371 mmul1_mixer_controls, ARRAY_SIZE(mmul1_mixer_controls)),
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -07001372 SND_SOC_DAPM_MIXER("MultiMedia2 Mixer", SND_SOC_NOPM, 0, 0,
1373 mmul2_mixer_controls, ARRAY_SIZE(mmul2_mixer_controls)),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001374 SND_SOC_DAPM_MIXER("AUX_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1375 auxpcm_rx_mixer_controls, ARRAY_SIZE(auxpcm_rx_mixer_controls)),
Helen Zeng0705a5f2011-10-14 15:29:52 -07001376 /* incall */
1377 SND_SOC_DAPM_MIXER("Incall_Music Audio Mixer", SND_SOC_NOPM, 0, 0,
1378 incall_music_delivery_mixer_controls,
1379 ARRAY_SIZE(incall_music_delivery_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001380 /* Voice Mixer */
1381 SND_SOC_DAPM_MIXER("PRI_RX_Voice Mixer",
1382 SND_SOC_NOPM, 0, 0, pri_rx_voice_mixer_controls,
1383 ARRAY_SIZE(pri_rx_voice_mixer_controls)),
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001384 SND_SOC_DAPM_MIXER("SEC_RX_Voice Mixer",
1385 SND_SOC_NOPM, 0, 0,
1386 sec_i2s_rx_voice_mixer_controls,
1387 ARRAY_SIZE(sec_i2s_rx_voice_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001388 SND_SOC_DAPM_MIXER("SLIM_0_RX_Voice Mixer",
1389 SND_SOC_NOPM, 0, 0,
1390 slimbus_rx_voice_mixer_controls,
1391 ARRAY_SIZE(slimbus_rx_voice_mixer_controls)),
1392 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX_Voice Mixer",
1393 SND_SOC_NOPM, 0, 0,
1394 bt_sco_rx_voice_mixer_controls,
1395 ARRAY_SIZE(bt_sco_rx_voice_mixer_controls)),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301396 SND_SOC_DAPM_MIXER("AFE_PCM_RX_Voice Mixer",
1397 SND_SOC_NOPM, 0, 0,
1398 afe_pcm_rx_voice_mixer_controls,
1399 ARRAY_SIZE(afe_pcm_rx_voice_mixer_controls)),
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001400 SND_SOC_DAPM_MIXER("AUX_PCM_RX_Voice Mixer",
1401 SND_SOC_NOPM, 0, 0,
1402 aux_pcm_rx_voice_mixer_controls,
1403 ARRAY_SIZE(aux_pcm_rx_voice_mixer_controls)),
Alex Wong593576c2011-11-15 08:03:24 -08001404 SND_SOC_DAPM_MIXER("HDMI_RX_Voice Mixer",
1405 SND_SOC_NOPM, 0, 0,
1406 hdmi_rx_voice_mixer_controls,
1407 ARRAY_SIZE(hdmi_rx_voice_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001408 SND_SOC_DAPM_MIXER("Voice_Tx Mixer",
1409 SND_SOC_NOPM, 0, 0, tx_voice_mixer_controls,
1410 ARRAY_SIZE(tx_voice_mixer_controls)),
1411 SND_SOC_DAPM_MIXER("Voip_Tx Mixer",
1412 SND_SOC_NOPM, 0, 0, tx_voip_mixer_controls,
1413 ARRAY_SIZE(tx_voip_mixer_controls)),
1414 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1415 int_bt_sco_rx_mixer_controls, ARRAY_SIZE(int_bt_sco_rx_mixer_controls)),
1416 SND_SOC_DAPM_MIXER("INTERNAL_FM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1417 int_fm_rx_mixer_controls, ARRAY_SIZE(int_fm_rx_mixer_controls)),
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301418 SND_SOC_DAPM_MIXER("AFE_PCM_RX Audio Mixer", SND_SOC_NOPM, 0, 0,
1419 afe_pcm_rx_mixer_controls, ARRAY_SIZE(afe_pcm_rx_mixer_controls)),
Neema Shetty3c9d2862012-03-11 01:25:32 -08001420 SND_SOC_DAPM_MIXER("Voice Stub Tx Mixer", SND_SOC_NOPM, 0, 0,
1421 tx_voice_stub_mixer_controls, ARRAY_SIZE(tx_voice_stub_mixer_controls)),
1422 SND_SOC_DAPM_MIXER("STUB_RX Mixer", SND_SOC_NOPM, 0, 0,
1423 stub_rx_mixer_controls, ARRAY_SIZE(stub_rx_mixer_controls)),
1424 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Mixer", SND_SOC_NOPM, 0, 0,
1425 slimbus_1_rx_mixer_controls, ARRAY_SIZE(slimbus_1_rx_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001426 SND_SOC_DAPM_MIXER("SLIMBUS_0_RX Port Mixer",
1427 SND_SOC_NOPM, 0, 0, sbus_0_rx_port_mixer_controls,
1428 ARRAY_SIZE(sbus_0_rx_port_mixer_controls)),
Patrick Lai897baf92011-10-11 14:53:00 -07001429 SND_SOC_DAPM_MIXER("AUXPCM_RX Port Mixer",
1430 SND_SOC_NOPM, 0, 0, auxpcm_rx_port_mixer_controls,
1431 ARRAY_SIZE(auxpcm_rx_port_mixer_controls)),
Neema Shetty3c9d2862012-03-11 01:25:32 -08001432 SND_SOC_DAPM_MIXER("SLIMBUS_1_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1433 sbus_1_rx_port_mixer_controls,
1434 ARRAY_SIZE(sbus_1_rx_port_mixer_controls)),
1435 SND_SOC_DAPM_MIXER("INTERNAL_BT_SCO_RX Port Mixer", SND_SOC_NOPM, 0, 0,
1436 bt_sco_rx_port_mixer_controls,
1437 ARRAY_SIZE(bt_sco_rx_port_mixer_controls)),
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001438};
1439
1440static const struct snd_soc_dapm_route intercon[] = {
1441 {"PRI_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1442 {"PRI_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1443 {"PRI_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301444 {"PRI_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001445 {"PRI_I2S_RX", NULL, "PRI_RX Audio Mixer"},
1446
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001447 {"SEC_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1448 {"SEC_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1449 {"SEC_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1450 {"SEC_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1451 {"SEC_I2S_RX", NULL, "SEC_RX Audio Mixer"},
1452
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001453 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1454 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1455 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301456 {"SLIMBUS_0_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001457 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Audio Mixer"},
1458
1459 {"HDMI Mixer", "MultiMedia1", "MM_DL1"},
1460 {"HDMI Mixer", "MultiMedia2", "MM_DL2"},
Asish Bhattacharyac592eed2011-09-16 17:43:02 +05301461 {"HDMI Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301462 {"HDMI Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001463 {"HDMI", NULL, "HDMI Mixer"},
1464
Helen Zeng0705a5f2011-10-14 15:29:52 -07001465 /* incall */
1466 {"Incall_Music Audio Mixer", "MultiMedia1", "MM_DL1"},
1467 {"Incall_Music Audio Mixer", "MultiMedia2", "MM_DL2"},
1468 {"VOICE_PLAYBACK_TX", NULL, "Incall_Music Audio Mixer"},
Helen Zenge3d716a2011-10-14 16:32:16 -07001469
1470 {"MultiMedia1 Mixer", "VOC_REC_UL", "INCALL_RECORD_TX"},
1471 {"MultiMedia1 Mixer", "VOC_REC_DL", "INCALL_RECORD_RX"},
Kuirong Wang274f21a2011-12-15 21:29:08 -08001472 {"MI2S_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1473 {"MI2S_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1474 {"MI2S_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
1475 {"MI2S_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
1476 {"MI2S_RX", NULL, "MI2S_RX Audio Mixer"},
Helen Zenge3d716a2011-10-14 16:32:16 -07001477
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001478 {"MultiMedia1 Mixer", "PRI_TX", "PRI_I2S_TX"},
1479 {"MultiMedia1 Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001480 {"MultiMedia1 Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001481
1482 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1483 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
Asish Bhattacharyac592eed2011-09-16 17:43:02 +05301484 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301485 {"INTERNAL_BT_SCO_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001486 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Audio Mixer"},
1487
1488 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1489 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
Asish Bhattacharyac592eed2011-09-16 17:43:02 +05301490 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301491 {"INTERNAL_FM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001492 {"INT_FM_RX", NULL, "INTERNAL_FM_RX Audio Mixer"},
1493
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301494 {"AFE_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1495 {"AFE_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1496 {"AFE_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301497 {"AFE_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301498 {"PCM_RX", NULL, "AFE_PCM_RX Audio Mixer"},
1499
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001500 {"MultiMedia1 Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1501 {"MultiMedia1 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301502
1503 {"MultiMedia1 Mixer", "AFE_PCM_TX", "PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001504 {"MM_UL1", NULL, "MultiMedia1 Mixer"},
Jayasena Sangaraboina99fee652011-09-19 07:43:13 -07001505 {"MultiMedia2 Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1506 {"MM_UL2", NULL, "MultiMedia2 Mixer"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001507
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001508 {"AUX_PCM_RX Audio Mixer", "MultiMedia1", "MM_DL1"},
1509 {"AUX_PCM_RX Audio Mixer", "MultiMedia2", "MM_DL2"},
1510 {"AUX_PCM_RX Audio Mixer", "MultiMedia3", "MM_DL3"},
Asish Bhattacharya305d1752011-11-01 20:38:26 +05301511 {"AUX_PCM_RX Audio Mixer", "MultiMedia4", "MM_DL4"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001512 {"AUX_PCM_RX", NULL, "AUX_PCM_RX Audio Mixer"},
1513
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001514 {"PRI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1515 {"PRI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1516 {"PRI_I2S_RX", NULL, "PRI_RX_Voice Mixer"},
1517
Kuirong Wang9bbf6132012-01-10 18:28:49 -08001518 {"SEC_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1519 {"SEC_RX_Voice Mixer", "Voip", "VOIP_DL"},
1520 {"SEC_I2S_RX", NULL, "SEC_RX_Voice Mixer"},
1521
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001522 {"SLIM_0_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1523 {"SLIM_0_RX_Voice Mixer", "Voip", "VOIP_DL"},
1524 {"SLIMBUS_0_RX", NULL, "SLIM_0_RX_Voice Mixer"},
1525
1526 {"INTERNAL_BT_SCO_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1527 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voip", "VOIP_DL"},
1528 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX_Voice Mixer"},
1529
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301530 {"AFE_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1531 {"AFE_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1532 {"PCM_RX", NULL, "AFE_PCM_RX_Voice Mixer"},
1533
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001534 {"AUX_PCM_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1535 {"AUX_PCM_RX_Voice Mixer", "Voip", "VOIP_DL"},
1536 {"AUX_PCM_RX", NULL, "AUX_PCM_RX_Voice Mixer"},
1537
Alex Wong593576c2011-11-15 08:03:24 -08001538 {"HDMI_RX_Voice Mixer", "CSVoice", "CS-VOICE_DL1"},
1539 {"HDMI_RX_Voice Mixer", "Voip", "VOIP_DL"},
1540 {"HDMI", NULL, "HDMI_RX_Voice Mixer"},
Alex Wongb3d06a02012-01-12 10:00:41 -08001541 {"HDMI", NULL, "HDMI_DL_HL"},
Alex Wong593576c2011-11-15 08:03:24 -08001542
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001543 {"Voice_Tx Mixer", "PRI_TX_Voice", "PRI_I2S_TX"},
1544 {"Voice_Tx Mixer", "SLIM_0_TX_Voice", "SLIMBUS_0_TX"},
1545 {"Voice_Tx Mixer", "INTERNAL_BT_SCO_TX_Voice", "INT_BT_SCO_TX"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301546 {"Voice_Tx Mixer", "AFE_PCM_TX_Voice", "PCM_TX"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001547 {"Voice_Tx Mixer", "AUX_PCM_TX_Voice", "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001548 {"CS-VOICE_UL1", NULL, "Voice_Tx Mixer"},
1549 {"Voip_Tx Mixer", "PRI_TX_Voip", "PRI_I2S_TX"},
1550 {"Voip_Tx Mixer", "SLIM_0_TX_Voip", "SLIMBUS_0_TX"},
1551 {"Voip_Tx Mixer", "INTERNAL_BT_SCO_TX_Voip", "INT_BT_SCO_TX"},
Laxminath Kasam32657ec2011-08-01 19:26:57 +05301552 {"Voip_Tx Mixer", "AFE_PCM_TX_Voip", "PCM_TX"},
Bhalchandra Gajare0e795c42011-08-15 18:10:30 -07001553 {"Voip_Tx Mixer", "AUX_PCM_TX_Voip", "AUX_PCM_TX"},
1554
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001555 {"VOIP_UL", NULL, "Voip_Tx Mixer"},
Sriranjan Srikantamdf509d12011-10-24 17:53:27 -07001556 {"SLIMBUS_DL_HL", "Switch", "SLIM0_DL_HL"},
1557 {"SLIMBUS_0_RX", NULL, "SLIMBUS_DL_HL"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001558 {"SLIM0_UL_HL", NULL, "SLIMBUS_0_TX"},
1559 {"INT_FM_RX", NULL, "INTFM_DL_HL"},
1560 {"INTFM_UL_HL", NULL, "INT_FM_TX"},
Patrick Laie66c31a2012-01-22 22:00:45 -08001561 {"AUX_PCM_RX", NULL, "AUXPCM_DL_HL"},
1562 {"AUXPCM_UL_HL", NULL, "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001563 {"SLIMBUS_0_RX Port Mixer", "INTERNAL_FM_TX", "INT_FM_TX"},
1564 {"SLIMBUS_0_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
Patrick Lai897baf92011-10-11 14:53:00 -07001565 {"SLIMBUS_0_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001566 {"SLIMBUS_0_RX", NULL, "SLIMBUS_0_RX Port Mixer"},
Patrick Lai897baf92011-10-11 14:53:00 -07001567
1568 {"AUXPCM_RX Port Mixer", "AUX_PCM_UL_TX", "AUX_PCM_TX"},
1569 {"AUXPCM_RX Port Mixer", "SLIM_0_TX", "SLIMBUS_0_TX"},
1570 {"AUX_PCM_RX", NULL, "AUXPCM_RX Port Mixer"},
Neema Shetty3c9d2862012-03-11 01:25:32 -08001571
1572 {"Voice Stub Tx Mixer", "STUB_TX_HL", "STUB_TX"},
1573 {"Voice Stub Tx Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1574 {"Voice Stub Tx Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1575 {"VOICE_STUB_UL", NULL, "Voice Stub Tx Mixer"},
1576
1577 {"STUB_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1578 {"STUB_RX", NULL, "STUB_RX Mixer"},
1579 {"SLIMBUS_1_RX Mixer", "Voice Stub", "VOICE_STUB_DL"},
1580 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Mixer"},
1581 {"INTERNAL_BT_SCO_RX_Voice Mixer", "Voice Stub", "VOICE_STUB_DL"},
1582
1583 {"SLIMBUS_1_RX Port Mixer", "INTERNAL_BT_SCO_TX", "INT_BT_SCO_TX"},
1584 {"SLIMBUS_1_RX", NULL, "SLIMBUS_1_RX Port Mixer"},
1585 {"INTERNAL_BT_SCO_RX Port Mixer", "SLIM_1_TX", "SLIMBUS_1_TX"},
1586 {"INT_BT_SCO_RX", NULL, "INTERNAL_BT_SCO_RX Port Mixer"},
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001587};
1588
Patrick Laicf999112011-08-23 11:27:20 -07001589static int msm_pcm_routing_hw_params(struct snd_pcm_substream *substream,
1590 struct snd_pcm_hw_params *params)
1591{
1592 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1593 unsigned int be_id = rtd->dai_link->be_id;
1594
Patrick Lai770ca3e42011-12-12 13:44:54 -08001595 if (be_id >= MSM_BACKEND_DAI_MAX) {
1596 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1597 return -EINVAL;
1598 }
1599
Patrick Laicf999112011-08-23 11:27:20 -07001600 mutex_lock(&routing_lock);
1601 msm_bedais[be_id].hw_params = params;
1602 mutex_unlock(&routing_lock);
1603 return 0;
1604}
1605
1606static int msm_pcm_routing_close(struct snd_pcm_substream *substream)
1607{
1608 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1609 unsigned int be_id = rtd->dai_link->be_id;
1610 int i, session_type;
1611 struct msm_pcm_routing_bdai_data *bedai;
1612
1613 if (be_id >= MSM_BACKEND_DAI_MAX) {
1614 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1615 return -EINVAL;
1616 }
1617
1618 bedai = &msm_bedais[be_id];
1619
1620 session_type = (substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
1621 0 : 1);
1622
1623 mutex_lock(&routing_lock);
1624
Asish Bhattacharya70b43c72011-12-29 00:50:38 +05301625 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
Patrick Laicf999112011-08-23 11:27:20 -07001626 if (fe_dai_map[i][session_type] != INVALID_SESSION)
1627 adm_close(bedai->port_id);
1628 }
1629
1630 bedai->active = 0;
1631 bedai->hw_params = NULL;
1632
1633 mutex_unlock(&routing_lock);
1634
1635 return 0;
1636}
1637
1638static int msm_pcm_routing_prepare(struct snd_pcm_substream *substream)
1639{
1640 struct snd_soc_pcm_runtime *rtd = substream->private_data;
1641 unsigned int be_id = rtd->dai_link->be_id;
1642 int i, path_type, session_type;
1643 struct msm_pcm_routing_bdai_data *bedai;
Kiran Kandi5e809b02012-01-31 00:24:33 -08001644 u32 channels;
Patrick Laicf999112011-08-23 11:27:20 -07001645
1646 if (be_id >= MSM_BACKEND_DAI_MAX) {
1647 pr_err("%s: unexpected be_id %d\n", __func__, be_id);
1648 return -EINVAL;
1649 }
1650
1651
1652 bedai = &msm_bedais[be_id];
1653
Jay Wangc8e03a82011-10-31 11:53:23 -07001654 if (bedai->hw_params == NULL) {
1655 pr_err("%s: HW param is not configured", __func__);
1656 return -EINVAL;
1657 }
1658
1659
Patrick Laicf999112011-08-23 11:27:20 -07001660 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1661 path_type = ADM_PATH_PLAYBACK;
1662 session_type = SESSION_TYPE_RX;
1663 } else {
1664 path_type = ADM_PATH_LIVE_REC;
1665 session_type = SESSION_TYPE_TX;
1666 }
1667
1668 mutex_lock(&routing_lock);
1669
1670 if (bedai->active == 1)
1671 goto done; /* Ignore prepare if back-end already active */
1672
1673 /* AFE port is not active at this point. However, still
1674 * go ahead setting active flag under the notion that
1675 * QDSP6 is able to handle ADM starting before AFE port
1676 * is started.
1677 */
1678 bedai->active = 1;
1679
Asish Bhattacharya70b43c72011-12-29 00:50:38 +05301680 for_each_set_bit(i, &bedai->fe_sessions, MSM_FRONTEND_DAI_MM_SIZE) {
Patrick Laicf999112011-08-23 11:27:20 -07001681 if (fe_dai_map[i][session_type] != INVALID_SESSION) {
Kiran Kandi5e809b02012-01-31 00:24:33 -08001682
1683 channels = params_channels(bedai->hw_params);
1684 if ((substream->stream == SNDRV_PCM_STREAM_PLAYBACK) &&
1685 (channels > 2))
1686 adm_multi_ch_copp_open(bedai->port_id,
1687 path_type,
1688 params_rate(bedai->hw_params),
1689 channels,
1690 DEFAULT_COPP_TOPOLOGY);
1691 else
1692 adm_open(bedai->port_id,
1693 path_type,
Patrick Laicf999112011-08-23 11:27:20 -07001694 params_rate(bedai->hw_params),
1695 params_channels(bedai->hw_params),
1696 DEFAULT_COPP_TOPOLOGY);
Kiran Kandi5e809b02012-01-31 00:24:33 -08001697
Patrick Laicf999112011-08-23 11:27:20 -07001698 msm_pcm_routing_build_matrix(i,
1699 fe_dai_map[i][session_type], path_type);
1700 }
1701 }
1702
1703done:
1704 mutex_unlock(&routing_lock);
1705
1706 return 0;
1707}
1708
1709static struct snd_pcm_ops msm_routing_pcm_ops = {
1710 .hw_params = msm_pcm_routing_hw_params,
1711 .close = msm_pcm_routing_close,
1712 .prepare = msm_pcm_routing_prepare,
1713};
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001714
1715static unsigned int msm_routing_read(struct snd_soc_platform *platform,
1716 unsigned int reg)
1717{
1718 dev_dbg(platform->dev, "reg %x\n", reg);
1719 return 0;
1720}
1721
1722/* Not used but frame seems to require it */
1723static int msm_routing_write(struct snd_soc_platform *platform,
1724 unsigned int reg, unsigned int val)
1725{
1726 dev_dbg(platform->dev, "reg %x val %x\n", reg, val);
1727 return 0;
1728}
1729
1730/* Not used but frame seems to require it */
1731static int msm_routing_probe(struct snd_soc_platform *platform)
1732{
1733 snd_soc_dapm_new_controls(&platform->dapm, msm_qdsp6_widgets,
1734 ARRAY_SIZE(msm_qdsp6_widgets));
1735 snd_soc_dapm_add_routes(&platform->dapm, intercon,
1736 ARRAY_SIZE(intercon));
1737
1738 snd_soc_dapm_new_widgets(&platform->dapm);
1739
Jayasena Sangaraboinacb1e22f2011-07-18 10:36:57 -07001740 snd_soc_add_platform_controls(platform,
1741 int_fm_vol_mixer_controls,
1742 ARRAY_SIZE(int_fm_vol_mixer_controls));
Asish Bhattacharya0ec76182011-07-29 16:58:11 +05301743
1744 snd_soc_add_platform_controls(platform,
1745 lpa_vol_mixer_controls,
1746 ARRAY_SIZE(lpa_vol_mixer_controls));
Ben Romberger037dd2f2011-09-22 14:01:32 -07001747
1748 snd_soc_add_platform_controls(platform,
1749 eq_enable_mixer_controls,
1750 ARRAY_SIZE(eq_enable_mixer_controls));
1751
1752 snd_soc_add_platform_controls(platform,
1753 eq_band_mixer_controls,
1754 ARRAY_SIZE(eq_band_mixer_controls));
1755
1756 snd_soc_add_platform_controls(platform,
1757 eq_coeff_mixer_controls,
1758 ARRAY_SIZE(eq_coeff_mixer_controls));
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001759 return 0;
1760}
1761
1762static struct snd_soc_platform_driver msm_soc_routing_platform = {
1763 .ops = &msm_routing_pcm_ops,
1764 .probe = msm_routing_probe,
1765 .read = msm_routing_read,
1766 .write = msm_routing_write,
1767};
1768
1769static __devinit int msm_routing_pcm_probe(struct platform_device *pdev)
1770{
1771 dev_dbg(&pdev->dev, "dev name %s\n", dev_name(&pdev->dev));
1772 return snd_soc_register_platform(&pdev->dev,
1773 &msm_soc_routing_platform);
1774}
1775
1776static int msm_routing_pcm_remove(struct platform_device *pdev)
1777{
1778 snd_soc_unregister_platform(&pdev->dev);
1779 return 0;
1780}
1781
1782static struct platform_driver msm_routing_pcm_driver = {
1783 .driver = {
1784 .name = "msm-pcm-routing",
1785 .owner = THIS_MODULE,
1786 },
1787 .probe = msm_routing_pcm_probe,
1788 .remove = __devexit_p(msm_routing_pcm_remove),
1789};
1790
Tejas Shikhare6fd0e002012-01-31 21:17:29 -08001791int msm_routing_check_backend_enabled(int fedai_id)
1792{
1793 int i;
1794 if (fedai_id >= MSM_FRONTEND_DAI_MM_MAX_ID) {
1795 /* bad ID assigned in machine driver */
1796 pr_err("%s: bad MM ID\n", __func__);
1797 return 0;
1798 }
1799 for (i = 0; i < MSM_BACKEND_DAI_MAX; i++) {
1800 if ((test_bit(fedai_id,
1801 &msm_bedais[i].fe_sessions))) {
1802 return msm_bedais[i].active;
1803 }
1804 }
1805 return 0;
1806}
1807
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001808static int __init msm_soc_routing_platform_init(void)
1809{
Neema Shettyfeea7742011-09-11 12:30:36 -07001810 mutex_init(&routing_lock);
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001811 return platform_driver_register(&msm_routing_pcm_driver);
1812}
1813module_init(msm_soc_routing_platform_init);
1814
1815static void __exit msm_soc_routing_platform_exit(void)
1816{
1817 platform_driver_unregister(&msm_routing_pcm_driver);
1818}
1819module_exit(msm_soc_routing_platform_exit);
1820
1821MODULE_DESCRIPTION("MSM routing platform driver");
1822MODULE_LICENSE("GPL v2");