blob: b5a152c2f2b145e3c4864de4893131ca5be769b6 [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 *
12 */
13#include <linux/slab.h>
14#include <linux/kernel.h>
15#include <linux/module.h>
16#include <linux/miscdevice.h>
17#include <linux/uaccess.h>
18#include <linux/fs.h>
19#include <linux/sched.h>
20#include <linux/msm_audio.h>
21#include <linux/kthread.h>
22#include <linux/completion.h>
23#include <linux/wait.h>
24#include <linux/mutex.h>
25#include <mach/qdsp6v2/audio_dev_ctl.h>
26#include <mach/dal.h>
27#include <mach/qdsp6v2/q6voice.h>
28#include <mach/qdsp6v2/rtac.h>
29#include <mach/qdsp6v2/audio_acdb.h>
30#include "q6core.h"
31
32
33#define TIMEOUT_MS 3000
34#define SNDDEV_CAP_TTY 0x20
35
36#define CMD_STATUS_SUCCESS 0
37#define CMD_STATUS_FAIL 1
38
39#define VOC_PATH_PASSIVE 0
40#define VOC_PATH_FULL 1
41#define ADSP_VERSION_CVD 0x60300000
42
43#define BUFFER_PAYLOAD_SIZE 4000
44
45#define VOC_REC_NONE 0xFF
46
47struct voice_data voice;
48
49static bool is_adsp_support_cvd(void)
50{
51 return (voice.adsp_version >= ADSP_VERSION_CVD);
52}
53static int voice_send_enable_vocproc_cmd(struct voice_data *v);
54static int voice_send_netid_timing_cmd(struct voice_data *v);
55
56static void *voice_get_apr_mvm(struct voice_data *v)
57{
58 void *apr_mvm = NULL;
59
60 if (v->voc_path == VOC_PATH_PASSIVE &&
61 !(is_adsp_support_cvd()))
62 apr_mvm = v->apr_mvm;
63 else
64 apr_mvm = v->apr_q6_mvm;
65
66 pr_debug("%s: apr_mvm 0x%x\n", __func__, (unsigned int)apr_mvm);
67
68 return apr_mvm;
69}
70
71static void voice_set_apr_mvm(struct voice_data *v, void *apr_mvm)
72{
73 pr_debug("%s: apr_mvm 0x%x\n", __func__, (unsigned int)apr_mvm);
74
75 if (v->voc_path == VOC_PATH_PASSIVE &&
76 !(is_adsp_support_cvd()))
77 v->apr_mvm = apr_mvm;
78 else
79 v->apr_q6_mvm = apr_mvm;
80}
81
82static void *voice_get_apr_cvs(struct voice_data *v)
83{
84 void *apr_cvs = NULL;
85
86 if (v->voc_path == VOC_PATH_PASSIVE &&
87 !(is_adsp_support_cvd()))
88 apr_cvs = v->apr_cvs;
89 else
90 apr_cvs = v->apr_q6_cvs;
91
92 pr_debug("%s: apr_cvs 0x%x\n", __func__, (unsigned int)apr_cvs);
93
94 return apr_cvs;
95}
96
97static void voice_set_apr_cvs(struct voice_data *v, void *apr_cvs)
98{
99 pr_debug("%s: apr_cvs 0x%x\n", __func__, (unsigned int)apr_cvs);
100
101 if (v->voc_path == VOC_PATH_PASSIVE &&
102 !(is_adsp_support_cvd()))
103 v->apr_cvs = apr_cvs;
104 else
105 v->apr_q6_cvs = apr_cvs;
106#ifdef CONFIG_MSM8X60_RTAC
107 rtac_set_voice_handle(RTAC_CVS, apr_cvs);
108#endif
109}
110
111static void *voice_get_apr_cvp(struct voice_data *v)
112{
113 void *apr_cvp = NULL;
114
115 if (v->voc_path == VOC_PATH_PASSIVE &&
116 !(is_adsp_support_cvd()))
117 apr_cvp = v->apr_cvp;
118 else
119 apr_cvp = v->apr_q6_cvp;
120
121 pr_debug("%s: apr_cvp 0x%x\n", __func__, (unsigned int)apr_cvp);
122
123 return apr_cvp;
124}
125
126static void voice_set_apr_cvp(struct voice_data *v, void *apr_cvp)
127{
128 pr_debug("%s: apr_cvp 0x%x\n", __func__, (unsigned int)apr_cvp);
129
130 if (v->voc_path == VOC_PATH_PASSIVE &&
131 !(is_adsp_support_cvd()))
132 v->apr_cvp = apr_cvp;
133 else
134 v->apr_q6_cvp = apr_cvp;
135#ifdef CONFIG_MSM8X60_RTAC
136 rtac_set_voice_handle(RTAC_CVP, apr_cvp);
137#endif
138}
139
140static u16 voice_get_mvm_handle(struct voice_data *v)
141{
142 u16 mvm_handle = 0;
143
144 if (v->voc_path == VOC_PATH_PASSIVE)
145 mvm_handle = v->mvm_handle;
146 else
147 mvm_handle = v->mvm_q6_handle;
148
149 pr_debug("%s: mvm_handle %d\n", __func__, mvm_handle);
150
151 return mvm_handle;
152}
153
154static void voice_set_mvm_handle(struct voice_data *v, u16 mvm_handle)
155{
156 pr_debug("%s: mvm_handle %d\n", __func__, mvm_handle);
157
158 if (v->voc_path == VOC_PATH_PASSIVE)
159 v->mvm_handle = mvm_handle;
160 else
161 v->mvm_q6_handle = mvm_handle;
162}
163
164static u16 voice_get_cvs_handle(struct voice_data *v)
165{
166 u16 cvs_handle = 0;
167
168 if (v->voc_path == VOC_PATH_PASSIVE)
169 cvs_handle = v->cvs_handle;
170 else
171 cvs_handle = v->cvs_q6_handle;
172
173 pr_debug("%s: cvs_handle %d\n", __func__, cvs_handle);
174
175 return cvs_handle;
176}
177
178static void voice_set_cvs_handle(struct voice_data *v, u16 cvs_handle)
179{
180 pr_debug("%s: cvs_handle %d\n", __func__, cvs_handle);
181
182 if (v->voc_path == VOC_PATH_PASSIVE)
183 v->cvs_handle = cvs_handle;
184 else
185 v->cvs_q6_handle = cvs_handle;
186}
187
188static u16 voice_get_cvp_handle(struct voice_data *v)
189{
190 u16 cvp_handle = 0;
191
192 if (v->voc_path == VOC_PATH_PASSIVE)
193 cvp_handle = v->cvp_handle;
194 else
195 cvp_handle = v->cvp_q6_handle;
196
197 pr_debug("%s: cvp_handle %d\n", __func__, cvp_handle);
198
199 return cvp_handle;
200}
201
202static void voice_set_cvp_handle(struct voice_data *v, u16 cvp_handle)
203{
204 pr_debug("%s: cvp_handle %d\n", __func__, cvp_handle);
205
206 if (v->voc_path == VOC_PATH_PASSIVE)
207 v->cvp_handle = cvp_handle;
208 else
209 v->cvp_q6_handle = cvp_handle;
210}
211
212static void voice_auddev_cb_function(u32 evt_id,
213 union auddev_evt_data *evt_payload,
214 void *private_data);
215
216static int32_t modem_mvm_callback(struct apr_client_data *data, void *priv);
217static int32_t modem_cvs_callback(struct apr_client_data *data, void *priv);
218static int32_t modem_cvp_callback(struct apr_client_data *data, void *priv);
219
220static int voice_apr_register(struct voice_data *v)
221{
222 int rc = 0;
223 void *apr_mvm;
224 void *apr_cvs;
225 void *apr_cvp;
226
227 if (v->adsp_version == 0) {
228 v->adsp_version = core_get_adsp_version();
229 pr_info("adsp_ver fetched:%x\n", v->adsp_version);
230 }
231 apr_mvm = voice_get_apr_mvm(v);
232 apr_cvs = voice_get_apr_cvs(v);
233 apr_cvp = voice_get_apr_cvp(v);
234
235
236 pr_debug("into voice_apr_register_callback\n");
237 /* register callback to APR */
238 if (apr_mvm == NULL) {
239 pr_debug("start to register MVM callback\n");
240
241 if (v->voc_path == VOC_PATH_PASSIVE &&
242 !(is_adsp_support_cvd())) {
243 apr_mvm = apr_register("MODEM", "MVM",
244 modem_mvm_callback, 0xFFFFFFFF,
245 v);
246 } else {
247 apr_mvm = apr_register("ADSP", "MVM",
248 modem_mvm_callback, 0xFFFFFFFF,
249 v);
250 }
251
252 if (apr_mvm == NULL) {
253 pr_err("Unable to register MVM %d\n",
254 is_adsp_support_cvd());
255 rc = -ENODEV;
256 goto done;
257 }
258
259 voice_set_apr_mvm(v, apr_mvm);
260 }
261
262 if (apr_cvs == NULL) {
263 pr_debug("start to register CVS callback\n");
264
265 if (v->voc_path == VOC_PATH_PASSIVE &&
266 !(is_adsp_support_cvd())) {
267 apr_cvs = apr_register("MODEM", "CVS",
268 modem_cvs_callback, 0xFFFFFFFF,
269 v);
270 } else {
271 apr_cvs = apr_register("ADSP", "CVS",
272 modem_cvs_callback, 0xFFFFFFFF,
273 v);
274 }
275
276 if (apr_cvs == NULL) {
277 pr_err("Unable to register CVS %d\n",
278 is_adsp_support_cvd());
279 rc = -ENODEV;
280 goto err;
281 }
282
283 voice_set_apr_cvs(v, apr_cvs);
284 }
285
286 if (apr_cvp == NULL) {
287 pr_debug("start to register CVP callback\n");
288
289 if (v->voc_path == VOC_PATH_PASSIVE &&
290 !(is_adsp_support_cvd())) {
291 apr_cvp = apr_register("MODEM", "CVP",
292 modem_cvp_callback, 0xFFFFFFFF,
293 v);
294 } else {
295 apr_cvp = apr_register("ADSP", "CVP",
296 modem_cvp_callback, 0xFFFFFFFF,
297 v);
298 }
299
300 if (apr_cvp == NULL) {
301 pr_err("Unable to register CVP %d\n",
302 is_adsp_support_cvd());
303 rc = -ENODEV;
304 goto err1;
305 }
306
307 voice_set_apr_cvp(v, apr_cvp);
308 }
309 return 0;
310
311err1:
312 apr_deregister(apr_cvs);
313 apr_cvs = NULL;
314 voice_set_apr_cvs(v, apr_cvs);
315err:
316 apr_deregister(apr_mvm);
317 apr_mvm = NULL;
318 voice_set_apr_mvm(v, apr_mvm);
319
320done:
321 return rc;
322}
323
324static int voice_create_mvm_cvs_session(struct voice_data *v)
325{
326 int ret = 0;
327 struct mvm_create_ctl_session_cmd mvm_session_cmd;
328 struct cvs_create_passive_ctl_session_cmd cvs_session_cmd;
329 struct cvs_create_full_ctl_session_cmd cvs_full_ctl_cmd;
330 struct mvm_attach_stream_cmd attach_stream_cmd;
331 void *apr_mvm = voice_get_apr_mvm(v);
332 void *apr_cvs = voice_get_apr_cvs(v);
333 void *apr_cvp = voice_get_apr_cvp(v);
334 u16 mvm_handle = voice_get_mvm_handle(v);
335 u16 cvs_handle = voice_get_cvs_handle(v);
336 u16 cvp_handle = voice_get_cvp_handle(v);
337
338 pr_info("%s:\n", __func__);
339
340 /* start to ping if modem service is up */
341 pr_debug("in voice_create_mvm_cvs_session, mvm_hdl=%d, cvs_hdl=%d\n",
342 mvm_handle, cvs_handle);
343 /* send cmd to create mvm session and wait for response */
344
345 if (!mvm_handle) {
346 if (v->voc_path == VOC_PATH_PASSIVE) {
347 mvm_session_cmd.hdr.hdr_field =
348 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
349 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
350 mvm_session_cmd.hdr.pkt_size =
351 APR_PKT_SIZE(APR_HDR_SIZE,
352 sizeof(mvm_session_cmd) - APR_HDR_SIZE);
353 pr_debug("Send mvm create session pkt size = %d\n",
354 mvm_session_cmd.hdr.pkt_size);
355 mvm_session_cmd.hdr.src_port = 0;
356 mvm_session_cmd.hdr.dest_port = 0;
357 mvm_session_cmd.hdr.token = 0;
358 pr_debug("%s: Creating MVM passive ctrl\n", __func__);
359 mvm_session_cmd.hdr.opcode =
360 VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION;
361 strncpy(mvm_session_cmd.mvm_session.name,
362 "default modem voice", SESSION_NAME_LEN);
363
364 v->mvm_state = CMD_STATUS_FAIL;
365
366 ret = apr_send_pkt(apr_mvm,
367 (uint32_t *) &mvm_session_cmd);
368 if (ret < 0) {
369 pr_err("Error sending MVM_CONTROL_SESSION\n");
370 goto fail;
371 }
372 ret = wait_event_timeout(v->mvm_wait,
373 (v->mvm_state == CMD_STATUS_SUCCESS),
374 msecs_to_jiffies(TIMEOUT_MS));
375 if (!ret) {
376 pr_err("%s: wait_event timeout\n", __func__);
377 goto fail;
378 }
379 } else {
380 mvm_session_cmd.hdr.hdr_field =
381 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
382 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
383 mvm_session_cmd.hdr.pkt_size =
384 APR_PKT_SIZE(APR_HDR_SIZE,
385 sizeof(mvm_session_cmd) - APR_HDR_SIZE);
386 pr_debug("Send mvm create session pkt size = %d\n",
387 mvm_session_cmd.hdr.pkt_size);
388 mvm_session_cmd.hdr.src_port = 0;
389 mvm_session_cmd.hdr.dest_port = 0;
390 mvm_session_cmd.hdr.token = 0;
391 pr_debug("%s: Creating MVM full ctrl\n", __func__);
392 mvm_session_cmd.hdr.opcode =
393 VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION;
394 strncpy(mvm_session_cmd.mvm_session.name,
395 "default voip", SESSION_NAME_LEN);
396
397 v->mvm_state = CMD_STATUS_FAIL;
398
399 ret = apr_send_pkt(apr_mvm,
400 (uint32_t *) &mvm_session_cmd);
401 if (ret < 0) {
402 pr_err("Error sending MVM_FULL_CTL_SESSION\n");
403 goto fail;
404 }
405 ret = wait_event_timeout(v->mvm_wait,
406 (v->mvm_state == CMD_STATUS_SUCCESS),
407 msecs_to_jiffies(TIMEOUT_MS));
408 if (!ret) {
409 pr_err("%s: wait_event timeout\n", __func__);
410 goto fail;
411 }
412 }
413
414 /* Get the created MVM handle. */
415 mvm_handle = voice_get_mvm_handle(v);
416 }
417
418 /* send cmd to create cvs session */
419 if (!cvs_handle) {
420 if (v->voc_path == VOC_PATH_PASSIVE) {
421 pr_info("%s:creating CVS passive session\n", __func__);
422
423 cvs_session_cmd.hdr.hdr_field = APR_HDR_FIELD(
424 APR_MSG_TYPE_SEQ_CMD,
425 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
426 cvs_session_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
427 sizeof(cvs_session_cmd) - APR_HDR_SIZE);
428 pr_info("send stream create session pkt size = %d\n",
429 cvs_session_cmd.hdr.pkt_size);
430 cvs_session_cmd.hdr.src_port = 0;
431 cvs_session_cmd.hdr.dest_port = 0;
432 cvs_session_cmd.hdr.token = 0;
433 cvs_session_cmd.hdr.opcode =
434 VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION;
435 strncpy(cvs_session_cmd.cvs_session.name,
436 "default modem voice", SESSION_NAME_LEN);
437
438 v->cvs_state = CMD_STATUS_FAIL;
439
440 pr_info("%s: CVS create\n", __func__);
441 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_session_cmd);
442 if (ret < 0) {
443 pr_err("Fail in sending STREAM_CONTROL_SESSION\n");
444 goto fail;
445 }
446 ret = wait_event_timeout(v->cvs_wait,
447 (v->cvs_state == CMD_STATUS_SUCCESS),
448 msecs_to_jiffies(TIMEOUT_MS));
449 if (!ret) {
450 pr_err("%s: wait_event timeout\n", __func__);
451 goto fail;
452 }
453
454 /* Get the created CVS handle. */
455 cvs_handle = voice_get_cvs_handle(v);
456 } else {
457 pr_info("%s:creating CVS full session\n", __func__);
458
459 cvs_full_ctl_cmd.hdr.hdr_field =
460 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
461 APR_HDR_LEN(APR_HDR_SIZE),
462 APR_PKT_VER);
463
464 cvs_full_ctl_cmd.hdr.pkt_size =
465 APR_PKT_SIZE(APR_HDR_SIZE,
466 sizeof(cvs_full_ctl_cmd) - APR_HDR_SIZE);
467
468 cvs_full_ctl_cmd.hdr.src_port = 0;
469 cvs_full_ctl_cmd.hdr.dest_port = 0;
470 cvs_full_ctl_cmd.hdr.token = 0;
471 cvs_full_ctl_cmd.hdr.opcode =
472 VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION;
473 cvs_full_ctl_cmd.cvs_session.direction = 2;
474
475 cvs_full_ctl_cmd.cvs_session.enc_media_type =
476 v->mvs_info.media_type;
477 cvs_full_ctl_cmd.cvs_session.dec_media_type =
478 v->mvs_info.media_type;
479 cvs_full_ctl_cmd.cvs_session.network_id =
480 v->mvs_info.network_type;
481 strncpy(cvs_full_ctl_cmd.cvs_session.name,
482 "default voip", SESSION_NAME_LEN);
483
484 v->cvs_state = CMD_STATUS_FAIL;
485
486 ret = apr_send_pkt(apr_cvs,
487 (uint32_t *) &cvs_full_ctl_cmd);
488
489 if (ret < 0) {
490 pr_err("%s: Err %d sending CREATE_FULL_CTRL\n",
491 __func__, ret);
492 goto fail;
493 }
494 ret = wait_event_timeout(v->cvs_wait,
495 (v->cvs_state == CMD_STATUS_SUCCESS),
496 msecs_to_jiffies(TIMEOUT_MS));
497 if (!ret) {
498 pr_err("%s: wait_event timeout\n", __func__);
499 goto fail;
500 }
501
502 /* Get the created CVS handle. */
503 cvs_handle = voice_get_cvs_handle(v);
504
505 /* Attach MVM to CVS. */
506 pr_info("%s: Attach MVM to stream\n", __func__);
507
508 attach_stream_cmd.hdr.hdr_field =
509 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
510 APR_HDR_LEN(APR_HDR_SIZE),
511 APR_PKT_VER);
512
513 attach_stream_cmd.hdr.pkt_size =
514 APR_PKT_SIZE(APR_HDR_SIZE,
515 sizeof(attach_stream_cmd) - APR_HDR_SIZE);
516 attach_stream_cmd.hdr.src_port = 0;
517 attach_stream_cmd.hdr.dest_port = mvm_handle;
518 attach_stream_cmd.hdr.token = 0;
519 attach_stream_cmd.hdr.opcode =
520 VSS_IMVM_CMD_ATTACH_STREAM;
521 attach_stream_cmd.attach_stream.handle = cvs_handle;
522
523 v->mvm_state = CMD_STATUS_FAIL;
524 ret = apr_send_pkt(apr_mvm,
525 (uint32_t *) &attach_stream_cmd);
526 if (ret < 0) {
527 pr_err("%s: Error %d sending ATTACH_STREAM\n",
528 __func__, ret);
529 goto fail;
530 }
531 ret = wait_event_timeout(v->mvm_wait,
532 (v->mvm_state == CMD_STATUS_SUCCESS),
533 msecs_to_jiffies(TIMEOUT_MS));
534 if (!ret) {
535 pr_err("%s: wait_event timeout\n", __func__);
536 goto fail;
537 }
538 }
539 }
540
541 return 0;
542
543fail:
544 apr_deregister(apr_mvm);
545 apr_mvm = NULL;
546 voice_set_apr_mvm(v, apr_mvm);
547
548 apr_deregister(apr_cvs);
549 apr_cvs = NULL;
550 voice_set_apr_cvs(v, apr_cvs);
551
552 apr_deregister(apr_cvp);
553 apr_cvp = NULL;
554 voice_set_apr_cvp(v, apr_cvp);
555
556 cvp_handle = 0;
557 voice_set_cvp_handle(v, cvp_handle);
558
559 cvs_handle = 0;
560 voice_set_cvs_handle(v, cvs_handle);
561
562 return -EINVAL;
563}
564
565static int voice_destroy_mvm_cvs_session(struct voice_data *v)
566{
567 int ret = 0;
568 struct mvm_detach_stream_cmd detach_stream;
569 struct apr_hdr mvm_destroy;
570 struct apr_hdr cvs_destroy;
571 void *apr_mvm = voice_get_apr_mvm(v);
572 void *apr_cvs = voice_get_apr_cvs(v);
573 u16 mvm_handle = voice_get_mvm_handle(v);
574 u16 cvs_handle = voice_get_cvs_handle(v);
575
576 /* MVM, CVS sessions are destroyed only for Full control sessions. */
577 if (v->voc_path == VOC_PATH_FULL) {
578 pr_info("%s: MVM detach stream\n", __func__);
579
580 /* Detach voice stream. */
581 detach_stream.hdr.hdr_field =
582 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
583 APR_HDR_LEN(APR_HDR_SIZE),
584 APR_PKT_VER);
585 detach_stream.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
586 sizeof(detach_stream) - APR_HDR_SIZE);
587 detach_stream.hdr.src_port = 0;
588 detach_stream.hdr.dest_port = mvm_handle;
589 detach_stream.hdr.token = 0;
590 detach_stream.hdr.opcode = VSS_IMVM_CMD_DETACH_STREAM;
591 detach_stream.detach_stream.handle = cvs_handle;
592
593 v->mvm_state = CMD_STATUS_FAIL;
594
595 ret = apr_send_pkt(apr_mvm, (uint32_t *) &detach_stream);
596 if (ret < 0) {
597 pr_err("%s: Error %d sending DETACH_STREAM\n",
598 __func__, ret);
599
600 goto fail;
601 }
602
603 ret = wait_event_timeout(v->mvm_wait,
604 (v->mvm_state == CMD_STATUS_SUCCESS),
605 msecs_to_jiffies(TIMEOUT_MS));
606 if (!ret) {
607 pr_err("%s: wait event timeout\n", __func__);
608 goto fail;
609 }
610
611 /* Destroy CVS. */
612 pr_info("%s: CVS destroy session\n", __func__);
613
614 cvs_destroy.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
615 APR_HDR_LEN(APR_HDR_SIZE),
616 APR_PKT_VER);
617 cvs_destroy.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
618 sizeof(cvs_destroy) - APR_HDR_SIZE);
619 cvs_destroy.src_port = 0;
620 cvs_destroy.dest_port = cvs_handle;
621 cvs_destroy.token = 0;
622 cvs_destroy.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION;
623
624 v->cvs_state = CMD_STATUS_FAIL;
625
626 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_destroy);
627 if (ret < 0) {
628 pr_err("%s: Error %d sending CVS DESTROY\n",
629 __func__, ret);
630
631 goto fail;
632 }
633
634 ret = wait_event_timeout(v->cvs_wait,
635 (v->cvs_state == CMD_STATUS_SUCCESS),
636 msecs_to_jiffies(TIMEOUT_MS));
637 if (!ret) {
638 pr_err("%s: wait event timeout\n", __func__);
639
640 goto fail;
641 }
642 cvs_handle = 0;
643 voice_set_cvs_handle(v, cvs_handle);
644
645 /* Destroy MVM. */
646 pr_info("%s: MVM destroy session\n", __func__);
647
648 mvm_destroy.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
649 APR_HDR_LEN(APR_HDR_SIZE),
650 APR_PKT_VER);
651 mvm_destroy.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
652 sizeof(mvm_destroy) - APR_HDR_SIZE);
653 mvm_destroy.src_port = 0;
654 mvm_destroy.dest_port = mvm_handle;
655 mvm_destroy.token = 0;
656 mvm_destroy.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION;
657
658 v->mvm_state = CMD_STATUS_FAIL;
659
660 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_destroy);
661 if (ret < 0) {
662 pr_err("%s: Error %d sending MVM DESTROY\n",
663 __func__, ret);
664
665 goto fail;
666 }
667
668 ret = wait_event_timeout(v->mvm_wait,
669 (v->mvm_state == CMD_STATUS_SUCCESS),
670 msecs_to_jiffies(TIMEOUT_MS));
671 if (!ret) {
672 pr_err("%s: wait event timeout\n", __func__);
673
674 goto fail;
675 }
676 mvm_handle = 0;
677 voice_set_mvm_handle(v, mvm_handle);
678 }
679
680fail:
681 return 0;
682}
683
684static int voice_send_tty_mode_to_modem(struct voice_data *v)
685{
686 struct msm_snddev_info *dev_tx_info;
687 struct msm_snddev_info *dev_rx_info;
688 int tty_mode = 0;
689 int ret = 0;
690 struct mvm_set_tty_mode_cmd mvm_tty_mode_cmd;
691 void *apr_mvm = voice_get_apr_mvm(v);
692 u16 mvm_handle = voice_get_mvm_handle(v);
693
694 dev_rx_info = audio_dev_ctrl_find_dev(v->dev_rx.dev_id);
695 if (IS_ERR(dev_rx_info)) {
696 pr_err("bad dev_id %d\n", v->dev_rx.dev_id);
697 goto done;
698 }
699
700 dev_tx_info = audio_dev_ctrl_find_dev(v->dev_tx.dev_id);
701 if (IS_ERR(dev_tx_info)) {
702 pr_err("bad dev_id %d\n", v->dev_tx.dev_id);
703 goto done;
704 }
705
706 if ((dev_rx_info->capability & SNDDEV_CAP_TTY) &&
707 (dev_tx_info->capability & SNDDEV_CAP_TTY))
708 tty_mode = 3; /* FULL */
709 else if (!(dev_tx_info->capability & SNDDEV_CAP_TTY) &&
710 (dev_rx_info->capability & SNDDEV_CAP_TTY))
711 tty_mode = 2; /* VCO */
712 else if ((dev_tx_info->capability & SNDDEV_CAP_TTY) &&
713 !(dev_rx_info->capability & SNDDEV_CAP_TTY))
714 tty_mode = 1; /* HCO */
715
716 if (tty_mode) {
717 /* send tty mode cmd to mvm */
718 mvm_tty_mode_cmd.hdr.hdr_field = APR_HDR_FIELD(
719 APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE),
720 APR_PKT_VER);
721 mvm_tty_mode_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
722 sizeof(mvm_tty_mode_cmd) - APR_HDR_SIZE);
723 pr_debug("pkt size = %d\n", mvm_tty_mode_cmd.hdr.pkt_size);
724 mvm_tty_mode_cmd.hdr.src_port = 0;
725 mvm_tty_mode_cmd.hdr.dest_port = mvm_handle;
726 mvm_tty_mode_cmd.hdr.token = 0;
727 mvm_tty_mode_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_TTY_MODE;
728 mvm_tty_mode_cmd.tty_mode.mode = tty_mode;
729 pr_info("tty mode =%d\n", mvm_tty_mode_cmd.tty_mode.mode);
730
731 v->mvm_state = CMD_STATUS_FAIL;
732 pr_info("%s: MVM set tty\n", __func__);
733 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_tty_mode_cmd);
734 if (ret < 0) {
735 pr_err("Fail: sending VSS_ISTREAM_CMD_SET_TTY_MODE\n");
736 goto done;
737 }
738 ret = wait_event_timeout(v->mvm_wait,
739 (v->mvm_state == CMD_STATUS_SUCCESS),
740 msecs_to_jiffies(TIMEOUT_MS));
741 if (!ret) {
742 pr_err("%s: wait_event timeout\n", __func__);
743 goto done;
744 }
745 }
746 return 0;
747done:
748 return -EINVAL;
749}
750
751static int voice_send_cvs_cal_to_modem(struct voice_data *v)
752{
753 struct apr_hdr cvs_cal_cmd_hdr;
754 uint32_t *cmd_buf;
755 struct acdb_cal_data cal_data;
756 struct acdb_cal_block *cal_blk;
757 int32_t cal_size_per_network;
758 uint32_t *cal_data_per_network;
759 int index = 0;
760 int ret = 0;
761 void *apr_cvs = voice_get_apr_cvs(v);
762 u16 cvs_handle = voice_get_cvs_handle(v);
763
764 /* fill the header */
765 cvs_cal_cmd_hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
766 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
767 cvs_cal_cmd_hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
768 sizeof(cvs_cal_cmd_hdr) - APR_HDR_SIZE);
769 cvs_cal_cmd_hdr.src_port = 0;
770 cvs_cal_cmd_hdr.dest_port = cvs_handle;
771 cvs_cal_cmd_hdr.token = 0;
772 cvs_cal_cmd_hdr.opcode =
773 VSS_ISTREAM_CMD_CACHE_CALIBRATION_DATA;
774
775 pr_debug("voice_send_cvs_cal_to_modem\n");
776 /* get the cvs cal data */
777 get_vocstrm_cal(&cal_data);
778 if (cal_data.num_cal_blocks == 0) {
779 pr_err("%s: No calibration data to send!\n", __func__);
780 goto done;
781 }
782
783 /* send cvs cal to modem */
784 cmd_buf = kzalloc((sizeof(struct apr_hdr) + BUFFER_PAYLOAD_SIZE),
785 GFP_KERNEL);
786 if (!cmd_buf) {
787 pr_err("No memory is allocated.\n");
788 return -ENOMEM;
789 }
790 pr_debug("----- num_cal_blocks=%d\n", (s32)cal_data.num_cal_blocks);
791 cal_blk = cal_data.cal_blocks;
792 pr_debug("cal_blk =%x\n", (uint32_t)cal_data.cal_blocks);
793
794 for (; index < cal_data.num_cal_blocks; index++) {
795 cal_size_per_network = cal_blk[index].cal_size;
796 pr_debug(" cal size =%d\n", cal_size_per_network);
797 if (cal_size_per_network >= BUFFER_PAYLOAD_SIZE)
798 pr_err("Cal size is too big\n");
799 cal_data_per_network = (u32 *)cal_blk[index].cal_kvaddr;
800 pr_debug(" cal data=%x\n", (uint32_t)cal_data_per_network);
801 cvs_cal_cmd_hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
802 cal_size_per_network);
803 pr_debug("header size =%d, pkt_size =%d\n",
804 APR_HDR_SIZE, cvs_cal_cmd_hdr.pkt_size);
805 memcpy(cmd_buf, &cvs_cal_cmd_hdr, APR_HDR_SIZE);
806 memcpy(cmd_buf + (APR_HDR_SIZE / sizeof(uint32_t)),
807 cal_data_per_network, cal_size_per_network);
808 pr_debug("send cvs cal: index =%d\n", index);
809 v->cvs_state = CMD_STATUS_FAIL;
810 ret = apr_send_pkt(apr_cvs, cmd_buf);
811 if (ret < 0) {
812 pr_err("Fail: sending cvs cal, idx=%d\n", index);
813 continue;
814 }
815 ret = wait_event_timeout(v->cvs_wait,
816 (v->cvs_state == CMD_STATUS_SUCCESS),
817 msecs_to_jiffies(TIMEOUT_MS));
818 if (!ret) {
819 pr_err("%s: wait_event timeout\n", __func__);
820 return -EINVAL;
821 }
822 }
823 kfree(cmd_buf);
824done:
825 return 0;
826}
827
828static int voice_send_cvp_cal_to_modem(struct voice_data *v)
829{
830 struct apr_hdr cvp_cal_cmd_hdr;
831 uint32_t *cmd_buf;
832 struct acdb_cal_data cal_data;
833 struct acdb_cal_block *cal_blk;
834 int32_t cal_size_per_network;
835 uint32_t *cal_data_per_network;
836 int index = 0;
837 int ret = 0;
838 void *apr_cvp = voice_get_apr_cvp(v);
839 u16 cvp_handle = voice_get_cvp_handle(v);
840
841
842 /* fill the header */
843 cvp_cal_cmd_hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
844 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
845 cvp_cal_cmd_hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
846 sizeof(cvp_cal_cmd_hdr) - APR_HDR_SIZE);
847 cvp_cal_cmd_hdr.src_port = 0;
848 cvp_cal_cmd_hdr.dest_port = cvp_handle;
849 cvp_cal_cmd_hdr.token = 0;
850 cvp_cal_cmd_hdr.opcode =
851 VSS_IVOCPROC_CMD_CACHE_CALIBRATION_DATA;
852
853 /* get cal data */
854 get_vocproc_cal(&cal_data);
855 if (cal_data.num_cal_blocks == 0) {
856 pr_err("%s: No calibration data to send!\n", __func__);
857 goto done;
858 }
859
860 /* send cal to modem */
861 cmd_buf = kzalloc((sizeof(struct apr_hdr) + BUFFER_PAYLOAD_SIZE),
862 GFP_KERNEL);
863 if (!cmd_buf) {
864 pr_err("No memory is allocated.\n");
865 return -ENOMEM;
866 }
867 pr_debug("----- num_cal_blocks=%d\n", (s32)cal_data.num_cal_blocks);
868 cal_blk = cal_data.cal_blocks;
869 pr_debug(" cal_blk =%x\n", (uint32_t)cal_data.cal_blocks);
870
871 for (; index < cal_data.num_cal_blocks; index++) {
872 cal_size_per_network = cal_blk[index].cal_size;
873 if (cal_size_per_network >= BUFFER_PAYLOAD_SIZE)
874 pr_err("Cal size is too big\n");
875 pr_debug(" cal size =%d\n", cal_size_per_network);
876 cal_data_per_network = (u32 *)cal_blk[index].cal_kvaddr;
877 pr_debug(" cal data=%x\n", (uint32_t)cal_data_per_network);
878
879 cvp_cal_cmd_hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
880 cal_size_per_network);
881 memcpy(cmd_buf, &cvp_cal_cmd_hdr, APR_HDR_SIZE);
882 memcpy(cmd_buf + (APR_HDR_SIZE / sizeof(*cmd_buf)),
883 cal_data_per_network, cal_size_per_network);
884 pr_debug("Send cvp cal\n");
885 v->cvp_state = CMD_STATUS_FAIL;
886 pr_info("%s: CVP calib\n", __func__);
887 ret = apr_send_pkt(apr_cvp, cmd_buf);
888 if (ret < 0) {
889 pr_err("Fail: sending cvp cal, idx=%d\n", index);
890 continue;
891 }
892 ret = wait_event_timeout(v->cvp_wait,
893 (v->cvp_state == CMD_STATUS_SUCCESS),
894 msecs_to_jiffies(TIMEOUT_MS));
895 if (!ret) {
896 pr_err("%s: wait_event timeout\n", __func__);
897 return -EINVAL;
898 }
899 }
900 kfree(cmd_buf);
901done:
902 return 0;
903}
904
905static int voice_send_cvp_vol_tbl_to_modem(struct voice_data *v)
906{
907 struct apr_hdr cvp_vol_cal_cmd_hdr;
908 uint32_t *cmd_buf;
909 struct acdb_cal_data cal_data;
910 struct acdb_cal_block *cal_blk;
911 int32_t cal_size_per_network;
912 uint32_t *cal_data_per_network;
913 int index = 0;
914 int ret = 0;
915 void *apr_cvp = voice_get_apr_cvp(v);
916 u16 cvp_handle = voice_get_cvp_handle(v);
917
918
919 /* fill the header */
920 cvp_vol_cal_cmd_hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
921 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
922 cvp_vol_cal_cmd_hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
923 sizeof(cvp_vol_cal_cmd_hdr) - APR_HDR_SIZE);
924 cvp_vol_cal_cmd_hdr.src_port = 0;
925 cvp_vol_cal_cmd_hdr.dest_port = cvp_handle;
926 cvp_vol_cal_cmd_hdr.token = 0;
927 cvp_vol_cal_cmd_hdr.opcode =
928 VSS_IVOCPROC_CMD_CACHE_VOLUME_CALIBRATION_TABLE;
929
930 /* get cal data */
931 get_vocvol_cal(&cal_data);
932 if (cal_data.num_cal_blocks == 0) {
933 pr_err("%s: No calibration data to send!\n", __func__);
934 goto done;
935 }
936
937 /* send cal to modem */
938 cmd_buf = kzalloc((sizeof(struct apr_hdr) + BUFFER_PAYLOAD_SIZE),
939 GFP_KERNEL);
940 if (!cmd_buf) {
941 pr_err("No memory is allocated.\n");
942 return -ENOMEM;
943 }
944 pr_debug("----- num_cal_blocks=%d\n", (s32)cal_data.num_cal_blocks);
945 cal_blk = cal_data.cal_blocks;
946 pr_debug("Cal_blk =%x\n", (uint32_t)cal_data.cal_blocks);
947
948 for (; index < cal_data.num_cal_blocks; index++) {
949 cal_size_per_network = cal_blk[index].cal_size;
950 cal_data_per_network = (u32 *)cal_blk[index].cal_kvaddr;
951 pr_debug("Cal size =%d, index=%d\n", cal_size_per_network,
952 index);
953 pr_debug("Cal data=%x\n", (uint32_t)cal_data_per_network);
954 cvp_vol_cal_cmd_hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
955 cal_size_per_network);
956 memcpy(cmd_buf, &cvp_vol_cal_cmd_hdr, APR_HDR_SIZE);
957 memcpy(cmd_buf + (APR_HDR_SIZE / sizeof(uint32_t)),
958 cal_data_per_network, cal_size_per_network);
959 pr_debug("Send vol table\n");
960
961 v->cvp_state = CMD_STATUS_FAIL;
962 ret = apr_send_pkt(apr_cvp, cmd_buf);
963 if (ret < 0) {
964 pr_err("Fail: sending cvp vol cal, idx=%d\n", index);
965 continue;
966 }
967 ret = wait_event_timeout(v->cvp_wait,
968 (v->cvp_state == CMD_STATUS_SUCCESS),
969 msecs_to_jiffies(TIMEOUT_MS));
970 if (!ret) {
971 pr_err("%s: wait_event timeout\n", __func__);
972 return -EINVAL;
973 }
974 }
975 kfree(cmd_buf);
976done:
977 return 0;
978}
979
980static int voice_set_dtx(struct voice_data *v)
981{
982 int ret = 0;
983 void *apr_cvs = voice_get_apr_cvs(v);
984 u16 cvs_handle = voice_get_cvs_handle(v);
985
986 /* Set DTX */
987 struct cvs_set_enc_dtx_mode_cmd cvs_set_dtx = {
988 .hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
989 APR_HDR_LEN(APR_HDR_SIZE),
990 APR_PKT_VER),
991 .hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
992 sizeof(cvs_set_dtx) - APR_HDR_SIZE),
993 .hdr.src_port = 0,
994 .hdr.dest_port = cvs_handle,
995 .hdr.token = 0,
996 .hdr.opcode = VSS_ISTREAM_CMD_SET_ENC_DTX_MODE,
997 .dtx_mode.enable = v->mvs_info.dtx_mode,
998 };
999
1000 pr_debug("%s: Setting DTX %d\n", __func__, v->mvs_info.dtx_mode);
1001
1002 v->cvs_state = CMD_STATUS_FAIL;
1003
1004 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_dtx);
1005 if (ret < 0) {
1006 pr_err("%s: Error %d sending SET_DTX\n", __func__, ret);
1007
1008 goto done;
1009 }
1010
1011 ret = wait_event_timeout(v->cvs_wait,
1012 (v->cvs_state == CMD_STATUS_SUCCESS),
1013 msecs_to_jiffies(TIMEOUT_MS));
1014 if (!ret) {
1015 pr_err("%s: wait_event timeout\n", __func__);
1016
1017 ret = -EINVAL;
1018 }
1019
1020done:
1021 return ret;
1022}
1023
1024static int voice_config_cvs_vocoder(struct voice_data *v)
1025{
1026 int ret = 0;
1027 void *apr_cvs = voice_get_apr_cvs(v);
1028 u16 cvs_handle = voice_get_cvs_handle(v);
1029
1030 /* Set media type. */
1031 struct cvs_set_media_type_cmd cvs_set_media_cmd;
1032
1033 pr_info("%s: Setting media type\n", __func__);
1034
1035 cvs_set_media_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1036 APR_HDR_LEN(APR_HDR_SIZE),
1037 APR_PKT_VER);
1038 cvs_set_media_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1039 sizeof(cvs_set_media_cmd) - APR_HDR_SIZE);
1040 cvs_set_media_cmd.hdr.src_port = 0;
1041 cvs_set_media_cmd.hdr.dest_port = cvs_handle;
1042 cvs_set_media_cmd.hdr.token = 0;
1043 cvs_set_media_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_MEDIA_TYPE;
1044 cvs_set_media_cmd.media_type.tx_media_id = v->mvs_info.media_type;
1045 cvs_set_media_cmd.media_type.rx_media_id = v->mvs_info.media_type;
1046
1047 v->cvs_state = CMD_STATUS_FAIL;
1048
1049 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_media_cmd);
1050 if (ret < 0) {
1051 pr_err("%s: Error %d sending SET_MEDIA_TYPE\n",
1052 __func__, ret);
1053
1054 goto done;
1055 }
1056
1057 ret = wait_event_timeout(v->cvs_wait,
1058 (v->cvs_state == CMD_STATUS_SUCCESS),
1059 msecs_to_jiffies(TIMEOUT_MS));
1060 if (!ret) {
1061 pr_err("%s: wait_event timeout\n", __func__);
1062
1063 ret = -EINVAL;
1064 goto done;
1065 }
1066
1067 /* Set encoder properties. */
1068 switch (v->mvs_info.media_type) {
1069 case VSS_MEDIA_ID_EVRC_MODEM: {
1070 struct cvs_set_cdma_enc_minmax_rate_cmd cvs_set_cdma_rate;
1071
1072 pr_info("%s: Setting EVRC min-max rate\n", __func__);
1073
1074 cvs_set_cdma_rate.hdr.hdr_field =
1075 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1076 APR_HDR_LEN(APR_HDR_SIZE),
1077 APR_PKT_VER);
1078 cvs_set_cdma_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1079 sizeof(cvs_set_cdma_rate) - APR_HDR_SIZE);
1080 cvs_set_cdma_rate.hdr.src_port = 0;
1081 cvs_set_cdma_rate.hdr.dest_port = cvs_handle;
1082 cvs_set_cdma_rate.hdr.token = 0;
1083 cvs_set_cdma_rate.hdr.opcode =
1084 VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE;
1085 cvs_set_cdma_rate.cdma_rate.min_rate = v->mvs_info.rate;
1086 cvs_set_cdma_rate.cdma_rate.max_rate = v->mvs_info.rate;
1087
1088 v->cvs_state = CMD_STATUS_FAIL;
1089
1090 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_cdma_rate);
1091 if (ret < 0) {
1092 pr_err("%s: Error %d sending SET_EVRC_MINMAX_RATE\n",
1093 __func__, ret);
1094
1095 goto done;
1096 }
1097
1098 ret = wait_event_timeout(v->cvs_wait,
1099 (v->cvs_state == CMD_STATUS_SUCCESS),
1100 msecs_to_jiffies(TIMEOUT_MS));
1101 if (!ret) {
1102 pr_err("%s: wait_event timeout\n", __func__);
1103
1104 ret = -EINVAL;
1105 goto done;
1106 }
1107
1108 break;
1109 }
1110
1111 case VSS_MEDIA_ID_AMR_NB_MODEM: {
1112 struct cvs_set_amr_enc_rate_cmd cvs_set_amr_rate;
1113
1114 pr_info("%s: Setting AMR rate\n", __func__);
1115
1116 cvs_set_amr_rate.hdr.hdr_field =
1117 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1118 APR_HDR_LEN(APR_HDR_SIZE),
1119 APR_PKT_VER);
1120 cvs_set_amr_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1121 sizeof(cvs_set_amr_rate) - APR_HDR_SIZE);
1122 cvs_set_amr_rate.hdr.src_port = 0;
1123 cvs_set_amr_rate.hdr.dest_port = cvs_handle;
1124 cvs_set_amr_rate.hdr.token = 0;
1125 cvs_set_amr_rate.hdr.opcode =
1126 VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE;
1127 cvs_set_amr_rate.amr_rate.mode = v->mvs_info.rate;
1128
1129 v->cvs_state = CMD_STATUS_FAIL;
1130
1131 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_amr_rate);
1132 if (ret < 0) {
1133 pr_err("%s: Error %d sending SET_AMR_RATE\n",
1134 __func__, ret);
1135
1136 goto done;
1137 }
1138
1139 ret = wait_event_timeout(v->cvs_wait,
1140 (v->cvs_state == CMD_STATUS_SUCCESS),
1141 msecs_to_jiffies(TIMEOUT_MS));
1142 if (!ret) {
1143 pr_err("%s: wait_event timeout\n", __func__);
1144
1145 ret = -EINVAL;
1146 goto done;
1147 }
1148
1149 ret = voice_set_dtx(v);
1150
1151 break;
1152 }
1153
1154 case VSS_MEDIA_ID_AMR_WB_MODEM: {
1155 struct cvs_set_amrwb_enc_rate_cmd cvs_set_amrwb_rate;
1156
1157 pr_info("%s: Setting AMR WB rate\n", __func__);
1158
1159 cvs_set_amrwb_rate.hdr.hdr_field =
1160 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1161 APR_HDR_LEN(APR_HDR_SIZE),
1162 APR_PKT_VER);
1163 cvs_set_amrwb_rate.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1164 sizeof(cvs_set_amrwb_rate) - APR_HDR_SIZE);
1165 cvs_set_amrwb_rate.hdr.src_port = 0;
1166 cvs_set_amrwb_rate.hdr.dest_port = cvs_handle;
1167 cvs_set_amrwb_rate.hdr.token = 0;
1168 cvs_set_amrwb_rate.hdr.opcode =
1169 VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE;
1170 cvs_set_amrwb_rate.amrwb_rate.mode = v->mvs_info.rate;
1171
1172 v->cvs_state = CMD_STATUS_FAIL;
1173
1174 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_set_amrwb_rate);
1175 if (ret < 0) {
1176 pr_err("%s: Error %d sending SET_AMRWB_RATE\n",
1177 __func__, ret);
1178
1179 goto done;
1180 }
1181
1182 ret = wait_event_timeout(v->cvs_wait,
1183 (v->cvs_state == CMD_STATUS_SUCCESS),
1184 msecs_to_jiffies(TIMEOUT_MS));
1185 if (!ret) {
1186 pr_err("%s: wait_event timeout\n", __func__);
1187
1188 ret = -EINVAL;
1189 goto done;
1190 }
1191
1192 ret = voice_set_dtx(v);
1193
1194 break;
1195 }
1196
1197 case VSS_MEDIA_ID_G729:
1198 case VSS_MEDIA_ID_G711_ALAW:
1199 case VSS_MEDIA_ID_G711_MULAW: {
1200 ret = voice_set_dtx(v);
1201
1202 break;
1203 }
1204
1205 default: {
1206 /* Do nothing. */
1207 }
1208 }
1209
1210done:
1211 return ret;
1212}
1213
1214static int voice_send_start_voice_cmd(struct voice_data *v)
1215{
1216 struct apr_hdr mvm_start_voice_cmd;
1217 int ret = 0;
1218 void *apr_mvm = voice_get_apr_mvm(v);
1219 u16 mvm_handle = voice_get_mvm_handle(v);
1220
1221 mvm_start_voice_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1222 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1223 mvm_start_voice_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1224 sizeof(mvm_start_voice_cmd) - APR_HDR_SIZE);
1225 pr_info("send mvm_start_voice_cmd pkt size = %d\n",
1226 mvm_start_voice_cmd.pkt_size);
1227 mvm_start_voice_cmd.src_port = 0;
1228 mvm_start_voice_cmd.dest_port = mvm_handle;
1229 mvm_start_voice_cmd.token = 0;
1230 mvm_start_voice_cmd.opcode = VSS_IMVM_CMD_START_VOICE;
1231
1232 v->mvm_state = CMD_STATUS_FAIL;
1233 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_start_voice_cmd);
1234 if (ret < 0) {
1235 pr_err("Fail in sending VSS_IMVM_CMD_START_VOICE\n");
1236 goto fail;
1237 }
1238 ret = wait_event_timeout(v->mvm_wait,
1239 (v->mvm_state == CMD_STATUS_SUCCESS),
1240 msecs_to_jiffies(TIMEOUT_MS));
1241 if (!ret) {
1242 pr_err("%s: wait_event timeout\n", __func__);
1243 goto fail;
1244 }
1245
1246 return 0;
1247fail:
1248 return -EINVAL;
1249}
1250
1251static int voice_disable_vocproc(struct voice_data *v)
1252{
1253 struct apr_hdr cvp_disable_cmd;
1254 int ret = 0;
1255 void *apr_cvp = voice_get_apr_cvp(v);
1256 u16 cvp_handle = voice_get_cvp_handle(v);
1257
1258 /* disable vocproc and wait for respose */
1259 cvp_disable_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1260 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1261 cvp_disable_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1262 sizeof(cvp_disable_cmd) - APR_HDR_SIZE);
1263 pr_debug("cvp_disable_cmd pkt size = %d, cvp_handle=%d\n",
1264 cvp_disable_cmd.pkt_size, cvp_handle);
1265 cvp_disable_cmd.src_port = 0;
1266 cvp_disable_cmd.dest_port = cvp_handle;
1267 cvp_disable_cmd.token = 0;
1268 cvp_disable_cmd.opcode = VSS_IVOCPROC_CMD_DISABLE;
1269
1270 v->cvp_state = CMD_STATUS_FAIL;
1271 ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_disable_cmd);
1272 if (ret < 0) {
1273 pr_err("Fail in sending VSS_IVOCPROC_CMD_DISABLE\n");
1274 goto fail;
1275 }
1276 ret = wait_event_timeout(v->cvp_wait,
1277 (v->cvp_state == CMD_STATUS_SUCCESS),
1278 msecs_to_jiffies(TIMEOUT_MS));
1279 if (!ret) {
1280 pr_err("%s: wait_event timeout\n", __func__);
1281 goto fail;
1282 }
1283#ifdef CONFIG_MSM8X60_RTAC
1284 rtac_remove_voice(v);
1285#endif
1286
1287 return 0;
1288fail:
1289 return -EINVAL;
1290}
1291
1292static int voice_set_device(struct voice_data *v)
1293{
1294 struct cvp_set_device_cmd cvp_setdev_cmd;
1295 struct msm_snddev_info *dev_tx_info;
1296 int ret = 0;
1297 void *apr_cvp = voice_get_apr_cvp(v);
1298 u16 cvp_handle = voice_get_cvp_handle(v);
1299
1300
1301 /* set device and wait for response */
1302 cvp_setdev_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1303 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1304 cvp_setdev_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1305 sizeof(cvp_setdev_cmd) - APR_HDR_SIZE);
1306 pr_debug(" send create cvp setdev, pkt size = %d\n",
1307 cvp_setdev_cmd.hdr.pkt_size);
1308 cvp_setdev_cmd.hdr.src_port = 0;
1309 cvp_setdev_cmd.hdr.dest_port = cvp_handle;
1310 cvp_setdev_cmd.hdr.token = 0;
1311 cvp_setdev_cmd.hdr.opcode = VSS_IVOCPROC_CMD_SET_DEVICE;
1312
1313 dev_tx_info = audio_dev_ctrl_find_dev(v->dev_tx.dev_id);
1314 if (IS_ERR(dev_tx_info)) {
1315 pr_err("bad dev_id %d\n", v->dev_tx.dev_id);
1316 goto fail;
1317 }
1318
1319 cvp_setdev_cmd.cvp_set_device.tx_topology_id =
1320 get_voice_tx_topology();
1321 if (cvp_setdev_cmd.cvp_set_device.tx_topology_id == 0) {
1322 if (dev_tx_info->channel_mode > 1)
1323 cvp_setdev_cmd.cvp_set_device.tx_topology_id =
1324 VSS_IVOCPROC_TOPOLOGY_ID_TX_DM_FLUENCE;
1325 else
1326 cvp_setdev_cmd.cvp_set_device.tx_topology_id =
1327 VSS_IVOCPROC_TOPOLOGY_ID_TX_SM_ECNS;
1328 }
1329
1330 /* Use default topology if invalid value in ACDB */
1331 cvp_setdev_cmd.cvp_set_device.rx_topology_id =
1332 get_voice_rx_topology();
1333 if (cvp_setdev_cmd.cvp_set_device.rx_topology_id == 0)
1334 cvp_setdev_cmd.cvp_set_device.rx_topology_id =
1335 VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT;
1336 cvp_setdev_cmd.cvp_set_device.tx_port_id = v->dev_tx.dev_port_id;
1337 cvp_setdev_cmd.cvp_set_device.rx_port_id = v->dev_rx.dev_port_id;
1338 pr_info("topology=%d , tx_port_id=%d, rx_port_id=%d\n",
1339 cvp_setdev_cmd.cvp_set_device.tx_topology_id,
1340 cvp_setdev_cmd.cvp_set_device.tx_port_id,
1341 cvp_setdev_cmd.cvp_set_device.rx_port_id);
1342
1343 v->cvp_state = CMD_STATUS_FAIL;
1344 ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_setdev_cmd);
1345 if (ret < 0) {
1346 pr_err("Fail in sending VOCPROC_FULL_CONTROL_SESSION\n");
1347 goto fail;
1348 }
1349 pr_debug("wait for cvp create session event\n");
1350 ret = wait_event_timeout(v->cvp_wait,
1351 (v->cvp_state == CMD_STATUS_SUCCESS),
1352 msecs_to_jiffies(TIMEOUT_MS));
1353 if (!ret) {
1354 pr_err("%s: wait_event timeout\n", __func__);
1355 goto fail;
1356 }
1357
1358 /* send cvs cal */
1359 voice_send_cvs_cal_to_modem(v);
1360
1361 /* send cvp cal */
1362 voice_send_cvp_cal_to_modem(v);
1363
1364 /* send cvp vol table cal */
1365 voice_send_cvp_vol_tbl_to_modem(v);
1366
1367 /* enable vocproc and wait for respose */
1368 voice_send_enable_vocproc_cmd(v);
1369
1370 /* send tty mode if tty device is used */
1371 voice_send_tty_mode_to_modem(v);
1372
1373 if (v->voc_path == VOC_PATH_FULL)
1374 voice_send_netid_timing_cmd(v);
1375
1376#ifdef CONFIG_MSM8X60_RTAC
1377 rtac_add_voice(v);
1378#endif
1379
1380 return 0;
1381fail:
1382 return -EINVAL;
1383}
1384
1385static int voice_send_stop_voice_cmd(struct voice_data *v)
1386{
1387 struct apr_hdr mvm_stop_voice_cmd;
1388 int ret = 0;
1389 void *apr_mvm = voice_get_apr_mvm(v);
1390 u16 mvm_handle = voice_get_mvm_handle(v);
1391
1392 mvm_stop_voice_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1393 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1394 mvm_stop_voice_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1395 sizeof(mvm_stop_voice_cmd) - APR_HDR_SIZE);
1396 pr_info("send mvm_stop_voice_cmd pkt size = %d\n",
1397 mvm_stop_voice_cmd.pkt_size);
1398 mvm_stop_voice_cmd.src_port = 0;
1399 mvm_stop_voice_cmd.dest_port = mvm_handle;
1400 mvm_stop_voice_cmd.token = 0;
1401 mvm_stop_voice_cmd.opcode = VSS_IMVM_CMD_STOP_VOICE;
1402
1403 v->mvm_state = CMD_STATUS_FAIL;
1404 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_stop_voice_cmd);
1405 if (ret < 0) {
1406 pr_err("Fail in sending VSS_IMVM_CMD_STOP_VOICE\n");
1407 goto fail;
1408 }
1409 ret = wait_event_timeout(v->mvm_wait,
1410 (v->mvm_state == CMD_STATUS_SUCCESS),
1411 msecs_to_jiffies(TIMEOUT_MS));
1412 if (!ret) {
1413 pr_err("%s: wait_event timeout\n", __func__);
1414 goto fail;
1415 }
1416
1417 return 0;
1418fail:
1419 return -EINVAL;
1420}
1421
1422static int voice_setup_modem_voice(struct voice_data *v)
1423{
1424 struct cvp_create_full_ctl_session_cmd cvp_session_cmd;
1425 int ret = 0;
1426 struct msm_snddev_info *dev_tx_info;
1427 void *apr_cvp = voice_get_apr_cvp(v);
1428
1429 /* create cvp session and wait for response */
1430 cvp_session_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1431 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1432 cvp_session_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1433 sizeof(cvp_session_cmd) - APR_HDR_SIZE);
1434 pr_info(" send create cvp session, pkt size = %d\n",
1435 cvp_session_cmd.hdr.pkt_size);
1436 cvp_session_cmd.hdr.src_port = 0;
1437 cvp_session_cmd.hdr.dest_port = 0;
1438 cvp_session_cmd.hdr.token = 0;
1439 cvp_session_cmd.hdr.opcode =
1440 VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION;
1441
1442 dev_tx_info = audio_dev_ctrl_find_dev(v->dev_tx.dev_id);
1443 if (IS_ERR(dev_tx_info)) {
1444 pr_err("bad dev_id %d\n", v->dev_tx.dev_id);
1445 goto fail;
1446 }
1447
1448 /* Use default topology if invalid value in ACDB */
1449 cvp_session_cmd.cvp_session.tx_topology_id =
1450 get_voice_tx_topology();
1451 if (cvp_session_cmd.cvp_session.tx_topology_id == 0) {
1452 if (dev_tx_info->channel_mode > 1)
1453 cvp_session_cmd.cvp_session.tx_topology_id =
1454 VSS_IVOCPROC_TOPOLOGY_ID_TX_DM_FLUENCE;
1455 else
1456 cvp_session_cmd.cvp_session.tx_topology_id =
1457 VSS_IVOCPROC_TOPOLOGY_ID_TX_SM_ECNS;
1458 }
1459
1460 cvp_session_cmd.cvp_session.rx_topology_id =
1461 get_voice_rx_topology();
1462 if (cvp_session_cmd.cvp_session.rx_topology_id == 0)
1463 cvp_session_cmd.cvp_session.rx_topology_id =
1464 VSS_IVOCPROC_TOPOLOGY_ID_RX_DEFAULT;
1465
1466 cvp_session_cmd.cvp_session.direction = 2; /*tx and rx*/
1467 cvp_session_cmd.cvp_session.network_id = VSS_NETWORK_ID_DEFAULT;
1468 cvp_session_cmd.cvp_session.tx_port_id = v->dev_tx.dev_port_id;
1469 cvp_session_cmd.cvp_session.rx_port_id = v->dev_rx.dev_port_id;
1470 pr_info("topology=%d net_id=%d, dir=%d tx_port_id=%d, rx_port_id=%d\n",
1471 cvp_session_cmd.cvp_session.tx_topology_id,
1472 cvp_session_cmd.cvp_session.network_id,
1473 cvp_session_cmd.cvp_session.direction,
1474 cvp_session_cmd.cvp_session.tx_port_id,
1475 cvp_session_cmd.cvp_session.rx_port_id);
1476
1477 v->cvp_state = CMD_STATUS_FAIL;
1478 ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_session_cmd);
1479 if (ret < 0) {
1480 pr_err("Fail in sending VOCPROC_FULL_CONTROL_SESSION\n");
1481 goto fail;
1482 }
1483 pr_debug("wait for cvp create session event\n");
1484 ret = wait_event_timeout(v->cvp_wait,
1485 (v->cvp_state == CMD_STATUS_SUCCESS),
1486 msecs_to_jiffies(TIMEOUT_MS));
1487 if (!ret) {
1488 pr_err("%s: wait_event timeout\n", __func__);
1489 goto fail;
1490 }
1491
1492 /* send cvs cal */
1493 voice_send_cvs_cal_to_modem(v);
1494
1495 /* send cvp cal */
1496 voice_send_cvp_cal_to_modem(v);
1497
1498 /* send cvp vol table cal */
1499 voice_send_cvp_vol_tbl_to_modem(v);
1500
1501 return 0;
1502
1503fail:
1504 return -EINVAL;
1505}
1506
1507static int voice_send_enable_vocproc_cmd(struct voice_data *v)
1508{
1509 int ret = 0;
1510 struct apr_hdr cvp_enable_cmd;
1511
1512 u16 cvp_handle = voice_get_cvp_handle(v);
1513 void *apr_cvp = voice_get_apr_cvp(v);
1514
1515 /* enable vocproc and wait for respose */
1516 cvp_enable_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1517 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1518 cvp_enable_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1519 sizeof(cvp_enable_cmd) - APR_HDR_SIZE);
1520 pr_debug("cvp_enable_cmd pkt size = %d, cvp_handle=%d\n",
1521 cvp_enable_cmd.pkt_size, cvp_handle);
1522 cvp_enable_cmd.src_port = 0;
1523 cvp_enable_cmd.dest_port = cvp_handle;
1524 cvp_enable_cmd.token = 0;
1525 cvp_enable_cmd.opcode = VSS_IVOCPROC_CMD_ENABLE;
1526
1527 v->cvp_state = CMD_STATUS_FAIL;
1528 ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_enable_cmd);
1529 if (ret < 0) {
1530 pr_err("Fail in sending VSS_IVOCPROC_CMD_ENABLE\n");
1531 goto fail;
1532 }
1533 ret = wait_event_timeout(v->cvp_wait,
1534 (v->cvp_state == CMD_STATUS_SUCCESS),
1535 msecs_to_jiffies(TIMEOUT_MS));
1536 if (!ret) {
1537 pr_err("%s: wait_event timeout\n", __func__);
1538 goto fail;
1539 }
1540
1541 return 0;
1542fail:
1543 return -EINVAL;
1544}
1545
1546static int voice_send_netid_timing_cmd(struct voice_data *v)
1547{
1548 int ret = 0;
1549 void *apr_mvm = voice_get_apr_mvm(v);
1550 struct mvm_set_network_cmd mvm_set_network;
1551 struct mvm_set_voice_timing_cmd mvm_set_voice_timing;
1552 u16 mvm_handle = voice_get_mvm_handle(v);
1553
1554 ret = voice_config_cvs_vocoder(v);
1555 if (ret < 0) {
1556 pr_err("%s: Error %d configuring CVS voc",
1557 __func__, ret);
1558 goto fail;
1559 }
1560 /* Set network ID. */
1561 pr_debug("%s: Setting network ID\n", __func__);
1562
1563 mvm_set_network.hdr.hdr_field =
1564 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1565 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1566 mvm_set_network.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1567 sizeof(mvm_set_network) - APR_HDR_SIZE);
1568 mvm_set_network.hdr.src_port = 0;
1569 mvm_set_network.hdr.dest_port = mvm_handle;
1570 mvm_set_network.hdr.token = 0;
1571 mvm_set_network.hdr.opcode = VSS_ICOMMON_CMD_SET_NETWORK;
1572 mvm_set_network.network.network_id = v->mvs_info.network_type;
1573
1574 v->mvm_state = CMD_STATUS_FAIL;
1575 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_network);
1576 if (ret < 0) {
1577 pr_err("%s: Error %d sending SET_NETWORK\n", __func__, ret);
1578 goto fail;
1579 }
1580
1581 ret = wait_event_timeout(v->mvm_wait,
1582 (v->mvm_state == CMD_STATUS_SUCCESS),
1583 msecs_to_jiffies(TIMEOUT_MS));
1584 if (!ret) {
1585 pr_err("%s: wait_event timeout\n", __func__);
1586 goto fail;
1587 }
1588
1589 /* Set voice timing. */
1590 pr_debug("%s: Setting voice timing\n", __func__);
1591
1592 mvm_set_voice_timing.hdr.hdr_field =
1593 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1594 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1595 mvm_set_voice_timing.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1596 sizeof(mvm_set_voice_timing) - APR_HDR_SIZE);
1597 mvm_set_voice_timing.hdr.src_port = 0;
1598 mvm_set_voice_timing.hdr.dest_port = mvm_handle;
1599 mvm_set_voice_timing.hdr.token = 0;
1600 mvm_set_voice_timing.hdr.opcode =
1601 VSS_ICOMMON_CMD_SET_VOICE_TIMING;
1602 mvm_set_voice_timing.timing.mode = 0;
1603 mvm_set_voice_timing.timing.enc_offset = 8000;
1604 mvm_set_voice_timing.timing.dec_req_offset = 3300;
1605 mvm_set_voice_timing.timing.dec_offset = 8300;
1606
1607 v->mvm_state = CMD_STATUS_FAIL;
1608
1609 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_set_voice_timing);
1610 if (ret < 0) {
1611 pr_err("%s: Error %d sending SET_TIMING\n", __func__, ret);
1612 goto fail;
1613 }
1614
1615 ret = wait_event_timeout(v->mvm_wait,
1616 (v->mvm_state == CMD_STATUS_SUCCESS),
1617 msecs_to_jiffies(TIMEOUT_MS));
1618 if (!ret) {
1619 pr_err("%s: wait_event timeout\n", __func__);
1620 goto fail;
1621 }
1622
1623 return 0;
1624fail:
1625 return -EINVAL;
1626}
1627
1628static int voice_attach_vocproc(struct voice_data *v)
1629{
1630 int ret = 0;
1631 struct mvm_attach_vocproc_cmd mvm_a_vocproc_cmd;
1632 void *apr_mvm = voice_get_apr_mvm(v);
1633 u16 mvm_handle = voice_get_mvm_handle(v);
1634 u16 cvp_handle = voice_get_cvp_handle(v);
1635
1636 /* send enable vocproc */
1637 voice_send_enable_vocproc_cmd(v);
1638
1639 /* attach vocproc and wait for response */
1640 mvm_a_vocproc_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1641 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1642 mvm_a_vocproc_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1643 sizeof(mvm_a_vocproc_cmd) - APR_HDR_SIZE);
1644 pr_info("send mvm_a_vocproc_cmd pkt size = %d\n",
1645 mvm_a_vocproc_cmd.hdr.pkt_size);
1646 mvm_a_vocproc_cmd.hdr.src_port = 0;
1647 mvm_a_vocproc_cmd.hdr.dest_port = mvm_handle;
1648 mvm_a_vocproc_cmd.hdr.token = 0;
1649 mvm_a_vocproc_cmd.hdr.opcode = VSS_IMVM_CMD_ATTACH_VOCPROC;
1650 mvm_a_vocproc_cmd.mvm_attach_cvp_handle.handle = cvp_handle;
1651
1652 v->mvm_state = CMD_STATUS_FAIL;
1653 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_a_vocproc_cmd);
1654 if (ret < 0) {
1655 pr_err("Fail in sending VSS_IMVM_CMD_ATTACH_VOCPROC\n");
1656 goto fail;
1657 }
1658 ret = wait_event_timeout(v->mvm_wait,
1659 (v->mvm_state == CMD_STATUS_SUCCESS),
1660 msecs_to_jiffies(TIMEOUT_MS));
1661 if (!ret) {
1662 pr_err("%s: wait_event timeout\n", __func__);
1663 goto fail;
1664 }
1665
1666 /* send tty mode if tty device is used */
1667 voice_send_tty_mode_to_modem(v);
1668
1669 if (v->voc_path == VOC_PATH_FULL)
1670 voice_send_netid_timing_cmd(v);
1671
1672#ifdef CONFIG_MSM8X60_RTAC
1673 rtac_add_voice(v);
1674#endif
1675 return 0;
1676fail:
1677 return -EINVAL;
1678}
1679
1680static int voice_destroy_modem_voice(struct voice_data *v)
1681{
1682 struct mvm_detach_vocproc_cmd mvm_d_vocproc_cmd;
1683 struct apr_hdr cvp_destroy_session_cmd;
1684 int ret = 0;
1685 void *apr_mvm = voice_get_apr_mvm(v);
1686 void *apr_cvp = voice_get_apr_cvp(v);
1687 u16 mvm_handle = voice_get_mvm_handle(v);
1688 u16 cvp_handle = voice_get_cvp_handle(v);
1689
1690 /* detach VOCPROC and wait for response from mvm */
1691 mvm_d_vocproc_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1692 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1693 mvm_d_vocproc_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1694 sizeof(mvm_d_vocproc_cmd) - APR_HDR_SIZE);
1695 pr_info("mvm_d_vocproc_cmd pkt size = %d\n",
1696 mvm_d_vocproc_cmd.hdr.pkt_size);
1697 mvm_d_vocproc_cmd.hdr.src_port = 0;
1698 mvm_d_vocproc_cmd.hdr.dest_port = mvm_handle;
1699 mvm_d_vocproc_cmd.hdr.token = 0;
1700 mvm_d_vocproc_cmd.hdr.opcode = VSS_IMVM_CMD_DETACH_VOCPROC;
1701 mvm_d_vocproc_cmd.mvm_detach_cvp_handle.handle = cvp_handle;
1702
1703 v->mvm_state = CMD_STATUS_FAIL;
1704 ret = apr_send_pkt(apr_mvm, (uint32_t *) &mvm_d_vocproc_cmd);
1705 if (ret < 0) {
1706 pr_err("Fail in sending VSS_IMVM_CMD_DETACH_VOCPROC\n");
1707 goto fail;
1708 }
1709 ret = wait_event_timeout(v->mvm_wait,
1710 (v->mvm_state == CMD_STATUS_SUCCESS),
1711 msecs_to_jiffies(TIMEOUT_MS));
1712 if (!ret) {
1713 pr_err("%s: wait_event timeout\n", __func__);
1714 goto fail;
1715 }
1716
1717 /* destrop cvp session */
1718 cvp_destroy_session_cmd.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1719 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1720 cvp_destroy_session_cmd.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1721 sizeof(cvp_destroy_session_cmd) - APR_HDR_SIZE);
1722 pr_info("cvp_destroy_session_cmd pkt size = %d\n",
1723 cvp_destroy_session_cmd.pkt_size);
1724 cvp_destroy_session_cmd.src_port = 0;
1725 cvp_destroy_session_cmd.dest_port = cvp_handle;
1726 cvp_destroy_session_cmd.token = 0;
1727 cvp_destroy_session_cmd.opcode = APRV2_IBASIC_CMD_DESTROY_SESSION;
1728
1729 v->cvp_state = CMD_STATUS_FAIL;
1730 ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_destroy_session_cmd);
1731 if (ret < 0) {
1732 pr_err("Fail in sending APRV2_IBASIC_CMD_DESTROY_SESSION\n");
1733 goto fail;
1734 }
1735 ret = wait_event_timeout(v->cvp_wait,
1736 (v->cvp_state == CMD_STATUS_SUCCESS),
1737 msecs_to_jiffies(TIMEOUT_MS));
1738 if (!ret) {
1739 pr_err("%s: wait_event timeout\n", __func__);
1740 goto fail;
1741 }
1742
1743#ifdef CONFIG_MSM8X60_RTAC
1744 rtac_remove_voice(v);
1745#endif
1746 cvp_handle = 0;
1747 voice_set_cvp_handle(v, cvp_handle);
1748
1749 return 0;
1750
1751fail:
1752 return -EINVAL;
1753}
1754
1755static int voice_send_mute_cmd_to_modem(struct voice_data *v)
1756{
1757 struct cvs_set_mute_cmd cvs_mute_cmd;
1758 int ret = 0;
1759 void *apr_cvs = voice_get_apr_cvs(v);
1760 u16 cvs_handle = voice_get_cvs_handle(v);
1761
1762 /* send mute/unmute to cvs */
1763 cvs_mute_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1764 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1765 cvs_mute_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1766 sizeof(cvs_mute_cmd) - APR_HDR_SIZE);
1767 cvs_mute_cmd.hdr.src_port = 0;
1768 cvs_mute_cmd.hdr.dest_port = cvs_handle;
1769 cvs_mute_cmd.hdr.token = 0;
1770 cvs_mute_cmd.hdr.opcode = VSS_ISTREAM_CMD_SET_MUTE;
1771 cvs_mute_cmd.cvs_set_mute.direction = 0; /*tx*/
1772 cvs_mute_cmd.cvs_set_mute.mute_flag = v->dev_tx.mute;
1773
1774 pr_info(" mute value =%d\n", cvs_mute_cmd.cvs_set_mute.mute_flag);
1775 v->cvs_state = CMD_STATUS_FAIL;
1776 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_mute_cmd);
1777 if (ret < 0) {
1778 pr_err("Fail: send STREAM SET MUTE\n");
1779 goto fail;
1780 }
1781 ret = wait_event_timeout(v->cvs_wait,
1782 (v->cvs_state == CMD_STATUS_SUCCESS),
1783 msecs_to_jiffies(TIMEOUT_MS));
1784 if (!ret)
1785 pr_err("%s: wait_event timeout\n", __func__);
1786
1787fail:
1788 return 0;
1789}
1790
1791static int voice_send_vol_index_to_modem(struct voice_data *v)
1792{
1793 struct cvp_set_rx_volume_index_cmd cvp_vol_cmd;
1794 int ret = 0;
1795 void *apr_cvp = voice_get_apr_cvp(v);
1796 u16 cvp_handle = voice_get_cvp_handle(v);
1797
1798 /* send volume index to cvp */
1799 cvp_vol_cmd.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1800 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1801 cvp_vol_cmd.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1802 sizeof(cvp_vol_cmd) - APR_HDR_SIZE);
1803 cvp_vol_cmd.hdr.src_port = 0;
1804 cvp_vol_cmd.hdr.dest_port = cvp_handle;
1805 cvp_vol_cmd.hdr.token = 0;
1806 cvp_vol_cmd.hdr.opcode =
1807 VSS_IVOCPROC_CMD_SET_RX_VOLUME_INDEX;
1808 cvp_vol_cmd.cvp_set_vol_idx.vol_index = v->dev_rx.volume;
1809 v->cvp_state = CMD_STATUS_FAIL;
1810 ret = apr_send_pkt(apr_cvp, (uint32_t *) &cvp_vol_cmd);
1811 if (ret < 0) {
1812 pr_err("Fail in sending RX VOL INDEX\n");
1813 return -EINVAL;
1814 }
1815 ret = wait_event_timeout(v->cvp_wait,
1816 (v->cvp_state == CMD_STATUS_SUCCESS),
1817 msecs_to_jiffies(TIMEOUT_MS));
1818 if (!ret) {
1819 pr_err("%s: wait_event timeout\n", __func__);
1820 return -EINVAL;
1821 }
1822 return 0;
1823}
1824
1825static int voice_cvs_start_record(struct voice_data *v, uint32_t rec_mode)
1826{
1827 int ret = 0;
1828 void *apr_cvs = voice_get_apr_cvs(v);
1829 u16 cvs_handle = voice_get_cvs_handle(v);
1830 struct cvs_start_record_cmd cvs_start_record;
1831
1832 pr_debug("%s: Start record %d\n", __func__, rec_mode);
1833
1834 cvs_start_record.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1835 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1836 cvs_start_record.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1837 sizeof(cvs_start_record) - APR_HDR_SIZE);
1838 cvs_start_record.hdr.src_port = 0;
1839 cvs_start_record.hdr.dest_port = cvs_handle;
1840 cvs_start_record.hdr.token = 0;
1841 cvs_start_record.hdr.opcode = VSS_ISTREAM_CMD_START_RECORD;
1842
1843 if (rec_mode == VOC_REC_UPLINK) {
1844 cvs_start_record.rec_mode.rx_tap_point = VSS_TAP_POINT_NONE;
1845 cvs_start_record.rec_mode.tx_tap_point =
1846 VSS_TAP_POINT_STREAM_END;
1847 } else if (rec_mode == VOC_REC_DOWNLINK) {
1848 cvs_start_record.rec_mode.rx_tap_point =
1849 VSS_TAP_POINT_STREAM_END;
1850 cvs_start_record.rec_mode.tx_tap_point = VSS_TAP_POINT_NONE;
1851 } else if (rec_mode == VOC_REC_BOTH) {
1852 cvs_start_record.rec_mode.rx_tap_point =
1853 VSS_TAP_POINT_STREAM_END;
1854 cvs_start_record.rec_mode.tx_tap_point =
1855 VSS_TAP_POINT_STREAM_END;
1856 } else {
1857 pr_err("%s: Invalid in-call rec_mode %d\n", __func__, rec_mode);
1858
1859 ret = -EINVAL;
1860 goto fail;
1861 }
1862
1863 v->cvs_state = CMD_STATUS_FAIL;
1864
1865 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_start_record);
1866 if (ret < 0) {
1867 pr_err("%s: Error %d sending START_RECORD\n", __func__, ret);
1868
1869 goto fail;
1870 }
1871
1872 ret = wait_event_timeout(v->cvs_wait,
1873 (v->cvs_state == CMD_STATUS_SUCCESS),
1874 msecs_to_jiffies(TIMEOUT_MS));
1875 if (!ret) {
1876 pr_err("%s: wait_event timeout\n", __func__);
1877
1878 goto fail;
1879 }
1880
1881 return 0;
1882
1883fail:
1884 return ret;
1885}
1886
1887static int voice_cvs_stop_record(struct voice_data *v)
1888{
1889 int ret = 0;
1890 void *apr_cvs = voice_get_apr_cvs(v);
1891 u16 cvs_handle = voice_get_cvs_handle(v);
1892 struct apr_hdr cvs_stop_record;
1893
1894 pr_debug("%s: Stop record\n", __func__);
1895
1896 cvs_stop_record.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1897 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1898 cvs_stop_record.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1899 sizeof(cvs_stop_record) - APR_HDR_SIZE);
1900 cvs_stop_record.src_port = 0;
1901 cvs_stop_record.dest_port = cvs_handle;
1902 cvs_stop_record.token = 0;
1903 cvs_stop_record.opcode = VSS_ISTREAM_CMD_STOP_RECORD;
1904
1905 v->cvs_state = CMD_STATUS_FAIL;
1906
1907 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_stop_record);
1908 if (ret < 0) {
1909 pr_err("%s: Error %d sending STOP_RECORD\n", __func__, ret);
1910
1911 goto fail;
1912 }
1913
1914 ret = wait_event_timeout(v->cvs_wait,
1915 (v->cvs_state == CMD_STATUS_SUCCESS),
1916 msecs_to_jiffies(TIMEOUT_MS));
1917 if (!ret) {
1918 pr_err("%s: wait_event timeout\n", __func__);
1919
1920 goto fail;
1921 }
1922
1923 return 0;
1924
1925fail:
1926 return ret;
1927}
1928
1929int voice_start_record(uint32_t rec_mode, uint32_t set)
1930{
1931 int ret = 0;
1932 u16 cvs_handle;
1933
1934 pr_debug("%s: rec_mode %d, set %d\n", __func__, rec_mode, set);
1935
1936 mutex_lock(&voice.lock);
1937
1938 cvs_handle = voice_get_cvs_handle(&voice);
1939
1940 if (cvs_handle != 0) {
1941 if (set)
1942 ret = voice_cvs_start_record(&voice, rec_mode);
1943 else
1944 ret = voice_cvs_stop_record(&voice);
1945 } else {
1946 /* Cache the value for later. */
1947 voice.rec_info.pending = set;
1948 voice.rec_info.rec_mode = rec_mode;
1949 }
1950
1951 mutex_unlock(&voice.lock);
1952
1953 return ret;
1954}
1955
1956static int voice_cvs_start_playback(struct voice_data *v)
1957{
1958 int ret = 0;
1959 void *apr_cvs = voice_get_apr_cvs(v);
1960 u16 cvs_handle = voice_get_cvs_handle(v);
1961 struct apr_hdr cvs_start_playback;
1962
1963 pr_debug("%s: Start playback\n", __func__);
1964
1965 cvs_start_playback.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
1966 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
1967 cvs_start_playback.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
1968 sizeof(cvs_start_playback) - APR_HDR_SIZE);
1969 cvs_start_playback.src_port = 0;
1970 cvs_start_playback.dest_port = cvs_handle;
1971 cvs_start_playback.token = 0;
1972 cvs_start_playback.opcode = VSS_ISTREAM_CMD_START_PLAYBACK;
1973
1974 v->cvs_state = CMD_STATUS_FAIL;
1975
1976 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_start_playback);
1977 if (ret < 0) {
1978 pr_err("%s: Error %d sending START_PLAYBACK\n",
1979 __func__, ret);
1980
1981 goto fail;
1982 }
1983
1984 ret = wait_event_timeout(v->cvs_wait,
1985 (v->cvs_state == CMD_STATUS_SUCCESS),
1986 msecs_to_jiffies(TIMEOUT_MS));
1987 if (!ret) {
1988 pr_err("%s: wait_event timeout\n", __func__);
1989
1990 goto fail;
1991 }
1992
1993 v->music_info.playing = 1;
1994
1995 return 0;
1996
1997fail:
1998 return ret;
1999}
2000
2001static int voice_cvs_stop_playback(struct voice_data *v)
2002{
2003 int ret = 0;
2004 void *apr_cvs = voice_get_apr_cvs(v);
2005 u16 cvs_handle = voice_get_cvs_handle(v);
2006 struct apr_hdr cvs_stop_playback;
2007
2008 pr_debug("%s: Stop playback\n", __func__);
2009
2010 if (v->music_info.playing) {
2011 cvs_stop_playback.hdr_field =
2012 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
2013 APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER);
2014 cvs_stop_playback.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
2015 sizeof(cvs_stop_playback) - APR_HDR_SIZE);
2016 cvs_stop_playback.src_port = 0;
2017 cvs_stop_playback.dest_port = cvs_handle;
2018 cvs_stop_playback.token = 0;
2019
2020 cvs_stop_playback.opcode = VSS_ISTREAM_CMD_STOP_PLAYBACK;
2021
2022 v->cvs_state = CMD_STATUS_FAIL;
2023
2024 ret = apr_send_pkt(apr_cvs, (uint32_t *) &cvs_stop_playback);
2025 if (ret < 0) {
2026 pr_err("%s: Error %d sending STOP_PLAYBACK\n",
2027 __func__, ret);
2028
2029 goto fail;
2030 }
2031
2032 ret = wait_event_timeout(v->cvs_wait,
2033 (v->cvs_state == CMD_STATUS_SUCCESS),
2034 msecs_to_jiffies(TIMEOUT_MS));
2035 if (!ret) {
2036 pr_err("%s: wait_event timeout\n", __func__);
2037
2038 goto fail;
2039 }
2040
2041 v->music_info.playing = 0;
2042 } else {
2043 pr_err("%s: Stop playback already sent\n", __func__);
2044 }
2045
2046 return 0;
2047
2048fail:
2049 return ret;
2050}
2051
2052int voice_start_playback(uint32_t set)
2053{
2054 int ret = 0;
2055 u16 cvs_handle;
2056
2057 pr_debug("%s: Start playback %d\n", __func__, set);
2058
2059 mutex_lock(&voice.lock);
2060
2061 cvs_handle = voice_get_cvs_handle(&voice);
2062
2063 if (cvs_handle != 0) {
2064 if (set)
2065 ret = voice_cvs_start_playback(&voice);
2066 else
2067 ret = voice_cvs_stop_playback(&voice);
2068 } else {
2069 /* Cache the value for later. */
2070 pr_debug("%s: Caching ICP value", __func__);
2071
2072 voice.music_info.pending = set;
2073 }
2074
2075 mutex_unlock(&voice.lock);
2076
2077 return ret;
2078}
2079
2080static void voice_auddev_cb_function(u32 evt_id,
2081 union auddev_evt_data *evt_payload,
2082 void *private_data)
2083{
2084 struct voice_data *v = &voice;
2085 struct sidetone_cal sidetone_cal_data;
2086 int rc = 0;
2087 pr_info("auddev_cb_function, evt_id=%d,\n", evt_id);
2088 if ((evt_id != AUDDEV_EVT_START_VOICE) ||
2089 (evt_id != AUDDEV_EVT_END_VOICE)) {
2090 if (evt_payload == NULL) {
2091 pr_err(" evt_payload is NULL pointer\n");
2092 return;
2093 }
2094 }
2095
2096 switch (evt_id) {
2097 case AUDDEV_EVT_START_VOICE:
2098 mutex_lock(&v->lock);
2099
2100 if ((v->voc_state == VOC_INIT) ||
2101 (v->voc_state == VOC_RELEASE)) {
2102 v->v_call_status = VOICE_CALL_START;
2103 if ((v->dev_rx.enabled == VOICE_DEV_ENABLED)
2104 && (v->dev_tx.enabled == VOICE_DEV_ENABLED)) {
2105 rc = voice_apr_register(v);
2106 if (rc < 0) {
2107 pr_err("%s: voice apr registration"
2108 "failed\n", __func__);
2109 mutex_unlock(&v->lock);
2110 return;
2111 }
2112 voice_create_mvm_cvs_session(v);
2113 voice_setup_modem_voice(v);
2114 voice_attach_vocproc(v);
2115 voice_send_start_voice_cmd(v);
2116 get_sidetone_cal(&sidetone_cal_data);
2117 msm_snddev_enable_sidetone(
2118 v->dev_rx.dev_id,
2119 sidetone_cal_data.enable,
2120 sidetone_cal_data.gain);
2121 v->voc_state = VOC_RUN;
2122
2123 /* Start in-call recording if command was
2124 * pending. */
2125 if (v->rec_info.pending) {
2126 voice_cvs_start_record(v,
2127 v->rec_info.rec_mode);
2128
2129 v->rec_info.pending = 0;
2130 }
2131
2132 /* Start in-call music delivery if command was
2133 * pending. */
2134 if (v->music_info.pending) {
2135 voice_cvs_start_playback(v);
2136
2137 v->music_info.pending = 0;
2138 }
2139 }
2140 }
2141
2142 mutex_unlock(&v->lock);
2143 break;
2144 case AUDDEV_EVT_DEV_CHG_VOICE:
2145 if (v->dev_rx.enabled == VOICE_DEV_ENABLED)
2146 msm_snddev_enable_sidetone(v->dev_rx.dev_id, 0, 0);
2147 v->dev_rx.enabled = VOICE_DEV_DISABLED;
2148 v->dev_tx.enabled = VOICE_DEV_DISABLED;
2149
2150 mutex_lock(&v->lock);
2151
2152 if (v->voc_state == VOC_RUN) {
2153 /* send cmd to modem to do voice device change */
2154 voice_disable_vocproc(v);
2155 v->voc_state = VOC_CHANGE;
2156 }
2157
2158 mutex_unlock(&v->lock);
2159 break;
2160 case AUDDEV_EVT_DEV_RDY:
2161 mutex_lock(&v->lock);
2162
2163 if (v->voc_state == VOC_CHANGE) {
2164 /* get port Ids */
2165 if (evt_payload->voc_devinfo.dev_type == DIR_RX) {
2166 v->dev_rx.dev_port_id =
2167 evt_payload->voc_devinfo.dev_port_id;
2168 v->dev_rx.sample =
2169 evt_payload->voc_devinfo.dev_sample;
2170 v->dev_rx.dev_id =
2171 evt_payload->voc_devinfo.dev_id;
2172 v->dev_rx.enabled = VOICE_DEV_ENABLED;
2173 } else {
2174 v->dev_tx.dev_port_id =
2175 evt_payload->voc_devinfo.dev_port_id;
2176 v->dev_tx.sample =
2177 evt_payload->voc_devinfo.dev_sample;
2178 v->dev_tx.enabled = VOICE_DEV_ENABLED;
2179 v->dev_tx.dev_id =
2180 evt_payload->voc_devinfo.dev_id;
2181 }
2182 if ((v->dev_rx.enabled == VOICE_DEV_ENABLED) &&
2183 (v->dev_tx.enabled == VOICE_DEV_ENABLED)) {
2184 voice_set_device(v);
2185 get_sidetone_cal(&sidetone_cal_data);
2186 msm_snddev_enable_sidetone(
2187 v->dev_rx.dev_id,
2188 sidetone_cal_data.enable,
2189 sidetone_cal_data.gain);
2190 v->voc_state = VOC_RUN;
2191 }
2192 } else if ((v->voc_state == VOC_INIT) ||
2193 (v->voc_state == VOC_RELEASE)) {
2194 /* get AFE ports */
2195 if (evt_payload->voc_devinfo.dev_type == DIR_RX) {
2196 /* get rx port id */
2197 v->dev_rx.dev_port_id =
2198 evt_payload->voc_devinfo.dev_port_id;
2199 v->dev_rx.sample =
2200 evt_payload->voc_devinfo.dev_sample;
2201 v->dev_rx.dev_id =
2202 evt_payload->voc_devinfo.dev_id;
2203 v->dev_rx.enabled = VOICE_DEV_ENABLED;
2204 } else {
2205 /* get tx port id */
2206 v->dev_tx.dev_port_id =
2207 evt_payload->voc_devinfo.dev_port_id;
2208 v->dev_tx.sample =
2209 evt_payload->voc_devinfo.dev_sample;
2210 v->dev_tx.dev_id =
2211 evt_payload->voc_devinfo.dev_id;
2212 v->dev_tx.enabled = VOICE_DEV_ENABLED;
2213 }
2214 if ((v->dev_rx.enabled == VOICE_DEV_ENABLED) &&
2215 (v->dev_tx.enabled == VOICE_DEV_ENABLED) &&
2216 (v->v_call_status == VOICE_CALL_START)) {
2217 rc = voice_apr_register(v);
2218 if (rc < 0) {
2219 pr_err("%s: voice apr registration"
2220 "failed\n", __func__);
2221 mutex_unlock(&v->lock);
2222 return;
2223 }
2224 voice_create_mvm_cvs_session(v);
2225 voice_setup_modem_voice(v);
2226 voice_attach_vocproc(v);
2227 voice_send_start_voice_cmd(v);
2228 get_sidetone_cal(&sidetone_cal_data);
2229 msm_snddev_enable_sidetone(
2230 v->dev_rx.dev_id,
2231 sidetone_cal_data.enable,
2232 sidetone_cal_data.gain);
2233 v->voc_state = VOC_RUN;
2234
2235 /* Start in-call recording if command was
2236 * pending. */
2237 if (v->rec_info.pending) {
2238 voice_cvs_start_record(v,
2239 v->rec_info.rec_mode);
2240
2241 v->rec_info.pending = 0;
2242 }
2243
2244 /* Start in-call music delivery if command was
2245 * pending. */
2246 if (v->music_info.pending) {
2247 voice_cvs_start_playback(v);
2248
2249 v->music_info.pending = 0;
2250 }
2251 }
2252 }
2253
2254 mutex_unlock(&v->lock);
2255 break;
2256 case AUDDEV_EVT_DEVICE_VOL_MUTE_CHG:
2257 /* cache the mute and volume index value */
2258 if (evt_payload->voc_devinfo.dev_type == DIR_TX) {
2259 v->dev_tx.mute =
2260 evt_payload->voc_vm_info.dev_vm_val.mute;
2261
2262 mutex_lock(&v->lock);
2263
2264 if (v->voc_state == VOC_RUN)
2265 voice_send_mute_cmd_to_modem(v);
2266
2267 mutex_unlock(&v->lock);
2268 } else {
2269 v->dev_rx.volume = evt_payload->
2270 voc_vm_info.dev_vm_val.vol;
2271
2272 mutex_lock(&v->lock);
2273
2274 if (v->voc_state == VOC_RUN)
2275 voice_send_vol_index_to_modem(v);
2276
2277 mutex_unlock(&v->lock);
2278 }
2279 break;
2280 case AUDDEV_EVT_REL_PENDING:
2281
2282 mutex_lock(&v->lock);
2283
2284 if (v->voc_state == VOC_RUN) {
2285 voice_disable_vocproc(v);
2286 v->voc_state = VOC_CHANGE;
2287 }
2288
2289 mutex_unlock(&v->lock);
2290
2291 if (evt_payload->voc_devinfo.dev_type == DIR_RX)
2292 v->dev_rx.enabled = VOICE_DEV_DISABLED;
2293 else
2294 v->dev_tx.enabled = VOICE_DEV_DISABLED;
2295
2296 break;
2297 case AUDDEV_EVT_END_VOICE:
2298 /* recover the tx mute and rx volume to the default values */
2299 v->dev_tx.mute = v->default_mute_val;
2300 v->dev_rx.volume = v->default_vol_val;
2301 if (v->dev_rx.enabled == VOICE_DEV_ENABLED)
2302 msm_snddev_enable_sidetone(v->dev_rx.dev_id, 0, 0);
2303
2304 mutex_lock(&v->lock);
2305
2306 if (v->voc_state == VOC_RUN) {
2307 /* call stop modem voice */
2308 voice_send_stop_voice_cmd(v);
2309 voice_destroy_modem_voice(v);
2310 voice_destroy_mvm_cvs_session(v);
2311 v->voc_state = VOC_RELEASE;
2312 } else if (v->voc_state == VOC_CHANGE) {
2313 voice_send_stop_voice_cmd(v);
2314 voice_destroy_mvm_cvs_session(v);
2315 v->voc_state = VOC_RELEASE;
2316 }
2317
2318 mutex_unlock(&v->lock);
2319
2320 v->v_call_status = VOICE_CALL_END;
2321
2322 break;
2323 default:
2324 pr_err("UNKNOWN EVENT\n");
2325 }
2326 return;
2327}
2328EXPORT_SYMBOL(voice_auddev_cb_function);
2329
2330int voice_set_voc_path_full(uint32_t set)
2331{
2332 int rc = 0;
2333
2334 pr_info("%s: %d\n", __func__, set);
2335
2336 mutex_lock(&voice.lock);
2337
2338 if (voice.voc_state == VOC_INIT || voice.voc_state == VOC_RELEASE) {
2339 if (set)
2340 voice.voc_path = VOC_PATH_FULL;
2341 else
2342 voice.voc_path = VOC_PATH_PASSIVE;
2343 } else {
2344 pr_err("%s: Invalid voc path set to %d, in state %d\n",
2345 __func__, set, voice.voc_state);
2346
2347 rc = -EPERM;
2348 }
2349
2350 mutex_unlock(&voice.lock);
2351
2352 return rc;
2353}
2354EXPORT_SYMBOL(voice_set_voc_path_full);
2355
2356void voice_register_mvs_cb(ul_cb_fn ul_cb,
2357 dl_cb_fn dl_cb,
2358 void *private_data)
2359{
2360 voice.mvs_info.ul_cb = ul_cb;
2361 voice.mvs_info.dl_cb = dl_cb;
2362 voice.mvs_info.private_data = private_data;
2363}
2364
2365void voice_config_vocoder(uint32_t media_type,
2366 uint32_t rate,
2367 uint32_t network_type,
2368 uint32_t dtx_mode)
2369{
2370 voice.mvs_info.media_type = media_type;
2371 voice.mvs_info.rate = rate;
2372 voice.mvs_info.network_type = network_type;
2373 voice.mvs_info.dtx_mode = dtx_mode;
2374}
2375
2376static int32_t modem_mvm_callback(struct apr_client_data *data, void *priv)
2377{
2378 uint32_t *ptr;
2379 struct voice_data *v = priv;
2380
2381 pr_debug("%s\n", __func__);
2382 pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__,
2383 data->payload_size, data->opcode);
2384
2385 if (data->opcode == RESET_EVENTS) {
2386 pr_debug("%s:Reset event received in Voice service\n",
2387 __func__);
2388 apr_reset(v->apr_mvm);
2389 apr_reset(v->apr_q6_mvm);
2390 v->apr_q6_mvm = NULL;
2391 v->apr_mvm = NULL;
2392 v->mvm_handle = 0;
2393 v->mvm_q6_handle = 0;
2394 return 0;
2395 }
2396
2397 if (data->opcode == APR_BASIC_RSP_RESULT) {
2398 if (data->payload_size) {
2399 ptr = data->payload;
2400
2401 pr_info("%x %x\n", ptr[0], ptr[1]);
2402 /* ping mvm service ACK */
2403
2404 if (ptr[0] ==
2405 VSS_IMVM_CMD_CREATE_PASSIVE_CONTROL_SESSION ||
2406 ptr[0] ==
2407 VSS_IMVM_CMD_CREATE_FULL_CONTROL_SESSION) {
2408 /* Passive session is used for voice call
2409 * through modem. Full session is used for voice
2410 * call through Q6. */
2411 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2412 if (!ptr[1]) {
2413 pr_debug("%s: MVM handle is %d\n",
2414 __func__, data->src_port);
2415
2416 voice_set_mvm_handle(v, data->src_port);
2417 } else
2418 pr_info("got NACK for sending \
2419 MVM create session \n");
2420 v->mvm_state = CMD_STATUS_SUCCESS;
2421 wake_up(&v->mvm_wait);
2422 } else if (ptr[0] == VSS_IMVM_CMD_START_VOICE) {
2423 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2424 v->mvm_state = CMD_STATUS_SUCCESS;
2425 wake_up(&v->mvm_wait);
2426 } else if (ptr[0] == VSS_IMVM_CMD_ATTACH_VOCPROC) {
2427 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2428 v->mvm_state = CMD_STATUS_SUCCESS;
2429 wake_up(&v->mvm_wait);
2430 } else if (ptr[0] == VSS_IMVM_CMD_STOP_VOICE) {
2431 v->mvm_state = CMD_STATUS_SUCCESS;
2432 wake_up(&v->mvm_wait);
2433 } else if (ptr[0] == VSS_IMVM_CMD_DETACH_VOCPROC) {
2434 v->mvm_state = CMD_STATUS_SUCCESS;
2435 wake_up(&v->mvm_wait);
2436 } else if (ptr[0] == VSS_ISTREAM_CMD_SET_TTY_MODE) {
2437 v->mvm_state = CMD_STATUS_SUCCESS;
2438 wake_up(&v->mvm_wait);
2439 } else if (ptr[0] == APRV2_IBASIC_CMD_DESTROY_SESSION) {
2440 pr_debug("%s: DESTROY resp\n", __func__);
2441
2442 v->mvm_state = CMD_STATUS_SUCCESS;
2443 wake_up(&v->mvm_wait);
2444 } else if (ptr[0] == VSS_IMVM_CMD_ATTACH_STREAM) {
2445 pr_debug("%s: ATTACH_STREAM resp 0x%x\n",
2446 __func__, ptr[1]);
2447
2448 v->mvm_state = CMD_STATUS_SUCCESS;
2449 wake_up(&v->mvm_wait);
2450 } else if (ptr[0] == VSS_IMVM_CMD_DETACH_STREAM) {
2451 pr_debug("%s: DETACH_STREAM resp 0x%x\n",
2452 __func__, ptr[1]);
2453
2454 v->mvm_state = CMD_STATUS_SUCCESS;
2455 wake_up(&v->mvm_wait);
2456 } else if (ptr[0] == VSS_ICOMMON_CMD_SET_NETWORK) {
2457 pr_debug("%s: SET_NETWORK resp 0x%x\n",
2458 __func__, ptr[1]);
2459
2460 v->mvm_state = CMD_STATUS_SUCCESS;
2461 wake_up(&v->mvm_wait);
2462 } else if (ptr[0] == VSS_ICOMMON_CMD_SET_VOICE_TIMING) {
2463 pr_debug("%s: SET_VOICE_TIMING resp 0x%x\n",
2464 __func__, ptr[1]);
2465
2466 v->mvm_state = CMD_STATUS_SUCCESS;
2467 wake_up(&v->mvm_wait);
2468 } else
2469 pr_debug("%s: not match cmd = 0x%x\n",
2470 __func__, ptr[0]);
2471 }
2472 }
2473
2474 return 0;
2475}
2476
2477static int32_t modem_cvs_callback(struct apr_client_data *data, void *priv)
2478{
2479 uint32_t *ptr;
2480 struct voice_data *v = priv;
2481
2482 pr_debug("%s\n", __func__);
2483 pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__,
2484 data->payload_size, data->opcode);
2485
2486 if (data->opcode == RESET_EVENTS) {
2487 pr_debug("%s:Reset event received in Voice service\n",
2488 __func__);
2489 apr_reset(v->apr_cvs);
2490 apr_reset(v->apr_q6_cvs);
2491 v->apr_q6_cvs = NULL;
2492 v->apr_cvs = NULL;
2493 v->cvs_handle = 0;
2494 v->cvs_q6_handle = 0;
2495 return 0;
2496 }
2497
2498 if (data->opcode == APR_BASIC_RSP_RESULT) {
2499 if (data->payload_size) {
2500 ptr = data->payload;
2501
2502 pr_info("%x %x\n", ptr[0], ptr[1]);
2503 /*response from modem CVS */
2504 if (ptr[0] ==
2505 VSS_ISTREAM_CMD_CREATE_PASSIVE_CONTROL_SESSION ||
2506 ptr[0] ==
2507 VSS_ISTREAM_CMD_CREATE_FULL_CONTROL_SESSION) {
2508 if (!ptr[1]) {
2509 pr_debug("%s: CVS handle is %d\n",
2510 __func__, data->src_port);
2511 voice_set_cvs_handle(v, data->src_port);
2512 } else
2513 pr_info("got NACK for sending \
2514 CVS create session \n");
2515 v->cvs_state = CMD_STATUS_SUCCESS;
2516 wake_up(&v->cvs_wait);
2517 } else if (ptr[0] ==
2518 VSS_ISTREAM_CMD_CACHE_CALIBRATION_DATA) {
2519 v->cvs_state = CMD_STATUS_SUCCESS;
2520 wake_up(&v->cvs_wait);
2521 } else if (ptr[0] ==
2522 VSS_ISTREAM_CMD_SET_MUTE) {
2523 v->cvs_state = CMD_STATUS_SUCCESS;
2524 wake_up(&v->cvs_wait);
2525 } else if (ptr[0] == VSS_ISTREAM_CMD_SET_MEDIA_TYPE) {
2526 pr_debug("%s: SET_MEDIA resp 0x%x\n",
2527 __func__, ptr[1]);
2528
2529 v->cvs_state = CMD_STATUS_SUCCESS;
2530 wake_up(&v->cvs_wait);
2531 } else if (ptr[0] ==
2532 VSS_ISTREAM_CMD_VOC_AMR_SET_ENC_RATE) {
2533 pr_debug("%s: SET_AMR_RATE resp 0x%x\n",
2534 __func__, ptr[1]);
2535
2536 v->cvs_state = CMD_STATUS_SUCCESS;
2537 wake_up(&v->cvs_wait);
2538 } else if (ptr[0] ==
2539 VSS_ISTREAM_CMD_VOC_AMRWB_SET_ENC_RATE) {
2540 pr_debug("%s: SET_AMR_WB_RATE resp 0x%x\n",
2541 __func__, ptr[1]);
2542
2543 v->cvs_state = CMD_STATUS_SUCCESS;
2544 wake_up(&v->cvs_wait);
2545 } else if (ptr[0] == VSS_ISTREAM_CMD_SET_ENC_DTX_MODE) {
2546 pr_debug("%s: SET_DTX resp 0x%x\n",
2547 __func__, ptr[1]);
2548
2549 v->cvs_state = CMD_STATUS_SUCCESS;
2550 wake_up(&v->cvs_wait);
2551 } else if (ptr[0] ==
2552 VSS_ISTREAM_CMD_CDMA_SET_ENC_MINMAX_RATE) {
2553 pr_debug("%s: SET_CDMA_RATE resp 0x%x\n",
2554 __func__, ptr[1]);
2555
2556 v->cvs_state = CMD_STATUS_SUCCESS;
2557 wake_up(&v->cvs_wait);
2558 } else if (ptr[0] == APRV2_IBASIC_CMD_DESTROY_SESSION) {
2559 pr_debug("%s: DESTROY resp\n", __func__);
2560
2561 v->cvs_state = CMD_STATUS_SUCCESS;
2562 wake_up(&v->cvs_wait);
2563 } else if (ptr[0] == VSS_ISTREAM_CMD_START_RECORD) {
2564 pr_debug("%s: START_RECORD resp 0x%x\n",
2565 __func__, ptr[1]);
2566
2567 v->cvs_state = CMD_STATUS_SUCCESS;
2568 wake_up(&v->cvs_wait);
2569 } else if (ptr[0] == VSS_ISTREAM_CMD_STOP_RECORD) {
2570 pr_debug("%s: STOP_RECORD resp 0x%x\n",
2571 __func__, ptr[1]);
2572
2573 v->cvs_state = CMD_STATUS_SUCCESS;
2574 wake_up(&v->cvs_wait);
2575#ifdef CONFIG_MSM8X60_RTAC
2576 } else if (ptr[0] == VOICE_CMD_SET_PARAM) {
2577 rtac_make_voice_callback(RTAC_CVS, ptr,
2578 data->payload_size);
2579#endif
2580 } else if (ptr[0] == VSS_ISTREAM_CMD_START_PLAYBACK) {
2581 pr_debug("%s: START_PLAYBACK resp 0x%x\n",
2582 __func__, ptr[1]);
2583
2584 v->cvs_state = CMD_STATUS_SUCCESS;
2585 wake_up(&v->cvs_wait);
2586 } else if (ptr[0] == VSS_ISTREAM_CMD_STOP_PLAYBACK) {
2587 pr_debug("%s: STOP_PLAYBACK resp 0x%x\n",
2588 __func__, ptr[1]);
2589
2590 v->cvs_state = CMD_STATUS_SUCCESS;
2591 wake_up(&v->cvs_wait);
2592 } else
2593 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2594 }
2595 } else if (data->opcode == VSS_ISTREAM_EVT_SEND_ENC_BUFFER) {
2596 uint32_t *voc_pkt = data->payload;
2597 uint32_t pkt_len = data->payload_size;
2598
2599 if (voc_pkt != NULL && v->mvs_info.ul_cb != NULL) {
2600 pr_debug("%s: Media type is 0x%x\n",
2601 __func__, voc_pkt[0]);
2602
2603 /* Remove media ID from payload. */
2604 voc_pkt++;
2605 pkt_len = pkt_len - 4;
2606
2607 v->mvs_info.ul_cb((uint8_t *)voc_pkt,
2608 pkt_len,
2609 v->mvs_info.private_data);
2610 } else {
2611 pr_err("%s: voc_pkt is 0x%x ul_cb is 0x%x\n",
2612 __func__, (unsigned int)voc_pkt,
2613 (unsigned int) v->mvs_info.ul_cb);
2614 }
2615 } else if (data->opcode == VSS_ISTREAM_EVT_SEND_DEC_BUFFER) {
2616 pr_debug("%s: Send dec buf resp\n", __func__);
2617 } else if (data->opcode == VSS_ISTREAM_EVT_REQUEST_DEC_BUFFER) {
2618 struct cvs_send_dec_buf_cmd send_dec_buf;
2619 int ret = 0;
2620 uint32_t pkt_len = 0;
2621
2622 if (v->mvs_info.dl_cb != NULL) {
2623 send_dec_buf.dec_buf.media_id = v->mvs_info.media_type;
2624
2625 v->mvs_info.dl_cb(
2626 (uint8_t *)&send_dec_buf.dec_buf.packet_data,
2627 &pkt_len,
2628 v->mvs_info.private_data);
2629
2630 send_dec_buf.hdr.hdr_field =
2631 APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD,
2632 APR_HDR_LEN(APR_HDR_SIZE),
2633 APR_PKT_VER);
2634 send_dec_buf.hdr.pkt_size = APR_PKT_SIZE(APR_HDR_SIZE,
2635 sizeof(send_dec_buf.dec_buf.media_id) + pkt_len);
2636 send_dec_buf.hdr.src_port = 0;
2637 send_dec_buf.hdr.dest_port = voice_get_cvs_handle(v);
2638 send_dec_buf.hdr.token = 0;
2639 send_dec_buf.hdr.opcode =
2640 VSS_ISTREAM_EVT_SEND_DEC_BUFFER;
2641
2642 ret = apr_send_pkt(voice_get_apr_cvs(v),
2643 (uint32_t *) &send_dec_buf);
2644 if (ret < 0) {
2645 pr_err("%s: Error %d sending DEC_BUF\n",
2646 __func__, ret);
2647 goto fail;
2648 }
2649 } else {
2650 pr_err("%s: ul_cb is NULL\n", __func__);
2651 }
2652#ifdef CONFIG_MSM8X60_RTAC
2653 } else if (data->opcode == VOICE_EVT_GET_PARAM_ACK) {
2654 rtac_make_voice_callback(RTAC_CVS, data->payload,
2655 data->payload_size);
2656#endif
2657
2658 } else {
2659 pr_debug("%s: Unknown opcode 0x%x\n", __func__, data->opcode);
2660 }
2661
2662fail:
2663 return 0;
2664}
2665
2666static int32_t modem_cvp_callback(struct apr_client_data *data, void *priv)
2667{
2668 uint32_t *ptr;
2669 struct voice_data *v = priv;
2670
2671 pr_debug("%s\n", __func__);
2672 pr_debug("%s: Payload Length = %d, opcode=%x\n", __func__,
2673 data->payload_size, data->opcode);
2674
2675 if (data->opcode == RESET_EVENTS) {
2676 pr_debug("%s:Reset event received in Voice service\n",
2677 __func__);
2678 apr_reset(v->apr_cvp);
2679 apr_reset(v->apr_q6_cvp);
2680 v->apr_q6_cvp = NULL;
2681 v->apr_cvp = NULL;
2682 v->cvp_handle = 0;
2683 v->cvp_q6_handle = 0;
2684 return 0;
2685 }
2686
2687 if (data->opcode == APR_BASIC_RSP_RESULT) {
2688 if (data->payload_size) {
2689 ptr = data->payload;
2690
2691 pr_info("%x %x\n", ptr[0], ptr[1]);
2692 /*response from modem CVP */
2693 if (ptr[0] ==
2694 VSS_IVOCPROC_CMD_CREATE_FULL_CONTROL_SESSION) {
2695 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2696 if (!ptr[1]) {
2697 voice_set_cvp_handle(v, data->src_port);
2698 pr_debug("cvphdl=%d\n", data->src_port);
2699 } else
2700 pr_info("got NACK from CVP create \
2701 session response\n");
2702 v->cvp_state = CMD_STATUS_SUCCESS;
2703 wake_up(&v->cvp_wait);
2704 } else if (ptr[0] ==
2705 VSS_IVOCPROC_CMD_CACHE_CALIBRATION_DATA) {
2706 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2707 v->cvp_state = CMD_STATUS_SUCCESS;
2708 wake_up(&v->cvp_wait);
2709 } else if (ptr[0] == VSS_IVOCPROC_CMD_SET_DEVICE) {
2710 v->cvp_state = CMD_STATUS_SUCCESS;
2711 wake_up(&v->cvp_wait);
2712 } else if (ptr[0] ==
2713 VSS_IVOCPROC_CMD_SET_RX_VOLUME_INDEX) {
2714 v->cvp_state = CMD_STATUS_SUCCESS;
2715 wake_up(&v->cvp_wait);
2716 } else if (ptr[0] == VSS_IVOCPROC_CMD_ENABLE) {
2717 v->cvp_state = CMD_STATUS_SUCCESS;
2718 wake_up(&v->cvp_wait);
2719 } else if (ptr[0] == VSS_IVOCPROC_CMD_DISABLE) {
2720 v->cvp_state = CMD_STATUS_SUCCESS;
2721 wake_up(&v->cvp_wait);
2722 } else if (ptr[0] == APRV2_IBASIC_CMD_DESTROY_SESSION) {
2723 v->cvp_state = CMD_STATUS_SUCCESS;
2724 wake_up(&v->cvp_wait);
2725 } else if (ptr[0] ==
2726 VSS_IVOCPROC_CMD_CACHE_VOLUME_CALIBRATION_TABLE
2727 ) {
2728
2729 pr_debug("%s: cmd = 0x%x\n", __func__, ptr[0]);
2730 v->cvp_state = CMD_STATUS_SUCCESS;
2731 wake_up(&v->cvp_wait);
2732#ifdef CONFIG_MSM8X60_RTAC
2733 } else if (ptr[0] == VOICE_CMD_SET_PARAM) {
2734 rtac_make_voice_callback(RTAC_CVP, ptr,
2735 data->payload_size);
2736#endif
2737 } else
2738 pr_debug("%s: not match cmd = 0x%x\n",
2739 __func__, ptr[0]);
2740 }
2741#ifdef CONFIG_MSM8X60_RTAC
2742 } else if (data->opcode == VOICE_EVT_GET_PARAM_ACK) {
2743 rtac_make_voice_callback(RTAC_CVP, data->payload,
2744 data->payload_size);
2745#endif
2746 }
2747 return 0;
2748}
2749
2750
2751static int __init voice_init(void)
2752{
2753 int rc = 0;
2754 struct voice_data *v = &voice;
2755
2756 /* set default value */
2757 v->default_mute_val = 1; /* default is mute */
2758 v->default_vol_val = 0;
2759 v->default_sample_val = 8000;
2760
2761 /* initialize dev_rx and dev_tx */
2762 memset(&v->dev_tx, 0, sizeof(struct device_data));
2763 memset(&v->dev_rx, 0, sizeof(struct device_data));
2764 v->dev_rx.volume = v->default_vol_val;
2765 v->dev_tx.mute = v->default_mute_val;
2766
2767 v->voc_state = VOC_INIT;
2768 v->voc_path = VOC_PATH_PASSIVE;
2769 v->adsp_version = 0;
2770 init_waitqueue_head(&v->mvm_wait);
2771 init_waitqueue_head(&v->cvs_wait);
2772 init_waitqueue_head(&v->cvp_wait);
2773
2774 mutex_init(&v->lock);
2775
2776 v->mvm_handle = 0;
2777 v->cvs_handle = 0;
2778 v->cvp_handle = 0;
2779
2780 v->mvm_q6_handle = 0;
2781 v->cvs_q6_handle = 0;
2782 v->cvp_q6_handle = 0;
2783
2784 v->apr_mvm = NULL;
2785 v->apr_cvs = NULL;
2786 v->apr_cvp = NULL;
2787
2788 v->apr_q6_mvm = NULL;
2789 v->apr_q6_cvs = NULL;
2790 v->apr_q6_cvp = NULL;
2791
2792 /* Initialize MVS info. */
2793 memset(&v->mvs_info, 0, sizeof(v->mvs_info));
2794 v->mvs_info.network_type = VSS_NETWORK_ID_DEFAULT;
2795
2796 v->rec_info.pending = 0;
2797 v->rec_info.rec_mode = VOC_REC_NONE;
2798
2799 memset(&v->music_info, 0, sizeof(v->music_info));
2800
2801 v->device_events = AUDDEV_EVT_DEV_CHG_VOICE |
2802 AUDDEV_EVT_DEV_RDY |
2803 AUDDEV_EVT_REL_PENDING |
2804 AUDDEV_EVT_START_VOICE |
2805 AUDDEV_EVT_END_VOICE |
2806 AUDDEV_EVT_DEVICE_VOL_MUTE_CHG |
2807 AUDDEV_EVT_FREQ_CHG;
2808
2809 pr_debug("to register call back\n");
2810 /* register callback to auddev */
2811 auddev_register_evt_listner(v->device_events, AUDDEV_CLNT_VOC,
2812 0, voice_auddev_cb_function, v);
2813
2814 return rc;
2815}
2816
2817device_initcall(voice_init);