blob: 8c911b199a8579b7d903076acda6810cf3c1faa5 [file] [log] [blame]
Banajit Goswami0530e2f2016-12-09 21:34:37 -08001/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/err.h>
14#include <linux/module.h>
15#include <linux/bitops.h>
16#include <linux/mutex.h>
17#include <sound/control.h>
18#include <sound/q6adm-v2.h>
19#include <sound/q6asm-v2.h>
20#include <sound/q6afe-v2.h>
21#include <sound/asound.h>
22#include <sound/q6audio-v2.h>
23#include <sound/tlv.h>
24
25#include "msm-qti-pp-config.h"
26#include "msm-pcm-routing-v2.h"
27
28/* EQUALIZER */
29/* Equal to Frontend after last of the MULTIMEDIA SESSIONS */
30#define MAX_EQ_SESSIONS MSM_FRONTEND_DAI_CS_VOICE
31
32enum {
33 EQ_BAND1 = 0,
34 EQ_BAND2,
35 EQ_BAND3,
36 EQ_BAND4,
37 EQ_BAND5,
38 EQ_BAND6,
39 EQ_BAND7,
40 EQ_BAND8,
41 EQ_BAND9,
42 EQ_BAND10,
43 EQ_BAND11,
44 EQ_BAND12,
45 EQ_BAND_MAX,
46};
47
48struct msm_audio_eq_band {
49 uint16_t band_idx; /* The band index, 0 .. 11 */
50 uint32_t filter_type; /* Filter band type */
51 uint32_t center_freq_hz; /* Filter band center frequency */
52 uint32_t filter_gain; /* Filter band initial gain (dB) */
53 /* Range is +12 dB to -12 dB with 1dB increments. */
54 uint32_t q_factor;
55} __packed;
56
57struct msm_audio_eq_stream_config {
58 uint32_t enable; /* Number of consequtive bands specified */
59 uint32_t num_bands;
60 struct msm_audio_eq_band eq_bands[EQ_BAND_MAX];
61} __packed;
62
63/* Audio Sphere data structures */
64struct msm_audio_pp_asphere_state_s {
65 uint32_t enabled;
66 uint32_t strength;
67 uint32_t mode;
68 uint32_t version;
69 int port_id[AFE_MAX_PORTS];
70 int copp_idx[AFE_MAX_PORTS];
71 bool initialized;
72 uint32_t enabled_prev;
73 uint32_t strength_prev;
74};
75
76static struct msm_audio_pp_asphere_state_s asphere_state;
77
78struct msm_audio_eq_stream_config eq_data[MAX_EQ_SESSIONS];
79
80static int msm_route_hfp_vol_control;
81static const DECLARE_TLV_DB_LINEAR(hfp_rx_vol_gain, 0,
82 INT_RX_VOL_MAX_STEPS);
83
Derek Chen5dea59a2016-06-06 20:40:29 -040084static int msm_route_icc_vol_control;
85static const DECLARE_TLV_DB_LINEAR(icc_rx_vol_gain, 0,
86 INT_RX_VOL_MAX_STEPS);
87
Banajit Goswami0530e2f2016-12-09 21:34:37 -080088static int msm_route_pri_auxpcm_lb_vol_ctrl;
89static const DECLARE_TLV_DB_LINEAR(pri_auxpcm_lb_vol_gain, 0,
90 INT_RX_VOL_MAX_STEPS);
91
92static int msm_route_sec_auxpcm_lb_vol_ctrl;
93static const DECLARE_TLV_DB_LINEAR(sec_auxpcm_lb_vol_gain, 0,
94 INT_RX_VOL_MAX_STEPS);
95
96static void msm_qti_pp_send_eq_values_(int eq_idx)
97{
98 int result;
99 struct msm_pcm_routing_fdai_data fe_dai;
100 struct audio_client *ac = NULL;
101
102 msm_pcm_routing_get_fedai_info(eq_idx, SESSION_TYPE_RX, &fe_dai);
103 ac = q6asm_get_audio_client(fe_dai.strm_id);
104
105 if (ac == NULL) {
106 pr_err("%s: Could not get audio client for session: %d\n",
107 __func__, fe_dai.strm_id);
108 goto done;
109 }
110
111 result = q6asm_equalizer(ac, &eq_data[eq_idx]);
112
113 if (result < 0)
114 pr_err("%s: Call to ASM equalizer failed, returned = %d\n",
115 __func__, result);
116done:
117 return;
118}
119
120static int msm_qti_pp_get_eq_enable_mixer(struct snd_kcontrol *kcontrol,
121 struct snd_ctl_elem_value *ucontrol)
122{
123 int eq_idx = ((struct soc_multi_mixer_control *)
124 kcontrol->private_value)->reg;
125
126 if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS))
127 return -EINVAL;
128
129 ucontrol->value.integer.value[0] = eq_data[eq_idx].enable;
130
131 pr_debug("%s: EQ #%d enable %d\n", __func__,
132 eq_idx, eq_data[eq_idx].enable);
133 return 0;
134}
135
136static int msm_qti_pp_put_eq_enable_mixer(struct snd_kcontrol *kcontrol,
137 struct snd_ctl_elem_value *ucontrol)
138{
139 int eq_idx = ((struct soc_multi_mixer_control *)
140 kcontrol->private_value)->reg;
141 int value = ucontrol->value.integer.value[0];
142
143 if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS))
144 return -EINVAL;
145 pr_debug("%s: EQ #%d enable %d\n", __func__,
146 eq_idx, value);
147 eq_data[eq_idx].enable = value;
148 msm_pcm_routing_acquire_lock();
149 msm_qti_pp_send_eq_values_(eq_idx);
150 msm_pcm_routing_release_lock();
151 return 0;
152}
153
154static int msm_qti_pp_get_eq_band_count_audio_mixer(
155 struct snd_kcontrol *kcontrol,
156 struct snd_ctl_elem_value *ucontrol)
157{
158 int eq_idx = ((struct soc_multi_mixer_control *)
159 kcontrol->private_value)->reg;
160
161 if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS))
162 return -EINVAL;
163 ucontrol->value.integer.value[0] = eq_data[eq_idx].num_bands;
164
165 pr_debug("%s: EQ #%d bands %d\n", __func__,
166 eq_idx, eq_data[eq_idx].num_bands);
167 return eq_data[eq_idx].num_bands;
168}
169
170static int msm_qti_pp_put_eq_band_count_audio_mixer(
171 struct snd_kcontrol *kcontrol,
172 struct snd_ctl_elem_value *ucontrol)
173{
174 int eq_idx = ((struct soc_multi_mixer_control *)
175 kcontrol->private_value)->reg;
176 int value = ucontrol->value.integer.value[0];
177
178 if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS))
179 return -EINVAL;
180
181 pr_debug("%s: EQ #%d bands %d\n", __func__,
182 eq_idx, value);
183 eq_data[eq_idx].num_bands = value;
184 return 0;
185}
186
187static int msm_qti_pp_get_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
188 struct snd_ctl_elem_value *ucontrol)
189{
190 int eq_idx = ((struct soc_multi_mixer_control *)
191 kcontrol->private_value)->reg;
192 int band_idx = ((struct soc_multi_mixer_control *)
193 kcontrol->private_value)->shift;
194
195 if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS) ||
196 (band_idx < EQ_BAND1) || (band_idx >= EQ_BAND_MAX))
197 return -EINVAL;
198
199 ucontrol->value.integer.value[0] =
200 eq_data[eq_idx].eq_bands[band_idx].band_idx;
201 ucontrol->value.integer.value[1] =
202 eq_data[eq_idx].eq_bands[band_idx].filter_type;
203 ucontrol->value.integer.value[2] =
204 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz;
205 ucontrol->value.integer.value[3] =
206 eq_data[eq_idx].eq_bands[band_idx].filter_gain;
207 ucontrol->value.integer.value[4] =
208 eq_data[eq_idx].eq_bands[band_idx].q_factor;
209
210 pr_debug("%s: band_idx = %d\n", __func__,
211 eq_data[eq_idx].eq_bands[band_idx].band_idx);
212 pr_debug("%s: filter_type = %d\n", __func__,
213 eq_data[eq_idx].eq_bands[band_idx].filter_type);
214 pr_debug("%s: center_freq_hz = %d\n", __func__,
215 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz);
216 pr_debug("%s: filter_gain = %d\n", __func__,
217 eq_data[eq_idx].eq_bands[band_idx].filter_gain);
218 pr_debug("%s: q_factor = %d\n", __func__,
219 eq_data[eq_idx].eq_bands[band_idx].q_factor);
220 return 0;
221}
222
223static int msm_qti_pp_put_eq_band_audio_mixer(struct snd_kcontrol *kcontrol,
224 struct snd_ctl_elem_value *ucontrol)
225{
226 int eq_idx = ((struct soc_multi_mixer_control *)
227 kcontrol->private_value)->reg;
228 int band_idx = ((struct soc_multi_mixer_control *)
229 kcontrol->private_value)->shift;
230
231 if ((eq_idx < 0) || (eq_idx >= MAX_EQ_SESSIONS) ||
232 (band_idx < EQ_BAND1) || (band_idx >= EQ_BAND_MAX))
233 return -EINVAL;
234
235 eq_data[eq_idx].eq_bands[band_idx].band_idx =
236 ucontrol->value.integer.value[0];
237 eq_data[eq_idx].eq_bands[band_idx].filter_type =
238 ucontrol->value.integer.value[1];
239 eq_data[eq_idx].eq_bands[band_idx].center_freq_hz =
240 ucontrol->value.integer.value[2];
241 eq_data[eq_idx].eq_bands[band_idx].filter_gain =
242 ucontrol->value.integer.value[3];
243 eq_data[eq_idx].eq_bands[band_idx].q_factor =
244 ucontrol->value.integer.value[4];
245 return 0;
246}
247
248#ifdef CONFIG_QTI_PP
249void msm_qti_pp_send_eq_values(int fedai_id)
250{
251 if (eq_data[fedai_id].enable)
252 msm_qti_pp_send_eq_values_(fedai_id);
253}
254
255/* CUSTOM MIXING */
256int msm_qti_pp_send_stereo_to_custom_stereo_cmd(int port_id, int copp_idx,
257 unsigned int session_id,
258 uint16_t op_FL_ip_FL_weight,
259 uint16_t op_FL_ip_FR_weight,
260 uint16_t op_FR_ip_FL_weight,
261 uint16_t op_FR_ip_FR_weight)
262{
263 char *params_value;
264 int *update_params_value32, rc = 0;
265 int16_t *update_params_value16 = 0;
266 uint32_t params_length = CUSTOM_STEREO_PAYLOAD_SIZE * sizeof(uint32_t);
267 uint32_t avail_length = params_length;
268
269 pr_debug("%s: port_id - %d, session id - %d\n", __func__, port_id,
270 session_id);
271 params_value = kzalloc(params_length, GFP_KERNEL);
272 if (!params_value) {
273 pr_err("%s, params memory alloc failed\n", __func__);
274 return -ENOMEM;
275 }
276 update_params_value32 = (int *)params_value;
277 if (avail_length < 2 * sizeof(uint32_t))
278 goto skip_send_cmd;
279 *update_params_value32++ = MTMX_MODULE_ID_DEFAULT_CHMIXER;
280 *update_params_value32++ = DEFAULT_CHMIXER_PARAM_ID_COEFF;
281 avail_length = avail_length - (2 * sizeof(uint32_t));
282
283 update_params_value16 = (int16_t *)update_params_value32;
284 if (avail_length < 10 * sizeof(uint16_t))
285 goto skip_send_cmd;
286 *update_params_value16++ = CUSTOM_STEREO_CMD_PARAM_SIZE;
287 /*for alignment only*/
288 *update_params_value16++ = 0;
289 /*index is 32-bit param in little endian*/
290 *update_params_value16++ = CUSTOM_STEREO_INDEX_PARAM;
291 *update_params_value16++ = 0;
292 /*for stereo mixing num out ch*/
293 *update_params_value16++ = CUSTOM_STEREO_NUM_OUT_CH;
294 /*for stereo mixing num in ch*/
295 *update_params_value16++ = CUSTOM_STEREO_NUM_IN_CH;
296
297 /* Out ch map FL/FR*/
298 *update_params_value16++ = PCM_CHANNEL_FL;
299 *update_params_value16++ = PCM_CHANNEL_FR;
300
301 /* In ch map FL/FR*/
302 *update_params_value16++ = PCM_CHANNEL_FL;
303 *update_params_value16++ = PCM_CHANNEL_FR;
304 avail_length = avail_length - (10 * sizeof(uint16_t));
305 /* weighting coefficients as name suggests,
306 * mixing will be done according to these coefficients
307 */
308 if (avail_length < 4 * sizeof(uint16_t))
309 goto skip_send_cmd;
310 *update_params_value16++ = op_FL_ip_FL_weight;
311 *update_params_value16++ = op_FL_ip_FR_weight;
312 *update_params_value16++ = op_FR_ip_FL_weight;
313 *update_params_value16++ = op_FR_ip_FR_weight;
314 avail_length = avail_length - (4 * sizeof(uint16_t));
315 if (params_length) {
316 rc = adm_set_stereo_to_custom_stereo(port_id,
317 copp_idx,
318 session_id,
319 params_value,
320 params_length);
321 if (rc) {
322 pr_err("%s: send params failed rc=%d\n", __func__, rc);
323 kfree(params_value);
324 return -EINVAL;
325 }
326 }
327 kfree(params_value);
328 return 0;
329skip_send_cmd:
330 pr_err("%s: insufficient memory, send cmd failed\n",
331 __func__);
332 kfree(params_value);
333 return -ENOMEM;
334}
335#endif /* CONFIG_QTI_PP */
336
337/* RMS */
338static int msm_qti_pp_get_rms_value_control(struct snd_kcontrol *kcontrol,
339 struct snd_ctl_elem_value *ucontrol)
340{
341 int rc = 0;
342 int be_idx = 0, copp_idx;
343 char *param_value;
344 int *update_param_value;
345 uint32_t param_length = sizeof(uint32_t);
346 uint32_t param_payload_len = RMS_PAYLOAD_LEN * sizeof(uint32_t);
347 struct msm_pcm_routing_bdai_data msm_bedai;
348
349 param_value = kzalloc(param_length, GFP_KERNEL);
350 if (!param_value)
351 return -ENOMEM;
352
353 msm_pcm_routing_acquire_lock();
354 for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) {
355 msm_pcm_routing_get_bedai_info(be_idx, &msm_bedai);
356 if (msm_bedai.port_id == SLIMBUS_0_TX)
357 break;
358 }
359 if ((be_idx >= MSM_BACKEND_DAI_MAX) || !msm_bedai.active) {
360 pr_err("%s, back not active to query rms be_idx:%d\n",
361 __func__, be_idx);
362 rc = -EINVAL;
363 goto get_rms_value_err;
364 }
365 copp_idx = adm_get_default_copp_idx(SLIMBUS_0_TX);
366 if ((copp_idx < 0) || (copp_idx > MAX_COPPS_PER_PORT)) {
367 pr_err("%s, no active copp to query rms copp_idx:%d\n",
368 __func__, copp_idx);
369 rc = -EINVAL;
370 goto get_rms_value_err;
371 }
372 rc = adm_get_params(SLIMBUS_0_TX, copp_idx,
373 RMS_MODULEID_APPI_PASSTHRU,
374 RMS_PARAM_FIRST_SAMPLE,
375 param_length + param_payload_len,
376 param_value);
377 if (rc) {
378 pr_err("%s: get parameters failed rc=%d\n", __func__, rc);
379 rc = -EINVAL;
380 goto get_rms_value_err;
381 }
382 update_param_value = (int *)param_value;
383 ucontrol->value.integer.value[0] = update_param_value[0];
384
385 pr_debug("%s: FROM DSP value[0] 0x%x\n",
386 __func__, update_param_value[0]);
387get_rms_value_err:
388 msm_pcm_routing_release_lock();
389 kfree(param_value);
390 return rc;
391}
392
393static int msm_qti_pp_put_rms_value_control(struct snd_kcontrol *kcontrol,
394 struct snd_ctl_elem_value *ucontrol)
395{
396 /* not used */
397 return 0;
398}
399
400/* VOLUME */
401static int msm_route_fm_vol_control;
402static int msm_afe_lb_vol_ctrl;
403static int msm_afe_sec_mi2s_lb_vol_ctrl;
404static int msm_afe_tert_mi2s_lb_vol_ctrl;
405static int msm_afe_quat_mi2s_lb_vol_ctrl;
406static int msm_afe_slimbus_8_lb_vol_ctrl;
407static const DECLARE_TLV_DB_LINEAR(fm_rx_vol_gain, 0, INT_RX_VOL_MAX_STEPS);
408static const DECLARE_TLV_DB_LINEAR(afe_lb_vol_gain, 0, INT_RX_VOL_MAX_STEPS);
409
410static int msm_qti_pp_get_fm_vol_mixer(struct snd_kcontrol *kcontrol,
411 struct snd_ctl_elem_value *ucontrol)
412{
413 ucontrol->value.integer.value[0] = msm_route_fm_vol_control;
414 return 0;
415}
416
417static int msm_qti_pp_set_fm_vol_mixer(struct snd_kcontrol *kcontrol,
418 struct snd_ctl_elem_value *ucontrol)
419{
420 afe_loopback_gain(INT_FM_TX, ucontrol->value.integer.value[0]);
421
422 msm_route_fm_vol_control = ucontrol->value.integer.value[0];
423
424 return 0;
425}
426
427static int msm_qti_pp_get_pri_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol,
428 struct snd_ctl_elem_value *ucontrol)
429{
430 ucontrol->value.integer.value[0] = msm_afe_lb_vol_ctrl;
431 return 0;
432}
433
434static int msm_qti_pp_set_pri_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol,
435 struct snd_ctl_elem_value *ucontrol)
436{
437 afe_loopback_gain(AFE_PORT_ID_PRIMARY_MI2S_TX,
438 ucontrol->value.integer.value[0]);
439
440 msm_afe_lb_vol_ctrl = ucontrol->value.integer.value[0];
441
442 return 0;
443}
444
445static int msm_qti_pp_get_sec_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol,
446 struct snd_ctl_elem_value *ucontrol)
447{
448 ucontrol->value.integer.value[0] = msm_afe_sec_mi2s_lb_vol_ctrl;
449 return 0;
450}
451
452static int msm_qti_pp_set_sec_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol,
453 struct snd_ctl_elem_value *ucontrol)
454{
455 afe_loopback_gain(AFE_PORT_ID_SECONDARY_MI2S_TX,
456 ucontrol->value.integer.value[0]);
457 msm_afe_sec_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0];
458
459 return 0;
460}
461
462static int msm_qti_pp_get_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol,
463 struct snd_ctl_elem_value *ucontrol)
464{
465 ucontrol->value.integer.value[0] = msm_afe_tert_mi2s_lb_vol_ctrl;
466 return 0;
467}
468
469static int msm_qti_pp_set_tert_mi2s_lb_vol_mixer(struct snd_kcontrol *kcontrol,
470 struct snd_ctl_elem_value *ucontrol)
471{
472 afe_loopback_gain(AFE_PORT_ID_TERTIARY_MI2S_TX,
473 ucontrol->value.integer.value[0]);
474 msm_afe_tert_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0];
475 return 0;
476}
477
478static int msm_qti_pp_get_slimbus_8_lb_vol_mixer(struct snd_kcontrol *kcontrol,
479 struct snd_ctl_elem_value *ucontrol)
480{
481 ucontrol->value.integer.value[0] = msm_afe_slimbus_8_lb_vol_ctrl;
482 return 0;
483}
484
485static int msm_qti_pp_set_slimbus_8_lb_vol_mixer(struct snd_kcontrol *kcontrol,
486 struct snd_ctl_elem_value *ucontrol)
487{
488 int ret = 0;
489
490 ret = afe_loopback_gain(SLIMBUS_8_TX,
491 ucontrol->value.integer.value[0]);
492
493 if (ret)
494 pr_err("%s: failed to set LB vol for SLIMBUS_8_TX", __func__);
495 else
496 msm_afe_slimbus_8_lb_vol_ctrl =
497 ucontrol->value.integer.value[0];
498
499 return ret;
500}
501
Derek Chen5dea59a2016-06-06 20:40:29 -0400502static int msm_qti_pp_get_icc_vol_mixer(struct snd_kcontrol *kcontrol,
503 struct snd_ctl_elem_value *ucontrol)
504{
505 ucontrol->value.integer.value[0] = msm_route_icc_vol_control;
506 return 0;
507}
508
509static int msm_qti_pp_set_icc_vol_mixer(struct snd_kcontrol *kcontrol,
510 struct snd_ctl_elem_value *ucontrol)
511{
512 adm_set_mic_gain(AFE_PORT_ID_QUATERNARY_TDM_TX,
513 adm_get_default_copp_idx(AFE_PORT_ID_QUATERNARY_TDM_TX),
514 ucontrol->value.integer.value[0]);
515 msm_route_icc_vol_control = ucontrol->value.integer.value[0];
516 return 0;
517}
518
Banajit Goswami0530e2f2016-12-09 21:34:37 -0800519static int msm_qti_pp_get_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol,
520 struct snd_ctl_elem_value *ucontrol)
521{
522 ucontrol->value.integer.value[0] = msm_afe_quat_mi2s_lb_vol_ctrl;
523 return 0;
524}
525
526static int msm_qti_pp_set_quat_mi2s_fm_vol_mixer(struct snd_kcontrol *kcontrol,
527 struct snd_ctl_elem_value *ucontrol)
528{
529 afe_loopback_gain(AFE_PORT_ID_QUATERNARY_MI2S_TX,
530 ucontrol->value.integer.value[0]);
531
532 msm_afe_quat_mi2s_lb_vol_ctrl = ucontrol->value.integer.value[0];
533
534 return 0;
535}
536
537static int msm_qti_pp_get_hfp_vol_mixer(struct snd_kcontrol *kcontrol,
538 struct snd_ctl_elem_value *ucontrol)
539{
540 ucontrol->value.integer.value[0] = msm_route_hfp_vol_control;
541 return 0;
542}
543
544static int msm_qti_pp_set_hfp_vol_mixer(struct snd_kcontrol *kcontrol,
545 struct snd_ctl_elem_value *ucontrol)
546{
547 afe_loopback_gain(INT_BT_SCO_TX, ucontrol->value.integer.value[0]);
548
549 msm_route_hfp_vol_control = ucontrol->value.integer.value[0];
550
551 return 0;
552}
553
554static int msm_qti_pp_get_pri_auxpcm_lb_vol_mixer(
555 struct snd_kcontrol *kcontrol,
556 struct snd_ctl_elem_value *ucontrol)
557{
558 ucontrol->value.integer.value[0] = msm_route_pri_auxpcm_lb_vol_ctrl;
559 pr_debug("%s: Volume = %ld\n", __func__,
560 ucontrol->value.integer.value[0]);
561 return 0;
562}
563
564static int msm_qti_pp_set_pri_auxpcm_lb_vol_mixer(
565 struct snd_kcontrol *kcontrol,
566 struct snd_ctl_elem_value *ucontrol)
567{
568 struct soc_mixer_control *mc =
569 (struct soc_mixer_control *)kcontrol->private_value;
570
571 afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]);
572
573 msm_route_pri_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0];
574
575 return 0;
576}
577
578static int msm_qti_pp_get_sec_auxpcm_lb_vol_mixer(
579 struct snd_kcontrol *kcontrol,
580 struct snd_ctl_elem_value *ucontrol)
581{
582 ucontrol->value.integer.value[0] = msm_route_sec_auxpcm_lb_vol_ctrl;
583 pr_debug("%s: Volume = %ld\n", __func__,
584 ucontrol->value.integer.value[0]);
585 return 0;
586}
587
588static int msm_qti_pp_set_sec_auxpcm_lb_vol_mixer(
589 struct snd_kcontrol *kcontrol,
590 struct snd_ctl_elem_value *ucontrol)
591{
592 struct soc_mixer_control *mc =
593 (struct soc_mixer_control *)kcontrol->private_value;
594
595 afe_loopback_gain(mc->reg, ucontrol->value.integer.value[0]);
596
597 msm_route_sec_auxpcm_lb_vol_ctrl = ucontrol->value.integer.value[0];
598
599 return 0;
600}
601
602static int msm_qti_pp_get_channel_map_mixer(struct snd_kcontrol *kcontrol,
603 struct snd_ctl_elem_value *ucontrol)
604{
Xiaojun Sang09c837c2016-12-16 16:25:27 +0800605 char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL] = {0};
Banajit Goswami0530e2f2016-12-09 21:34:37 -0800606 int i;
607
608 adm_get_multi_ch_map(channel_map, ADM_PATH_PLAYBACK);
609 for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL; i++)
610 ucontrol->value.integer.value[i] =
611 (unsigned int) channel_map[i];
612 return 0;
613}
614
615static int msm_qti_pp_put_channel_map_mixer(struct snd_kcontrol *kcontrol,
616 struct snd_ctl_elem_value *ucontrol)
617{
618 char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL];
619 int i;
620
621 for (i = 0; i < PCM_FORMAT_MAX_NUM_CHANNEL; i++)
622 channel_map[i] = (char)(ucontrol->value.integer.value[i]);
623 adm_set_multi_ch_map(channel_map, ADM_PATH_PLAYBACK);
624
625 return 0;
626}
627
628/* Audio Sphere functions */
629
630static void msm_qti_pp_asphere_init_state(void)
631{
632 int i;
633
634 if (asphere_state.initialized)
635 return;
636 asphere_state.initialized = true;
637 for (i = 0; i < AFE_MAX_PORTS; i++) {
638 asphere_state.port_id[i] = -1;
639 asphere_state.copp_idx[i] = -1;
640 }
641 asphere_state.enabled = 0;
642 asphere_state.strength = 0;
643 asphere_state.mode = 0;
644 asphere_state.version = 0;
645 asphere_state.enabled_prev = 0;
646 asphere_state.strength_prev = 0;
647}
648
649static int msm_qti_pp_asphere_send_params(int port_id, int copp_idx, bool force)
650{
651 char *params_value = NULL;
652 uint32_t *update_params_value = NULL;
653 uint32_t param_size = sizeof(uint32_t) +
654 sizeof(struct adm_param_data_v5);
655 int params_length = 0, param_count = 0, ret = 0;
656 bool set_enable = force ||
657 (asphere_state.enabled != asphere_state.enabled_prev);
658 bool set_strength = asphere_state.enabled == 1 && (set_enable ||
659 (asphere_state.strength != asphere_state.strength_prev));
660
661 if (set_enable)
662 param_count++;
663 if (set_strength)
664 param_count++;
665 params_length = param_count * param_size;
666
667 pr_debug("%s: port_id %d, copp_id %d, forced %d, param_count %d\n",
668 __func__, port_id, copp_idx, force, param_count);
669 pr_debug("%s: enable prev:%u cur:%u, strength prev:%u cur:%u\n",
670 __func__, asphere_state.enabled_prev, asphere_state.enabled,
671 asphere_state.strength_prev, asphere_state.strength);
672
673 if (params_length > 0)
674 params_value = kzalloc(params_length, GFP_KERNEL);
675 if (!params_value) {
676 pr_err("%s, params memory alloc failed\n", __func__);
677 return -ENOMEM;
678 }
679 update_params_value = (uint32_t *)params_value;
680 params_length = 0;
681 if (set_strength) {
682 /* add strength command */
683 *update_params_value++ = AUDPROC_MODULE_ID_AUDIOSPHERE;
684 *update_params_value++ = AUDPROC_PARAM_ID_AUDIOSPHERE_STRENGTH;
685 *update_params_value++ = sizeof(uint32_t);
686 *update_params_value++ = asphere_state.strength;
687 params_length += param_size;
688 }
689 if (set_enable) {
690 /* add enable command */
691 *update_params_value++ = AUDPROC_MODULE_ID_AUDIOSPHERE;
692 *update_params_value++ = AUDPROC_PARAM_ID_AUDIOSPHERE_ENABLE;
693 *update_params_value++ = sizeof(uint32_t);
694 *update_params_value++ = asphere_state.enabled;
695 params_length += param_size;
696 }
697 pr_debug("%s, param length: %d\n", __func__, params_length);
698 if (params_length) {
699 ret = adm_send_params_v5(port_id, copp_idx,
700 params_value, params_length);
701 if (ret) {
702 pr_err("%s: setting param failed with err=%d\n",
703 __func__, ret);
704 kfree(params_value);
705 return -EINVAL;
706 }
707 }
708 kfree(params_value);
709 return 0;
710}
711
712#if defined(CONFIG_QTI_PP) && defined(CONFIG_QTI_PP_AUDIOSPHERE)
713int msm_qti_pp_asphere_init(int port_id, int copp_idx)
714{
715 int index = adm_validate_and_get_port_index(port_id);
716
717 pr_debug("%s, port_id %d, copp_id %d\n", __func__, port_id, copp_idx);
718 if (index < 0) {
719 pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index,
720 port_id);
721 return -EINVAL;
722 }
723 msm_qti_pp_asphere_init_state();
724
725 asphere_state.port_id[index] = port_id;
726 asphere_state.copp_idx[index] = copp_idx;
727
728 if (asphere_state.enabled)
729 msm_qti_pp_asphere_send_params(port_id, copp_idx, true);
730
731 return 0;
732}
733
734void msm_qti_pp_asphere_deinit(int port_id)
735{
736 int index = adm_validate_and_get_port_index(port_id);
737
738 pr_debug("%s, port_id %d\n", __func__, port_id);
739 if (index < 0) {
740 pr_err("%s: Invalid port idx %d port_id %#x\n", __func__, index,
741 port_id);
742 return;
743 }
744
745 if (asphere_state.port_id[index] == port_id) {
746 asphere_state.port_id[index] = -1;
747 asphere_state.copp_idx[index] = -1;
748 }
749}
750#endif
751
752static int msm_qti_pp_asphere_get(struct snd_kcontrol *kcontrol,
753 struct snd_ctl_elem_value *ucontrol)
754{
755 if (!asphere_state.initialized)
756 return -EAGAIN;
757 ucontrol->value.integer.value[0] = asphere_state.enabled;
758 ucontrol->value.integer.value[1] = asphere_state.strength;
759 pr_debug("%s, enable %u, strength %u\n", __func__,
760 asphere_state.enabled, asphere_state.strength);
761 return 0;
762}
763
764static int msm_qti_pp_asphere_set(struct snd_kcontrol *kcontrol,
765 struct snd_ctl_elem_value *ucontrol)
766{
767 int32_t enable = ucontrol->value.integer.value[0];
768 int32_t strength = ucontrol->value.integer.value[1];
769 int i;
770
771 pr_debug("%s, enable %u, strength %u\n", __func__, enable, strength);
772
773 msm_qti_pp_asphere_init_state();
774
775 if (enable == 0 || enable == 1) {
776 asphere_state.enabled_prev = asphere_state.enabled;
777 asphere_state.enabled = enable;
778 }
779
780 if (strength >= 0 && strength <= 1000) {
781 asphere_state.strength_prev = asphere_state.strength;
782 asphere_state.strength = strength;
783 }
784
785 if (asphere_state.strength != asphere_state.strength_prev ||
786 asphere_state.enabled != asphere_state.enabled_prev) {
787 for (i = 0; i < AFE_MAX_PORTS; i++) {
788 if (asphere_state.port_id[i] >= 0)
789 msm_qti_pp_asphere_send_params(
790 asphere_state.port_id[i],
791 asphere_state.copp_idx[i],
792 false);
793 }
794 }
795 return 0;
796}
797
798static const struct snd_kcontrol_new int_fm_vol_mixer_controls[] = {
799 SOC_SINGLE_EXT_TLV("Internal FM RX Volume", SND_SOC_NOPM, 0,
800 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_fm_vol_mixer,
801 msm_qti_pp_set_fm_vol_mixer, fm_rx_vol_gain),
802 SOC_SINGLE_EXT_TLV("Quat MI2S FM RX Volume", SND_SOC_NOPM, 0,
803 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_quat_mi2s_fm_vol_mixer,
804 msm_qti_pp_set_quat_mi2s_fm_vol_mixer, fm_rx_vol_gain),
805};
806
807static const struct snd_kcontrol_new pri_mi2s_lb_vol_mixer_controls[] = {
808 SOC_SINGLE_EXT_TLV("PRI MI2S LOOPBACK Volume", SND_SOC_NOPM, 0,
809 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_pri_mi2s_lb_vol_mixer,
810 msm_qti_pp_set_pri_mi2s_lb_vol_mixer, afe_lb_vol_gain),
811};
812
813static const struct snd_kcontrol_new sec_mi2s_lb_vol_mixer_controls[] = {
814 SOC_SINGLE_EXT_TLV("SEC MI2S LOOPBACK Volume", SND_SOC_NOPM, 0,
815 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_sec_mi2s_lb_vol_mixer,
816 msm_qti_pp_set_sec_mi2s_lb_vol_mixer, afe_lb_vol_gain),
817};
818
819static const struct snd_kcontrol_new tert_mi2s_lb_vol_mixer_controls[] = {
820 SOC_SINGLE_EXT_TLV("Tert MI2S LOOPBACK Volume", SND_SOC_NOPM, 0,
821 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_tert_mi2s_lb_vol_mixer,
822 msm_qti_pp_set_tert_mi2s_lb_vol_mixer, afe_lb_vol_gain),
823};
824
825static const struct snd_kcontrol_new slimbus_8_lb_vol_mixer_controls[] = {
826 SOC_SINGLE_EXT_TLV("SLIMBUS_8 LOOPBACK Volume", SND_SOC_NOPM, 0,
827 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_slimbus_8_lb_vol_mixer,
828 msm_qti_pp_set_slimbus_8_lb_vol_mixer, afe_lb_vol_gain),
829};
830
831static const struct snd_kcontrol_new int_hfp_vol_mixer_controls[] = {
832 SOC_SINGLE_EXT_TLV("Internal HFP RX Volume", SND_SOC_NOPM, 0,
833 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_hfp_vol_mixer,
834 msm_qti_pp_set_hfp_vol_mixer, hfp_rx_vol_gain),
835};
836
Derek Chen5dea59a2016-06-06 20:40:29 -0400837static const struct snd_kcontrol_new int_icc_vol_mixer_controls[] = {
838 SOC_SINGLE_EXT_TLV("Internal ICC Volume", SND_SOC_NOPM, 0,
839 INT_RX_VOL_GAIN, 0, msm_qti_pp_get_icc_vol_mixer,
840 msm_qti_pp_set_icc_vol_mixer, icc_rx_vol_gain),
841};
842
Banajit Goswami0530e2f2016-12-09 21:34:37 -0800843static const struct snd_kcontrol_new pri_auxpcm_lb_vol_mixer_controls[] = {
844 SOC_SINGLE_EXT_TLV("PRI AUXPCM LOOPBACK Volume",
845 AFE_PORT_ID_PRIMARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0,
846 msm_qti_pp_get_pri_auxpcm_lb_vol_mixer,
847 msm_qti_pp_set_pri_auxpcm_lb_vol_mixer,
848 pri_auxpcm_lb_vol_gain),
849};
850
851static const struct snd_kcontrol_new sec_auxpcm_lb_vol_mixer_controls[] = {
852 SOC_SINGLE_EXT_TLV("SEC AUXPCM LOOPBACK Volume",
853 AFE_PORT_ID_SECONDARY_PCM_TX, 0, INT_RX_VOL_GAIN, 0,
854 msm_qti_pp_get_sec_auxpcm_lb_vol_mixer,
855 msm_qti_pp_set_sec_auxpcm_lb_vol_mixer,
856 sec_auxpcm_lb_vol_gain),
857};
858
859static const struct snd_kcontrol_new multi_ch_channel_map_mixer_controls[] = {
860 SOC_SINGLE_MULTI_EXT("Playback Device Channel Map", SND_SOC_NOPM, 0, 16,
861 0, 8, msm_qti_pp_get_channel_map_mixer,
862 msm_qti_pp_put_channel_map_mixer),
863};
864
865
866static const struct snd_kcontrol_new get_rms_controls[] = {
867 SOC_SINGLE_EXT("Get RMS", SND_SOC_NOPM, 0, 0xFFFFFFFF,
868 0, msm_qti_pp_get_rms_value_control, msm_qti_pp_put_rms_value_control),
869};
870
871static const struct snd_kcontrol_new eq_enable_mixer_controls[] = {
872 SOC_SINGLE_EXT("MultiMedia1 EQ Enable", SND_SOC_NOPM,
873 MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_qti_pp_get_eq_enable_mixer,
874 msm_qti_pp_put_eq_enable_mixer),
875 SOC_SINGLE_EXT("MultiMedia2 EQ Enable", SND_SOC_NOPM,
876 MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_qti_pp_get_eq_enable_mixer,
877 msm_qti_pp_put_eq_enable_mixer),
878 SOC_SINGLE_EXT("MultiMedia3 EQ Enable", SND_SOC_NOPM,
879 MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_qti_pp_get_eq_enable_mixer,
880 msm_qti_pp_put_eq_enable_mixer),
881};
882
883static const struct snd_kcontrol_new eq_band_mixer_controls[] = {
884 SOC_SINGLE_EXT("MultiMedia1 EQ Band Count", SND_SOC_NOPM,
885 MSM_FRONTEND_DAI_MULTIMEDIA1, 11, 0,
886 msm_qti_pp_get_eq_band_count_audio_mixer,
887 msm_qti_pp_put_eq_band_count_audio_mixer),
888 SOC_SINGLE_EXT("MultiMedia2 EQ Band Count", SND_SOC_NOPM,
889 MSM_FRONTEND_DAI_MULTIMEDIA2, 11, 0,
890 msm_qti_pp_get_eq_band_count_audio_mixer,
891 msm_qti_pp_put_eq_band_count_audio_mixer),
892 SOC_SINGLE_EXT("MultiMedia3 EQ Band Count", SND_SOC_NOPM,
893 MSM_FRONTEND_DAI_MULTIMEDIA3, 11, 0,
894 msm_qti_pp_get_eq_band_count_audio_mixer,
895 msm_qti_pp_put_eq_band_count_audio_mixer),
896};
897
898static const struct snd_kcontrol_new eq_coeff_mixer_controls[] = {
899 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band1", EQ_BAND1,
900 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
901 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
902 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band2", EQ_BAND2,
903 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
904 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
905 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band3", EQ_BAND3,
906 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
907 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
908 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band4", EQ_BAND4,
909 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
910 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
911 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band5", EQ_BAND5,
912 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
913 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
914 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band6", EQ_BAND6,
915 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
916 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
917 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band7", EQ_BAND7,
918 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
919 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
920 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band8", EQ_BAND8,
921 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
922 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
923 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band9", EQ_BAND9,
924 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
925 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
926 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band10", EQ_BAND10,
927 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
928 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
929 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band11", EQ_BAND11,
930 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
931 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
932 SOC_SINGLE_MULTI_EXT("MultiMedia1 EQ Band12", EQ_BAND12,
933 MSM_FRONTEND_DAI_MULTIMEDIA1, 255, 0, 5,
934 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
935 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band1", EQ_BAND1,
936 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
937 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
938 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band2", EQ_BAND2,
939 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
940 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
941 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band3", EQ_BAND3,
942 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
943 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
944 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band4", EQ_BAND4,
945 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
946 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
947 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band5", EQ_BAND5,
948 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
949 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
950 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band6", EQ_BAND6,
951 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
952 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
953 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band7", EQ_BAND7,
954 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
955 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
956 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band8", EQ_BAND8,
957 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
958 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
959 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band9", EQ_BAND9,
960 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
961 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
962 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band10", EQ_BAND10,
963 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
964 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
965 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band11", EQ_BAND11,
966 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
967 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
968 SOC_SINGLE_MULTI_EXT("MultiMedia2 EQ Band12", EQ_BAND12,
969 MSM_FRONTEND_DAI_MULTIMEDIA2, 255, 0, 5,
970 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
971 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band1", EQ_BAND1,
972 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
973 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
974 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band2", EQ_BAND2,
975 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
976 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
977 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band3", EQ_BAND3,
978 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
979 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
980 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band4", EQ_BAND4,
981 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
982 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
983 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band5", EQ_BAND5,
984 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
985 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
986 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band6", EQ_BAND6,
987 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
988 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
989 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band7", EQ_BAND7,
990 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
991 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
992 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band8", EQ_BAND8,
993 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
994 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
995 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band9", EQ_BAND9,
996 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
997 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
998 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band10", EQ_BAND10,
999 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1000 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
1001 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band11", EQ_BAND11,
1002 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1003 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
1004 SOC_SINGLE_MULTI_EXT("MultiMedia3 EQ Band12", EQ_BAND12,
1005 MSM_FRONTEND_DAI_MULTIMEDIA3, 255, 0, 5,
1006 msm_qti_pp_get_eq_band_audio_mixer, msm_qti_pp_put_eq_band_audio_mixer),
1007};
1008
1009static const struct snd_kcontrol_new asphere_mixer_controls[] = {
1010 SOC_SINGLE_MULTI_EXT("MSM ASphere Set Param", SND_SOC_NOPM, 0,
1011 0xFFFFFFFF, 0, 2, msm_qti_pp_asphere_get, msm_qti_pp_asphere_set),
1012};
1013
1014#ifdef CONFIG_QTI_PP
1015void msm_qti_pp_add_controls(struct snd_soc_platform *platform)
1016{
1017 snd_soc_add_platform_controls(platform, int_fm_vol_mixer_controls,
1018 ARRAY_SIZE(int_fm_vol_mixer_controls));
1019
1020 snd_soc_add_platform_controls(platform, pri_mi2s_lb_vol_mixer_controls,
1021 ARRAY_SIZE(pri_mi2s_lb_vol_mixer_controls));
1022
1023 snd_soc_add_platform_controls(platform, sec_mi2s_lb_vol_mixer_controls,
1024 ARRAY_SIZE(sec_mi2s_lb_vol_mixer_controls));
1025
1026 snd_soc_add_platform_controls(platform, tert_mi2s_lb_vol_mixer_controls,
1027 ARRAY_SIZE(tert_mi2s_lb_vol_mixer_controls));
1028
1029 snd_soc_add_platform_controls(platform, slimbus_8_lb_vol_mixer_controls,
1030 ARRAY_SIZE(slimbus_8_lb_vol_mixer_controls));
1031
1032 snd_soc_add_platform_controls(platform, int_hfp_vol_mixer_controls,
1033 ARRAY_SIZE(int_hfp_vol_mixer_controls));
1034
Derek Chen5dea59a2016-06-06 20:40:29 -04001035 snd_soc_add_platform_controls(platform, int_icc_vol_mixer_controls,
1036 ARRAY_SIZE(int_icc_vol_mixer_controls));
1037
Banajit Goswami0530e2f2016-12-09 21:34:37 -08001038 snd_soc_add_platform_controls(platform,
1039 pri_auxpcm_lb_vol_mixer_controls,
1040 ARRAY_SIZE(pri_auxpcm_lb_vol_mixer_controls));
1041
1042 snd_soc_add_platform_controls(platform,
1043 sec_auxpcm_lb_vol_mixer_controls,
1044 ARRAY_SIZE(sec_auxpcm_lb_vol_mixer_controls));
1045
1046 snd_soc_add_platform_controls(platform,
1047 multi_ch_channel_map_mixer_controls,
1048 ARRAY_SIZE(multi_ch_channel_map_mixer_controls));
1049
1050 snd_soc_add_platform_controls(platform, get_rms_controls,
1051 ARRAY_SIZE(get_rms_controls));
1052
1053 snd_soc_add_platform_controls(platform, eq_enable_mixer_controls,
1054 ARRAY_SIZE(eq_enable_mixer_controls));
1055
1056 snd_soc_add_platform_controls(platform, eq_band_mixer_controls,
1057 ARRAY_SIZE(eq_band_mixer_controls));
1058
1059 snd_soc_add_platform_controls(platform, eq_coeff_mixer_controls,
1060 ARRAY_SIZE(eq_coeff_mixer_controls));
1061
1062 snd_soc_add_platform_controls(platform, asphere_mixer_controls,
1063 ARRAY_SIZE(asphere_mixer_controls));
1064}
1065#endif /* CONFIG_QTI_PP */