blob: bf6f115f91ea41a00a4b72f9a29be096cdec703a [file] [log] [blame]
Bryan Huntsman3f2bc4d2011-08-16 17:27:22 -07001/*
2 * Copyright (C) 2009 Google, Inc.
3 * Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
4 * Author: Brian Swetland <swetland@google.com>
5 *
6 * This software is licensed under the terms of the GNU General Public
7 * License version 2, as published by the Free Software Foundation, and
8 * may be copied, distributed, and modified under those terms.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 */
16
17#include <linux/slab.h>
18#include <linux/mutex.h>
19#include <linux/sched.h>
20#include <linux/wait.h>
21#include <linux/dma-mapping.h>
22#include <linux/clk.h>
23
24#include <linux/delay.h>
25#include <linux/wakelock.h>
26#include <linux/android_pmem.h>
27#include <linux/firmware.h>
28#include <linux/miscdevice.h>
29
30#include "dal.h"
31#include "dal_audio.h"
32#include "dal_audio_format.h"
33#include "dal_acdb.h"
34#include "dal_adie.h"
35#include <mach/msm_qdsp6_audio.h>
36
37#include <linux/msm_audio_aac.h>
38
39#include <linux/gpio.h>
40
41#include "q6audio_devices.h"
42#include <mach/debug_mm.h>
43
44
45struct q6_hw_info {
46 int min_gain;
47 int max_gain;
48};
49
50/* TODO: provide mechanism to configure from board file */
51
52static struct q6_hw_info q6_audio_hw[Q6_HW_COUNT] = {
53 [Q6_HW_HANDSET] = {
54 .min_gain = -400,
55 .max_gain = 1100,
56 },
57 [Q6_HW_HEADSET] = {
58 .min_gain = -1100,
59 .max_gain = 400,
60 },
61 [Q6_HW_SPEAKER] = {
62 .min_gain = -1000,
63 .max_gain = 500,
64 },
65 [Q6_HW_TTY] = {
66 .min_gain = 0,
67 .max_gain = 0,
68 },
69 [Q6_HW_BT_SCO] = {
70 .min_gain = -1100,
71 .max_gain = 400,
72 },
73 [Q6_HW_BT_A2DP] = {
74 .min_gain = -1100,
75 .max_gain = 400,
76 },
77};
78
79static struct wake_lock wakelock;
80static struct wake_lock idlelock;
81static int idlecount;
82static DEFINE_MUTEX(idlecount_lock);
83
84void audio_prevent_sleep(void)
85{
86 mutex_lock(&idlecount_lock);
87 if (++idlecount == 1) {
88 wake_lock(&wakelock);
89 wake_lock(&idlelock);
90 }
91 mutex_unlock(&idlecount_lock);
92}
93
94void audio_allow_sleep(void)
95{
96 mutex_lock(&idlecount_lock);
97 if (--idlecount == 0) {
98 wake_unlock(&idlelock);
99 wake_unlock(&wakelock);
100 }
101 mutex_unlock(&idlecount_lock);
102}
103
104static struct clk *icodec_rx_clk;
105static struct clk *icodec_tx_clk;
106static struct clk *ecodec_clk;
107static struct clk *sdac_clk;
108
109static struct q6audio_analog_ops default_analog_ops;
110static struct q6audio_analog_ops *analog_ops = &default_analog_ops;
111static uint32_t tx_clk_freq = 8000;
112static int tx_mute_status = 0;
113static int rx_vol_level = 100;
114static uint32_t tx_acdb = 0;
115static uint32_t rx_acdb = 0;
116
117void q6audio_register_analog_ops(struct q6audio_analog_ops *ops)
118{
119 analog_ops = ops;
120}
121
122static struct q6_device_info *q6_lookup_device(uint32_t device_id,
123 uint32_t acdb_id)
124{
125 struct q6_device_info *di = q6_audio_devices;
126
127 pr_debug("[%s:%s] device_id = 0x%x, acdb_id = %d\n", __MM_FILE__,
128 __func__, device_id, acdb_id);
129 if (acdb_id) {
130 for (;;) {
131 if (di->cad_id == acdb_id && di->id == device_id)
132 return di;
133 if (di->id == 0) {
134 pr_err("[%s:%s] bogus id 0x%08x\n",
135 __MM_FILE__, __func__, device_id);
136 return di;
137 }
138 di++;
139 }
140 } else {
141 for (;;) {
142 if (di->id == device_id)
143 return di;
144 if (di->id == 0) {
145 pr_err("[%s:%s] bogus id 0x%08x\n",
146 __MM_FILE__, __func__, device_id);
147 return di;
148 }
149 di++;
150 }
151 }
152}
153
154static uint32_t q6_device_to_codec(uint32_t device_id)
155{
156 struct q6_device_info *di = q6_lookup_device(device_id, 0);
157 return di->codec;
158}
159
160static uint32_t q6_device_to_dir(uint32_t device_id)
161{
162 struct q6_device_info *di = q6_lookup_device(device_id, 0);
163 return di->dir;
164}
165
166static uint32_t q6_device_to_cad_id(uint32_t device_id)
167{
168 struct q6_device_info *di = q6_lookup_device(device_id, 0);
169 return di->cad_id;
170}
171
172static uint32_t q6_device_to_path(uint32_t device_id, uint32_t acdb_id)
173{
174 struct q6_device_info *di = q6_lookup_device(device_id, acdb_id);
175 return di->path;
176}
177
178static uint32_t q6_device_to_rate(uint32_t device_id)
179{
180 struct q6_device_info *di = q6_lookup_device(device_id, 0);
181 return di->rate;
182}
183
184int q6_device_volume(uint32_t device_id, int level)
185{
186 struct q6_device_info *di = q6_lookup_device(device_id, 0);
187 struct q6_hw_info *hw;
188
189 hw = &q6_audio_hw[di->hw];
190
191 return hw->min_gain + ((hw->max_gain - hw->min_gain) * level) / 100;
192}
193
194static inline int adie_open(struct dal_client *client)
195{
196 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
197 return dal_call_f0(client, DAL_OP_OPEN, 0);
198}
199
200static inline int adie_close(struct dal_client *client)
201{
202 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
203 return dal_call_f0(client, DAL_OP_CLOSE, 0);
204}
205
206static inline int adie_set_path(struct dal_client *client,
207 uint32_t id, uint32_t path_type)
208{
209 pr_debug("[%s:%s] id = 0x%x, path_type = %d\n", __MM_FILE__,
210 __func__, id, path_type);
211 return dal_call_f1(client, ADIE_OP_SET_PATH, id, path_type);
212}
213
214static inline int adie_set_path_freq_plan(struct dal_client *client,
215 uint32_t path_type, uint32_t plan)
216{
217 pr_debug("[%s:%s] path_type = %d, plan = %d\n", __MM_FILE__,
218 __func__, path_type, plan);
219 return dal_call_f1(client, ADIE_OP_SET_PATH_FREQUENCY_PLAN,
220 path_type, plan);
221}
222
223static inline int adie_proceed_to_stage(struct dal_client *client,
224 uint32_t path_type, uint32_t stage)
225{
226 pr_debug("[%s:%s] path_type = %d, stage = 0x%x\n", __MM_FILE__,
227 __func__, path_type, stage);
228 return dal_call_f1(client, ADIE_OP_PROCEED_TO_STAGE,
229 path_type, stage);
230}
231
232static inline int adie_mute_path(struct dal_client *client,
233 uint32_t path_type, uint32_t mute_state)
234{
235 pr_debug("[%s:%s] path_type = %d, mute = %d\n", __MM_FILE__, __func__,
236 path_type, mute_state);
237 return dal_call_f1(client, ADIE_OP_MUTE_PATH, path_type, mute_state);
238}
239
240static int adie_refcount;
241
242static struct dal_client *adie;
243static struct dal_client *adsp;
244static struct dal_client *acdb;
245
246static int adie_enable(void)
247{
248 adie_refcount++;
249 if (adie_refcount == 1)
250 adie_open(adie);
251 return 0;
252}
253
254static int adie_disable(void)
255{
256 adie_refcount--;
257 if (adie_refcount == 0)
258 adie_close(adie);
259 return 0;
260}
261
262/* 4k PMEM used for exchanging acdb device config tables
263 * and stream format descriptions with the DSP.
264 */
265static char *audio_data;
266static int32_t audio_phys;
267
268#define SESSION_MIN 0
269#define SESSION_MAX 64
270
271static DEFINE_MUTEX(session_lock);
272static DEFINE_MUTEX(audio_lock);
273
274static struct audio_client *session[SESSION_MAX];
275
276static int session_alloc(struct audio_client *ac)
277{
278 int n;
279
280 mutex_lock(&session_lock);
281 for (n = SESSION_MIN; n < SESSION_MAX; n++) {
282 if (!session[n]) {
283 session[n] = ac;
284 mutex_unlock(&session_lock);
285 pr_debug("[%s:%s] session = %d\n", __MM_FILE__,
286 __func__, n);
287 return n;
288 }
289 }
290 mutex_unlock(&session_lock);
291 return -ENOMEM;
292}
293
294static void session_free(int n, struct audio_client *ac)
295{
296 mutex_lock(&session_lock);
297 if (session[n] == ac) {
298 session[n] = 0;
299 pr_debug("[%s:%s] session = %d\n", __MM_FILE__, __func__, n);
300 }
301 mutex_unlock(&session_lock);
302}
303
304static void audio_client_free(struct audio_client *ac)
305{
306 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
307 session_free(ac->session, ac);
308
309 if (ac->buf[0].data) {
310 iounmap(ac->buf[0].data);
311 pmem_kfree(ac->buf[0].phys);
312 }
313 if (ac->buf[1].data) {
314 iounmap(ac->buf[1].data);
315 pmem_kfree(ac->buf[1].phys);
316 }
317 kfree(ac);
318}
319
320static struct audio_client *audio_client_alloc(unsigned bufsz)
321{
322 struct audio_client *ac;
323 int n;
324
325 pr_debug("[%s:%s] bufsz = %d\n", __MM_FILE__, __func__, bufsz);
326 ac = kzalloc(sizeof(*ac), GFP_KERNEL);
327 if (!ac)
328 return 0;
329
330 n = session_alloc(ac);
331 if (n < 0)
332 goto fail_session;
333 ac->session = n;
334
335 if (bufsz > 0) {
336 ac->buf[0].phys = pmem_kalloc(bufsz,
337 PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K);
338 ac->buf[0].data = ioremap(ac->buf[0].phys, bufsz);
339 if (!ac->buf[0].data)
340 goto fail;
341 ac->buf[1].phys = pmem_kalloc(bufsz,
342 PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K);
343 ac->buf[1].data = ioremap(ac->buf[1].phys, bufsz);
344 if (!ac->buf[1].data)
345 goto fail;
346
347 ac->buf[0].size = bufsz;
348 ac->buf[1].size = bufsz;
349 }
350
351 init_waitqueue_head(&ac->wait);
352 ac->client = adsp;
353
354 return ac;
355
356fail:
357 session_free(n, ac);
358fail_session:
359 audio_client_free(ac);
360 return 0;
361}
362
363void audio_client_dump(struct audio_client *ac)
364{
365 dal_trace_dump(ac->client);
366}
367
368static int audio_ioctl(struct audio_client *ac, void *ptr, uint32_t len)
369{
370 struct adsp_command_hdr *hdr = ptr;
371 uint32_t tmp;
372 int r;
373
374 hdr->size = len - sizeof(u32);
375 hdr->dst = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_DSP);
376 hdr->src = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_APP);
377 hdr->context = ac->session;
378 ac->cb_status = -EBUSY;
379 r = dal_call(ac->client, AUDIO_OP_CONTROL, 5, ptr, len, &tmp, sizeof(tmp));
380 if (r != 4)
381 return -EIO;
382 if (!wait_event_timeout(ac->wait, (ac->cb_status != -EBUSY), 5*HZ)) {
383 dal_trace_dump(ac->client);
384 pr_err("[%s:%s] timeout. dsp dead?\n", __MM_FILE__, __func__);
385 q6audio_dsp_not_responding();
386 }
387 return ac->cb_status;
388}
389
390static int audio_command(struct audio_client *ac, uint32_t cmd)
391{
392 struct adsp_command_hdr rpc;
393 memset(&rpc, 0, sizeof(rpc));
394 rpc.opcode = cmd;
395 return audio_ioctl(ac, &rpc, sizeof(rpc));
396}
397
398static int audio_open_control(struct audio_client *ac)
399{
400 struct adsp_open_command rpc;
401
402 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
403 memset(&rpc, 0, sizeof(rpc));
404 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_DEVICE;
405 return audio_ioctl(ac, &rpc, sizeof(rpc));
406}
407
408static int audio_out_open(struct audio_client *ac, uint32_t bufsz,
409 uint32_t rate, uint32_t channels)
410{
411 struct adsp_open_command rpc;
412
413 memset(&rpc, 0, sizeof(rpc));
414
415 rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM;
416 rpc.format.standard.channels = channels;
417 rpc.format.standard.bits_per_sample = 16;
418 rpc.format.standard.sampling_rate = rate;
419 rpc.format.standard.is_signed = 1;
420 rpc.format.standard.is_interleaved = 1;
421
422 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE;
423 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
424 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK;
425 rpc.buf_max_size = bufsz;
426
427 pr_debug("[%s:%s]ac = %p\n", __MM_FILE__, __func__, ac);
428 return audio_ioctl(ac, &rpc, sizeof(rpc));
429}
430
431static int audio_in_open(struct audio_client *ac, uint32_t bufsz,
432 uint32_t flags, uint32_t rate, uint32_t channels)
433{
434 struct adsp_open_command rpc;
435
436 memset(&rpc, 0, sizeof(rpc));
437
438 rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM;
439 rpc.format.standard.channels = channels;
440 rpc.format.standard.bits_per_sample = 16;
441 rpc.format.standard.sampling_rate = rate;
442 rpc.format.standard.is_signed = 1;
443 rpc.format.standard.is_interleaved = 1;
444
445 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ;
446 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
447 if (flags == AUDIO_FLAG_READ)
448 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD;
449 else
450 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD;
451
452 rpc.buf_max_size = bufsz;
453
454 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
455 return audio_ioctl(ac, &rpc, sizeof(rpc));
456}
457
458static int audio_auxpcm_out_open(struct audio_client *ac,
459 uint32_t rate, uint32_t channels)
460{
461 struct adsp_open_command rpc;
462
463 memset(&rpc, 0, sizeof(rpc));
464
465 rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM;
466 rpc.format.standard.channels = channels;
467 rpc.format.standard.bits_per_sample = 16;
468 rpc.format.standard.sampling_rate = rate;
469 rpc.format.standard.is_signed = 1;
470 rpc.format.standard.is_interleaved = 1;
471
472 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ;
473 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
474 rpc.mode = ADSP_AUDIO_OPEN_STREAM_MODE_AUX_PCM;
475 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD;
476
477 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
478 return audio_ioctl(ac, &rpc, sizeof(rpc));
479}
480
481static int audio_auxpcm_in_open(struct audio_client *ac, uint32_t rate,
482 uint32_t channels)
483{
484 struct adsp_open_command rpc;
485
486 memset(&rpc, 0, sizeof(rpc));
487
488 rpc.format.standard.format = ADSP_AUDIO_FORMAT_PCM;
489 rpc.format.standard.channels = channels;
490 rpc.format.standard.bits_per_sample = 16;
491 rpc.format.standard.sampling_rate = rate;
492 rpc.format.standard.is_signed = 1;
493 rpc.format.standard.is_interleaved = 1;
494
495 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE;
496 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
497 rpc.mode = ADSP_AUDIO_OPEN_STREAM_MODE_AUX_PCM;
498 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK;
499
500 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
501 return audio_ioctl(ac, &rpc, sizeof(rpc));
502}
503
504static int audio_mp3_open(struct audio_client *ac, uint32_t bufsz,
505 uint32_t rate, uint32_t channels)
506{
507 struct adsp_open_command rpc;
508
509 memset(&rpc, 0, sizeof(rpc));
510
511 rpc.format.standard.format = ADSP_AUDIO_FORMAT_MP3;
512 rpc.format.standard.channels = channels;
513 rpc.format.standard.bits_per_sample = 16;
514 rpc.format.standard.sampling_rate = rate;
515 rpc.format.standard.is_signed = 1;
516 rpc.format.standard.is_interleaved = 0;
517
518 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE;
519 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
520 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK;
521 rpc.buf_max_size = bufsz;
522
523 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
524 return audio_ioctl(ac, &rpc, sizeof(rpc));
525}
526
527static int audio_dtmf_open(struct audio_client *ac,
528 uint32_t rate, uint32_t channels)
529{
530 struct adsp_open_command rpc;
531
532 memset(&rpc, 0, sizeof(rpc));
533
534 rpc.format.standard.format = ADSP_AUDIO_FORMAT_DTMF;
535 rpc.format.standard.channels = channels;
536 rpc.format.standard.bits_per_sample = 16;
537 rpc.format.standard.sampling_rate = rate;
538 rpc.format.standard.is_signed = 1;
539 rpc.format.standard.is_interleaved = 0;
540
541 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_WRITE;
542 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
543 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_PLAYBACK;
544
545 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
546 return audio_ioctl(ac, &rpc, sizeof(rpc));
547}
548
549static int audio_aac_open(struct audio_client *ac, uint32_t bufsz,
550 uint32_t sample_rate, uint32_t channels,
551 uint32_t bit_rate, uint32_t flags,
552 uint32_t stream_format)
553{
554 struct adsp_open_command rpc;
555 int audio_object_type;
556 int index = sizeof(u32);
557 u32 *aac_type = NULL;
558
559 memset(&rpc, 0, sizeof(rpc));
560
561 rpc.format.binary.format = ADSP_AUDIO_FORMAT_MPEG4_AAC;
562 /* only 48k sample rate is supported */
563 sample_rate = 3;
564 /* AAC OBJECT LC */
565 audio_object_type = 2;
566
567 aac_type = (u32 *)rpc.format.binary.data;
568 switch (stream_format) {
569 case AUDIO_AAC_FORMAT_ADTS:
570 /* AAC Encoder expect MPEG4_ADTS media type */
571 *aac_type = ADSP_AUDIO_AAC_MPEG4_ADTS;
572 break;
573 case AUDIO_AAC_FORMAT_RAW:
574 /* for ADIF recording */
575 *aac_type = ADSP_AUDIO_AAC_RAW;
576 break;
577 }
578
579 rpc.format.binary.data[index++] = (u8)(
580 ((audio_object_type & 0x1F) << 3) |
581 ((sample_rate >> 1) & 0x7));
582 rpc.format.binary.data[index] = (u8)(
583 ((sample_rate & 0x1) << 7) |
584 ((channels & 0x7) << 3));
585 rpc.format.binary.num_bytes = index + 1;
586 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ;
587 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
588
589 if (flags == AUDIO_FLAG_READ)
590 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD;
591 else
592 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD;
593
594 rpc.buf_max_size = bufsz;
595 rpc.config.aac.bit_rate = bit_rate;
596 rpc.config.aac.encoder_mode = ADSP_AUDIO_ENC_AAC_LC_ONLY_MODE;
597 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
598 return audio_ioctl(ac, &rpc, sizeof(rpc));
599}
600
601static int audio_qcp_open(struct audio_client *ac, uint32_t bufsz,
602 uint32_t min_rate, uint32_t max_rate,
603 uint32_t flags, uint32_t format)
604{
605 struct adsp_open_command rpc;
606
607 memset(&rpc, 0, sizeof(rpc));
608
609 rpc.format.standard.format = format;
610 rpc.format.standard.channels = 1;
611 rpc.format.standard.bits_per_sample = 16;
612 rpc.format.standard.sampling_rate = 8000;
613 rpc.format.standard.is_signed = 1;
614 rpc.format.standard.is_interleaved = 0;
615
616 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ;
617 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
618
619 if (flags == AUDIO_FLAG_READ)
620 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD;
621 else
622 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD;
623 rpc.buf_max_size = bufsz;
624 rpc.config.evrc.min_rate = min_rate;
625 rpc.config.evrc.max_rate = max_rate;
626
627 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
628 return audio_ioctl(ac, &rpc, sizeof(rpc));
629}
630
631static int audio_amrnb_open(struct audio_client *ac, uint32_t bufsz,
632 uint32_t enc_mode, uint32_t flags,
633 uint32_t dtx_enable)
634{
635 struct adsp_open_command rpc;
636
637 memset(&rpc, 0, sizeof(rpc));
638
639 rpc.format.standard.format = ADSP_AUDIO_FORMAT_AMRNB_FS;
640 rpc.format.standard.channels = 1;
641 rpc.format.standard.bits_per_sample = 16;
642 rpc.format.standard.sampling_rate = 8000;
643 rpc.format.standard.is_signed = 1;
644 rpc.format.standard.is_interleaved = 0;
645
646 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_OPEN_READ;
647 rpc.device = ADSP_AUDIO_DEVICE_ID_DEFAULT;
648
649 if (flags == AUDIO_FLAG_READ)
650 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_RECORD;
651 else
652 rpc.stream_context = ADSP_AUDIO_DEVICE_CONTEXT_MIXED_RECORD;
653
654 rpc.buf_max_size = bufsz;
655 rpc.config.amr.mode = enc_mode;
656 rpc.config.amr.dtx_mode = dtx_enable;
657 rpc.config.amr.enable = 1;
658
659 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
660 return audio_ioctl(ac, &rpc, sizeof(rpc));
661}
662
663
664
665static int audio_close(struct audio_client *ac)
666{
667 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
668 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_STREAM_STOP);
669 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_CLOSE);
670 return 0;
671}
672
673static int audio_set_table(struct audio_client *ac,
674 uint32_t device_id, int size)
675{
676 struct adsp_set_dev_cfg_table_command rpc;
677
678 memset(&rpc, 0, sizeof(rpc));
679 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_SET_DEVICE_CONFIG_TABLE;
680 if (q6_device_to_dir(device_id) == Q6_TX) {
681 if (tx_clk_freq > 16000)
682 rpc.hdr.data = 48000;
683 else if (tx_clk_freq > 8000)
684 rpc.hdr.data = 16000;
685 else
686 rpc.hdr.data = 8000;
687 }
688 rpc.device_id = device_id;
689 rpc.phys_addr = audio_phys;
690 rpc.phys_size = size;
691 rpc.phys_used = size;
692
693 pr_debug("[%s:%s] ac = %p, device_id = 0x%x, size = %d\n", __MM_FILE__,
694 __func__, ac, device_id, size);
695 return audio_ioctl(ac, &rpc, sizeof(rpc));
696}
697
698int q6audio_read(struct audio_client *ac, struct audio_buffer *ab)
699{
700 struct adsp_buffer_command rpc;
701 uint32_t res;
702 int r;
703
704 memset(&rpc, 0, sizeof(rpc));
705 rpc.hdr.size = sizeof(rpc) - sizeof(u32);
706 rpc.hdr.dst = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_DSP);
707 rpc.hdr.src = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_APP);
708 rpc.hdr.context = ac->session;
709 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DATA_TX;
710 rpc.buffer.addr = ab->phys;
711 rpc.buffer.max_size = ab->size;
712 rpc.buffer.actual_size = ab->actual_size;
713
714 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
715 r = dal_call(ac->client, AUDIO_OP_DATA, 5, &rpc, sizeof(rpc),
716 &res, sizeof(res));
717 return 0;
718}
719
720int q6audio_write(struct audio_client *ac, struct audio_buffer *ab)
721{
722 struct adsp_buffer_command rpc;
723 uint32_t res;
724 int r;
725
726 memset(&rpc, 0, sizeof(rpc));
727 rpc.hdr.size = sizeof(rpc) - sizeof(u32);
728 rpc.hdr.dst = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_DSP);
729 rpc.hdr.src = AUDIO_ADDR(ac->session, 0, AUDIO_DOMAIN_APP);
730 rpc.hdr.context = ac->session;
731 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DATA_RX;
732 rpc.buffer.addr = ab->phys;
733 rpc.buffer.max_size = ab->size;
734 rpc.buffer.actual_size = ab->actual_size;
735
736 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
737 r = dal_call(ac->client, AUDIO_OP_DATA, 5, &rpc, sizeof(rpc),
738 &res, sizeof(res));
739 return 0;
740}
741
742static int audio_rx_volume(struct audio_client *ac, uint32_t dev_id, int32_t volume)
743{
744 struct adsp_set_dev_volume_command rpc;
745
746 pr_debug("[%s:%s] volume = %d\n", __MM_FILE__, __func__, volume);
747 memset(&rpc, 0, sizeof(rpc));
748 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_VOL;
749 rpc.device_id = dev_id;
750 rpc.path = ADSP_PATH_RX;
751 rpc.volume = volume;
752 return audio_ioctl(ac, &rpc, sizeof(rpc));
753}
754
755static int audio_rx_mute(struct audio_client *ac, uint32_t dev_id, int mute)
756{
757 struct adsp_set_dev_mute_command rpc;
758
759 pr_debug("[%s:%s] mute = %d, dev_id = 0x%x\n", __MM_FILE__,
760 __func__, mute, dev_id);
761 memset(&rpc, 0, sizeof(rpc));
762 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE;
763 rpc.device_id = dev_id;
764 rpc.path = ADSP_PATH_RX;
765 rpc.mute = !!mute;
766 return audio_ioctl(ac, &rpc, sizeof(rpc));
767}
768
769static int audio_tx_mute(struct audio_client *ac, uint32_t dev_id, int mute)
770{
771 struct adsp_set_dev_mute_command rpc;
772
773 pr_debug("[%s:%s] mute = %d\n", __MM_FILE__, __func__, mute);
774 if (mute < 0 || mute > 3) {
775 pr_err("[%s:%s] invalid mute status %d\n", __MM_FILE__,
776 __func__, mute);
777 return -EINVAL;
778 }
779
780 memset(&rpc, 0, sizeof(rpc));
781 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_DEVICE_MUTE;
782 if ((mute == STREAM_UNMUTE) || (mute == STREAM_MUTE)) {
783 rpc.device_id = ADSP_AUDIO_DEVICE_ID_VOICE;
784 rpc.path = ADSP_PATH_TX_CNG_DIS;
785 } else {
786 rpc.device_id = dev_id;
787 rpc.path = ADSP_PATH_TX;
788 }
789 mute &= 0x01;
790 rpc.mute = !!mute;
791 return audio_ioctl(ac, &rpc, sizeof(rpc));
792}
793
794static int audio_stream_volume(struct audio_client *ac, int volume)
795{
796 struct adsp_set_volume_command rpc;
797 int rc;
798
799 pr_debug("[%s:%s] volume = %d\n", __MM_FILE__, __func__, volume);
800 memset(&rpc, 0, sizeof(rpc));
801 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_STREAM_VOL;
802 rpc.volume = volume;
803 rc = audio_ioctl(ac, &rpc, sizeof(rpc));
804 return rc;
805}
806
807static int audio_stream_mute(struct audio_client *ac, int mute)
808{
809 struct adsp_set_mute_command rpc;
810 int rc;
811
812 pr_debug("[%s:%s] mute = %d\n", __MM_FILE__, __func__, mute);
813 memset(&rpc, 0, sizeof(rpc));
814 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SET_STREAM_MUTE;
815 rpc.mute = mute;
816 rc = audio_ioctl(ac, &rpc, sizeof(rpc));
817 return rc;
818}
819
820static void callback(void *data, int len, void *cookie)
821{
822 struct adsp_event_hdr *e = data;
823 struct audio_client *ac;
824 struct adsp_buffer_event *abe = data;
825
826 if (e->context >= SESSION_MAX) {
827 pr_err("[%s:%s] bogus session %d\n", __MM_FILE__, __func__,
828 e->context);
829 return;
830 }
831 ac = session[e->context];
832 if (!ac) {
833 pr_err("[%s:%s] unknown session %d\n", __MM_FILE__, __func__,
834 e->context);
835 return;
836 }
837
838 if (e->event_id == ADSP_AUDIO_IOCTL_CMD_STREAM_EOS) {
839 pr_debug("[%s:%s] CB Stream eos, ac = %p\n",
840 __MM_FILE__, __func__, ac);
841 if (e->status)
842 pr_err("[%s:%s] playback status %d\n", __MM_FILE__,
843 __func__, e->status);
844 if (ac->cb_status == -EBUSY) {
845 ac->cb_status = e->status;
846 wake_up(&ac->wait);
847 }
848 return;
849 }
850
851 if (e->event_id == ADSP_AUDIO_EVT_STATUS_BUF_DONE) {
852 pr_debug("[%s:%s] CB done, ac = %p, status = %d\n",
853 __MM_FILE__, __func__, ac, e->status);
854 if (e->status)
855 pr_err("[%s:%s] buffer status %d\n", __MM_FILE__,
856 __func__, e->status);
857
858 ac->buf[ac->dsp_buf].actual_size = abe->buffer.actual_size;
859 ac->buf[ac->dsp_buf].used = 0;
860 ac->dsp_buf ^= 1;
861 wake_up(&ac->wait);
862 return;
863 }
864
865 pr_debug("[%s:%s] ac = %p, event_id = 0x%x, status = %d\n",
866 __MM_FILE__, __func__, ac, e->event_id, e->status);
867 if (e->status)
868 pr_warning("audio_cb: s=%d e=%08x status=%d\n",
869 e->context, e->event_id, e->status);
870 if (ac->cb_status == -EBUSY) {
871 ac->cb_status = e->status;
872 wake_up(&ac->wait);
873 }
874}
875
876static void audio_init(struct dal_client *client)
877{
878 u32 tmp[3];
879
880 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
881 tmp[0] = 2 * sizeof(u32);
882 tmp[1] = 0;
883 tmp[2] = 0;
884 dal_call(client, AUDIO_OP_INIT, 5, tmp, sizeof(tmp),
885 tmp, sizeof(u32));
886}
887
888static struct audio_client *ac_control;
889
890static int q6audio_init(void)
891{
892 struct audio_client *ac = 0;
893 int res;
894
895 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
896 mutex_lock(&audio_lock);
897 if (ac_control) {
898 res = 0;
899 goto done;
900 }
901
902 pr_info("[%s:%s] codecs\n", __MM_FILE__, __func__);
903 icodec_rx_clk = clk_get(0, "icodec_rx_clk");
904 icodec_tx_clk = clk_get(0, "icodec_tx_clk");
905 ecodec_clk = clk_get(0, "ecodec_clk");
906 sdac_clk = clk_get(0, "sdac_clk");
907 audio_phys = pmem_kalloc(4096, PMEM_MEMTYPE_EBI1|PMEM_ALIGNMENT_4K);
908 audio_data = ioremap(audio_phys, 4096);
909
910 pr_info("[%s:%s] attach ADSP\n", __MM_FILE__, __func__);
911 adsp = dal_attach(AUDIO_DAL_DEVICE, AUDIO_DAL_PORT, 1,
912 callback, 0);
913 if (!adsp) {
914 pr_err("[%s:%s] cannot attach to adsp\n", __MM_FILE__,
915 __func__);
916 res = -ENODEV;
917 goto done;
918 }
919 pr_info("[%s:%s] INIT\n", __MM_FILE__, __func__);
920 audio_init(adsp);
921 dal_trace(adsp);
922
923 ac = audio_client_alloc(0);
924 if (!ac) {
925 pr_err("[%s:%s] cannot allocate client\n",
926 __MM_FILE__, __func__);
927 res = -ENOMEM;
928 goto done;
929 }
930
931 pr_info("[%s:%s] OPEN control\n", __MM_FILE__, __func__);
932 if (audio_open_control(ac)) {
933 pr_err("[%s:%s] cannot open control channel\n",
934 __MM_FILE__, __func__);
935 res = -ENODEV;
936 goto done;
937 }
938
939 pr_info("[%s:%s] attach ACDB\n", __MM_FILE__, __func__);
940 acdb = dal_attach(ACDB_DAL_DEVICE, ACDB_DAL_PORT, 0, 0, 0);
941 if (!acdb) {
942 pr_err("[%s:%s] cannot attach to acdb channel\n",
943 __MM_FILE__, __func__);
944 res = -ENODEV;
945 goto done;
946 }
947
948 pr_info("[%s:%s] attach ADIE\n", __MM_FILE__, __func__);
949 adie = dal_attach(ADIE_DAL_DEVICE, ADIE_DAL_PORT, 0, 0, 0);
950 if (!adie) {
951 pr_err("[%s:%s] cannot attach to adie\n",
952 __MM_FILE__, __func__);
953 res = -ENODEV;
954 goto done;
955 }
956 if (analog_ops->init)
957 analog_ops->init();
958
959 res = 0;
960 ac_control = ac;
961
962 wake_lock_init(&idlelock, WAKE_LOCK_IDLE, "audio_pcm_idle");
963 wake_lock_init(&wakelock, WAKE_LOCK_SUSPEND, "audio_pcm_suspend");
964done:
965 if ((res < 0) && ac)
966 audio_client_free(ac);
967 mutex_unlock(&audio_lock);
968
969 pr_debug("[%s:%s] res = %d\n", __MM_FILE__, __func__, res);
970 return res;
971}
972
973struct audio_config_data {
974 uint32_t device_id;
975 uint32_t sample_rate;
976 uint32_t offset;
977 uint32_t length;
978};
979
980struct audio_config_database {
981 uint8_t magic[8];
982 uint32_t entry_count;
983 uint32_t unused;
984 struct audio_config_data entry[0];
985};
986
987void *acdb_data;
988const struct firmware *acdb_fw;
989extern struct miscdevice q6_control_device;
990
991static int acdb_get_config_table(uint32_t device_id, uint32_t sample_rate)
992{
993 struct acdb_cmd_device_table rpc;
994 struct acdb_result res;
995 int r;
996
997 pr_debug("[%s:%s] device_id = 0x%x, samplerate = %d\n", __MM_FILE__,
998 __func__, device_id, sample_rate);
999 if (q6audio_init())
1000 return 0;
1001
1002 memset(audio_data, 0, 4096);
1003 memset(&rpc, 0, sizeof(rpc));
1004
1005 rpc.size = sizeof(rpc) - (2 * sizeof(uint32_t));
1006 rpc.command_id = ACDB_GET_DEVICE_TABLE;
1007 rpc.device_id = device_id;
1008 rpc.sample_rate_id = sample_rate;
1009 rpc.total_bytes = 4096;
1010 rpc.unmapped_buf = audio_phys;
1011 rpc.res_size = sizeof(res) - (2 * sizeof(uint32_t));
1012
1013 r = dal_call(acdb, ACDB_OP_IOCTL, 8, &rpc, sizeof(rpc),
1014 &res, sizeof(res));
1015
1016 if ((r == sizeof(res)) && (res.dal_status == 0))
1017 return res.used_bytes;
1018
1019 return -EIO;
1020}
1021
1022static uint32_t audio_rx_path_id = ADIE_PATH_HANDSET_RX;
1023static uint32_t audio_rx_device_id = ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR;
1024static uint32_t audio_rx_device_group = -1;
1025static uint32_t audio_tx_path_id = ADIE_PATH_HANDSET_TX;
1026static uint32_t audio_tx_device_id = ADSP_AUDIO_DEVICE_ID_HANDSET_MIC;
1027static uint32_t audio_tx_device_group = -1;
1028
1029static int qdsp6_devchg_notify(struct audio_client *ac,
1030 uint32_t dev_type, uint32_t dev_id)
1031{
1032 struct adsp_device_switch_command rpc;
1033
1034 if (dev_type != ADSP_AUDIO_RX_DEVICE &&
1035 dev_type != ADSP_AUDIO_TX_DEVICE)
1036 return -EINVAL;
1037
1038 memset(&rpc, 0, sizeof(rpc));
1039 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_PREPARE;
1040 if (dev_type == ADSP_AUDIO_RX_DEVICE) {
1041 rpc.old_device = audio_rx_device_id;
1042 rpc.new_device = dev_id;
1043 } else {
1044 rpc.old_device = audio_tx_device_id;
1045 rpc.new_device = dev_id;
1046 }
1047 rpc.device_class = 0;
1048 rpc.device_type = dev_type;
1049 pr_debug("[%s:%s] dev_id = 0x%x\n", __MM_FILE__, __func__, dev_id);
1050 return audio_ioctl(ac, &rpc, sizeof(rpc));
1051}
1052
1053static int qdsp6_standby(struct audio_client *ac)
1054{
1055 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1056 return audio_command(ac, ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_STANDBY);
1057}
1058
1059static int qdsp6_start(struct audio_client *ac)
1060{
1061 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1062 return audio_command(ac, ADSP_AUDIO_IOCTL_CMD_DEVICE_SWITCH_COMMIT);
1063}
1064
1065static void audio_rx_analog_enable(int en)
1066{
1067 pr_debug("[%s:%s] audio_rx_device_id = 0x%x, en = %d\n", __MM_FILE__,
1068 __func__, audio_rx_device_id, en);
1069 switch (audio_rx_device_id) {
1070 case ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_MONO:
1071 case ADSP_AUDIO_DEVICE_ID_HEADSET_SPKR_STEREO:
1072 case ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_SPKR:
1073 if (analog_ops->headset_enable)
1074 analog_ops->headset_enable(en);
1075 break;
1076 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_MONO_HEADSET:
1077 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO_W_STEREO_HEADSET:
1078 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_MONO_HEADSET:
1079 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO_W_STEREO_HEADSET:
1080 if (analog_ops->headset_enable)
1081 analog_ops->headset_enable(en);
1082 if (analog_ops->speaker_enable)
1083 analog_ops->speaker_enable(en);
1084 break;
1085 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MONO:
1086 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_STEREO:
1087 if (analog_ops->speaker_enable)
1088 analog_ops->speaker_enable(en);
1089 break;
1090 case ADSP_AUDIO_DEVICE_ID_BT_SCO_SPKR:
1091 if (analog_ops->bt_sco_enable)
1092 analog_ops->bt_sco_enable(en);
1093 break;
1094 case ADSP_AUDIO_DEVICE_ID_HANDSET_SPKR:
1095 if (analog_ops->receiver_enable)
1096 analog_ops->receiver_enable(en);
1097 break;
1098 }
1099}
1100
1101static void audio_tx_analog_enable(int en)
1102{
1103 pr_debug("[%s:%s] audio_tx_device_id = 0x%x, en = %d\n", __MM_FILE__,
1104 __func__, audio_tx_device_id, en);
1105 switch (audio_tx_device_id) {
1106 case ADSP_AUDIO_DEVICE_ID_HANDSET_MIC:
1107 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_MIC:
1108 if (analog_ops->int_mic_enable)
1109 analog_ops->int_mic_enable(en);
1110 break;
1111 case ADSP_AUDIO_DEVICE_ID_HEADSET_MIC:
1112 case ADSP_AUDIO_DEVICE_ID_TTY_HEADSET_MIC:
1113 case ADSP_AUDIO_DEVICE_ID_HANDSET_DUAL_MIC:
1114 case ADSP_AUDIO_DEVICE_ID_SPKR_PHONE_DUAL_MIC:
1115 if (analog_ops->ext_mic_enable)
1116 analog_ops->ext_mic_enable(en);
1117 break;
1118 case ADSP_AUDIO_DEVICE_ID_BT_SCO_MIC:
1119 if (analog_ops->bt_sco_enable)
1120 analog_ops->bt_sco_enable(en);
1121 break;
1122 }
1123}
1124
1125static int audio_update_acdb(uint32_t adev, uint32_t acdb_id)
1126{
1127 uint32_t sample_rate;
1128 int sz;
1129
1130 pr_debug("[%s:%s] adev = 0x%x, acdb_id = 0x%x\n", __MM_FILE__,
1131 __func__, adev, acdb_id);
1132 if (q6_device_to_dir(adev) == Q6_RX) {
1133 rx_acdb = acdb_id;
1134 sample_rate = q6_device_to_rate(adev);
1135 } else {
1136
1137 tx_acdb = acdb_id;
1138 if (tx_clk_freq > 16000)
1139 sample_rate = 48000;
1140 else if (tx_clk_freq > 8000)
1141 sample_rate = 16000;
1142 else
1143 sample_rate = 8000;
1144 }
1145
1146 if (acdb_id == 0)
1147 acdb_id = q6_device_to_cad_id(adev);
1148
1149 sz = acdb_get_config_table(acdb_id, sample_rate);
1150 audio_set_table(ac_control, adev, sz);
1151
1152 return 0;
1153}
1154
1155static void adie_rx_path_enable(uint32_t acdb_id)
1156{
1157 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1158 if (audio_rx_path_id) {
1159 adie_enable();
1160 adie_set_path(adie, audio_rx_path_id, ADIE_PATH_RX);
1161 adie_set_path_freq_plan(adie, ADIE_PATH_RX, 48000);
1162
1163 adie_proceed_to_stage(adie, ADIE_PATH_RX,
1164 ADIE_STAGE_DIGITAL_READY);
1165 adie_proceed_to_stage(adie, ADIE_PATH_RX,
1166 ADIE_STAGE_DIGITAL_ANALOG_READY);
1167 }
1168}
1169
1170static void q6_rx_path_enable(int reconf, uint32_t acdb_id)
1171{
1172 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1173 if (!reconf)
1174 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, audio_rx_device_id);
1175 audio_update_acdb(audio_rx_device_id, acdb_id);
1176 qdsp6_standby(ac_control);
1177 qdsp6_start(ac_control);
1178}
1179
1180static void _audio_rx_path_enable(int reconf, uint32_t acdb_id)
1181{
1182 pr_debug("[%s:%s] reconf = %d\n", __MM_FILE__, __func__, reconf);
1183 q6_rx_path_enable(reconf, acdb_id);
1184 if (audio_rx_path_id)
1185 adie_rx_path_enable(acdb_id);
1186 audio_rx_analog_enable(1);
1187}
1188
1189static void _audio_tx_path_enable(int reconf, uint32_t acdb_id)
1190{
1191 pr_debug("[%s:%s] reconf = %d, tx_clk_freq = %d\n", __MM_FILE__,
1192 __func__, reconf, tx_clk_freq);
1193 audio_tx_analog_enable(1);
1194
1195 if (audio_tx_path_id) {
1196 adie_enable();
1197 adie_set_path(adie, audio_tx_path_id, ADIE_PATH_TX);
1198
1199 if (tx_clk_freq > 16000)
1200 adie_set_path_freq_plan(adie, ADIE_PATH_TX, 48000);
1201 else if (tx_clk_freq > 8000)
1202 adie_set_path_freq_plan(adie, ADIE_PATH_TX, 16000);
1203 else
1204 adie_set_path_freq_plan(adie, ADIE_PATH_TX, 8000);
1205
1206 adie_proceed_to_stage(adie, ADIE_PATH_TX,
1207 ADIE_STAGE_DIGITAL_READY);
1208 adie_proceed_to_stage(adie, ADIE_PATH_TX,
1209 ADIE_STAGE_DIGITAL_ANALOG_READY);
1210 }
1211
1212
1213 if (!reconf)
1214 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE,
1215 audio_tx_device_id);
1216 audio_update_acdb(audio_tx_device_id, acdb_id);
1217 qdsp6_standby(ac_control);
1218 qdsp6_start(ac_control);
1219
1220 audio_tx_mute(ac_control, audio_tx_device_id, tx_mute_status);
1221}
1222
1223static void _audio_rx_path_disable(void)
1224{
1225 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1226 audio_rx_analog_enable(0);
1227
1228 if (audio_rx_path_id) {
1229 adie_proceed_to_stage(adie, ADIE_PATH_RX,
1230 ADIE_STAGE_ANALOG_OFF);
1231 adie_proceed_to_stage(adie, ADIE_PATH_RX,
1232 ADIE_STAGE_DIGITAL_OFF);
1233 adie_disable();
1234 }
1235}
1236
1237static void _audio_tx_path_disable(void)
1238{
1239 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1240 audio_tx_analog_enable(0);
1241
1242 if (audio_tx_path_id) {
1243 adie_proceed_to_stage(adie, ADIE_PATH_TX,
1244 ADIE_STAGE_ANALOG_OFF);
1245 adie_proceed_to_stage(adie, ADIE_PATH_TX,
1246 ADIE_STAGE_DIGITAL_OFF);
1247 adie_disable();
1248 }
1249}
1250
1251static int icodec_rx_clk_refcount;
1252static int icodec_tx_clk_refcount;
1253static int ecodec_clk_refcount;
1254static int sdac_clk_refcount;
1255
1256static void ecodec_clk_enable(void)
1257{
1258 ecodec_clk_refcount++;
1259 if (ecodec_clk_refcount == 1) {
1260 clk_set_rate(ecodec_clk, 2048000);
1261 clk_enable(ecodec_clk);
1262 }
1263}
1264static void ecodec_clk_disable(int group_reset, int path)
1265{
1266 ecodec_clk_refcount--;
1267 if (ecodec_clk_refcount == 0) {
1268 clk_disable(ecodec_clk);
1269 if (group_reset) {
1270 if (path == ADSP_PATH_TX)
1271 audio_tx_device_group = -1;
1272 else
1273 audio_rx_device_group = -1;
1274 }
1275 }
1276}
1277static void _audio_rx_clk_enable(void)
1278{
1279 uint32_t device_group = q6_device_to_codec(audio_rx_device_id);
1280
1281 pr_debug("[%s:%s] rx_clk_refcount = %d\n", __MM_FILE__, __func__,
1282 icodec_rx_clk_refcount);
1283 switch(device_group) {
1284 case Q6_ICODEC_RX:
1285 icodec_rx_clk_refcount++;
1286 if (icodec_rx_clk_refcount == 1) {
1287 clk_set_rate(icodec_rx_clk, 12288000);
1288 clk_enable(icodec_rx_clk);
1289 }
1290 break;
1291 case Q6_ECODEC_RX:
1292 ecodec_clk_enable();
1293 break;
1294 case Q6_SDAC_RX:
1295 sdac_clk_refcount++;
1296 if (sdac_clk_refcount == 1) {
1297 clk_set_rate(sdac_clk, 12288000);
1298 clk_enable(sdac_clk);
1299 }
1300 break;
1301 default:
1302 return;
1303 }
1304 audio_rx_device_group = device_group;
1305}
1306
1307static void _audio_tx_clk_enable(void)
1308{
1309 uint32_t device_group = q6_device_to_codec(audio_tx_device_id);
1310 uint32_t icodec_tx_clk_rate;
1311
1312 pr_debug("[%s:%s] tx_clk_refcount = %d\n", __MM_FILE__, __func__,
1313 icodec_tx_clk_refcount);
1314 switch (device_group) {
1315 case Q6_ICODEC_TX:
1316 icodec_tx_clk_refcount++;
1317 if (icodec_tx_clk_refcount == 1) {
1318 if (tx_clk_freq > 16000)
1319 icodec_tx_clk_rate = 48000;
1320 else if (tx_clk_freq > 8000)
1321 icodec_tx_clk_rate = 16000;
1322 else
1323 icodec_tx_clk_rate = 8000;
1324
1325 clk_set_rate(icodec_tx_clk, icodec_tx_clk_rate * 256);
1326 clk_enable(icodec_tx_clk);
1327 }
1328 break;
1329 case Q6_ECODEC_TX:
1330 ecodec_clk_enable();
1331 break;
1332 case Q6_SDAC_TX:
1333 /* TODO: In QCT BSP, clk rate was set to 20480000 */
1334 sdac_clk_refcount++;
1335 if (sdac_clk_refcount == 1) {
1336 clk_set_rate(sdac_clk, 12288000);
1337 clk_enable(sdac_clk);
1338 }
1339 break;
1340 default:
1341 return;
1342 }
1343 audio_tx_device_group = device_group;
1344}
1345
1346static void _audio_rx_clk_disable(void)
1347{
1348 pr_debug("[%s:%s] rx_clk_refcount = %d\n", __MM_FILE__, __func__,
1349 icodec_rx_clk_refcount);
1350 switch (audio_rx_device_group) {
1351 case Q6_ICODEC_RX:
1352 icodec_rx_clk_refcount--;
1353 if (icodec_rx_clk_refcount == 0) {
1354 clk_disable(icodec_rx_clk);
1355 audio_rx_device_group = -1;
1356 }
1357 break;
1358 case Q6_ECODEC_RX:
1359 ecodec_clk_disable(1, ADSP_PATH_RX);
1360 break;
1361 case Q6_SDAC_RX:
1362 sdac_clk_refcount--;
1363 if (sdac_clk_refcount == 0) {
1364 clk_disable(sdac_clk);
1365 audio_rx_device_group = -1;
1366 }
1367 break;
1368 default:
1369 pr_err("[%s:%s] invalid rx device group %d\n", __MM_FILE__,
1370 __func__, audio_rx_device_group);
1371 break;
1372 }
1373}
1374
1375static void _audio_tx_clk_disable(void)
1376{
1377 pr_debug("[%s:%s] tx_clk_refcount = %d\n", __MM_FILE__, __func__,
1378 icodec_tx_clk_refcount);
1379 switch (audio_tx_device_group) {
1380 case Q6_ICODEC_TX:
1381 icodec_tx_clk_refcount--;
1382 if (icodec_tx_clk_refcount == 0) {
1383 clk_disable(icodec_tx_clk);
1384 audio_tx_device_group = -1;
1385 }
1386 break;
1387 case Q6_ECODEC_TX:
1388 ecodec_clk_disable(1, ADSP_PATH_TX);
1389 break;
1390 case Q6_SDAC_TX:
1391 sdac_clk_refcount--;
1392 if (sdac_clk_refcount == 0) {
1393 clk_disable(sdac_clk);
1394 audio_tx_device_group = -1;
1395 }
1396 break;
1397 default:
1398 pr_err("[%s:%s] invalid tx device group %d\n",
1399 __MM_FILE__, __func__, audio_tx_device_group);
1400 break;
1401 }
1402}
1403
1404static void _audio_rx_clk_reinit(uint32_t rx_device, uint32_t acdb_id)
1405{
1406 uint32_t device_group = q6_device_to_codec(rx_device);
1407
1408 pr_debug("[%s:%s] rx_device = 0x%x\n", __MM_FILE__, __func__,
1409 rx_device);
1410 if (device_group != audio_rx_device_group)
1411 _audio_rx_clk_disable();
1412
1413 audio_rx_device_id = rx_device;
1414 audio_rx_path_id = q6_device_to_path(rx_device, acdb_id);
1415
1416 if (device_group != audio_rx_device_group)
1417 _audio_rx_clk_enable();
1418
1419}
1420
1421static void _audio_tx_clk_reinit(uint32_t tx_device, uint32_t acdb_id)
1422{
1423 uint32_t device_group = q6_device_to_codec(tx_device);
1424
1425 pr_debug("[%s:%s] tx_device = 0x%x\n", __MM_FILE__, __func__,
1426 tx_device);
1427 if (device_group != audio_tx_device_group)
1428 _audio_tx_clk_disable();
1429
1430 audio_tx_device_id = tx_device;
1431 audio_tx_path_id = q6_device_to_path(tx_device, acdb_id);
1432
1433 if (device_group != audio_tx_device_group)
1434 _audio_tx_clk_enable();
1435}
1436
1437static DEFINE_MUTEX(audio_path_lock);
1438static int audio_rx_path_refcount;
1439static int audio_tx_path_refcount;
1440
1441static int audio_rx_path_enable(int en, uint32_t acdb_id)
1442{
1443 pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en);
1444 mutex_lock(&audio_path_lock);
1445 if (en) {
1446 audio_rx_path_refcount++;
1447 if (audio_rx_path_refcount == 1) {
1448 _audio_rx_clk_enable();
1449 _audio_rx_path_enable(0, acdb_id);
1450 }
1451 } else {
1452 audio_rx_path_refcount--;
1453 if (audio_rx_path_refcount == 0) {
1454 _audio_rx_path_disable();
1455 _audio_rx_clk_disable();
1456 }
1457 }
1458 mutex_unlock(&audio_path_lock);
1459 return 0;
1460}
1461
1462static int audio_tx_path_enable(int en, uint32_t acdb_id)
1463{
1464 pr_debug("[%s:%s] en = %d\n", __MM_FILE__, __func__, en);
1465 mutex_lock(&audio_path_lock);
1466 if (en) {
1467 audio_tx_path_refcount++;
1468 if (audio_tx_path_refcount == 1) {
1469 _audio_tx_clk_enable();
1470 _audio_tx_path_enable(0, acdb_id);
1471 }
1472 } else {
1473 audio_tx_path_refcount--;
1474 if (audio_tx_path_refcount == 0) {
1475 _audio_tx_path_disable();
1476 _audio_tx_clk_disable();
1477 }
1478 }
1479 mutex_unlock(&audio_path_lock);
1480 return 0;
1481}
1482
1483int q6audio_update_acdb(uint32_t id_src, uint32_t id_dst)
1484{
1485 int res;
1486
1487 pr_debug("[%s:%s] id_src = 0x%x\n, id_dst = 0x%x\n", __MM_FILE__,
1488 __func__, id_src, id_dst);
1489 if (q6audio_init())
1490 return 0;
1491
1492 mutex_lock(&audio_path_lock);
1493
1494 if (q6_device_to_dir(id_dst) == Q6_RX)
1495 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, id_dst);
1496 else
1497 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, id_dst);
1498 res = audio_update_acdb(id_dst, id_src);
1499 if (res)
1500 goto done;
1501
1502 qdsp6_standby(ac_control);
1503 qdsp6_start(ac_control);
1504done:
1505 mutex_unlock(&audio_path_lock);
1506 return res;
1507}
1508
1509int q6audio_set_tx_mute(int mute)
1510{
1511 uint32_t adev;
1512 int rc;
1513
1514 if (q6audio_init())
1515 return 0;
1516
1517 mutex_lock(&audio_path_lock);
1518
1519 if (mute == tx_mute_status) {
1520 mutex_unlock(&audio_path_lock);
1521 return 0;
1522 }
1523
1524 adev = audio_tx_device_id;
1525 rc = audio_tx_mute(ac_control, adev, mute);
1526
1527 /* DSP caches the requested MUTE state when it cannot apply the state
1528 immediately. In that case, it returns EUNSUPPORTED and applies the
1529 cached state later */
1530 if ((rc == ADSP_AUDIO_STATUS_SUCCESS) ||
1531 (rc == ADSP_AUDIO_STATUS_EUNSUPPORTED)) {
1532 pr_debug("[%s:%s] return status = %d\n",
1533 __MM_FILE__, __func__, rc);
1534 tx_mute_status = mute;
1535 }
1536 mutex_unlock(&audio_path_lock);
1537 return 0;
1538}
1539
1540int q6audio_set_stream_volume(struct audio_client *ac, int vol)
1541{
1542 if (vol > 1200 || vol < -4000) {
1543 pr_err("[%s:%s] unsupported volume level %d\n", __MM_FILE__,
1544 __func__, vol);
1545 return -EINVAL;
1546 }
1547 mutex_lock(&audio_path_lock);
1548 audio_stream_mute(ac, 0);
1549 audio_stream_volume(ac, vol);
1550 mutex_unlock(&audio_path_lock);
1551 return 0;
1552}
1553
1554int q6audio_set_rx_volume(int level)
1555{
1556 uint32_t adev;
1557 int vol;
1558
1559 pr_debug("[%s:%s] level = %d\n", __MM_FILE__, __func__, level);
1560 if (q6audio_init())
1561 return 0;
1562
1563 if (level < 0 || level > 100)
1564 return -EINVAL;
1565
1566 mutex_lock(&audio_path_lock);
1567 adev = ADSP_AUDIO_DEVICE_ID_VOICE;
1568
1569 if (level) {
1570 vol = q6_device_volume(audio_rx_device_id, level);
1571 audio_rx_mute(ac_control, adev, 0);
1572 audio_rx_volume(ac_control, adev, vol);
1573 } else
1574 audio_rx_mute(ac_control, adev, 1);
1575
1576 rx_vol_level = level;
1577 mutex_unlock(&audio_path_lock);
1578 return 0;
1579}
1580
1581static void do_rx_routing(uint32_t device_id, uint32_t acdb_id)
1582{
1583 pr_debug("[%s:%s] device_id = 0x%x, acdb_id = 0x%x\n", __MM_FILE__,
1584 __func__, device_id, acdb_id);
1585 if (device_id == audio_rx_device_id &&
1586 audio_rx_path_id == q6_device_to_path(device_id, acdb_id)) {
1587 if (acdb_id != rx_acdb) {
1588 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, device_id);
1589 audio_update_acdb(device_id, acdb_id);
1590 qdsp6_standby(ac_control);
1591 qdsp6_start(ac_control);
1592 }
1593 return;
1594 }
1595
1596 if (audio_rx_path_refcount > 0) {
1597 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE, device_id);
1598 _audio_rx_path_disable();
1599 _audio_rx_clk_reinit(device_id, acdb_id);
1600 _audio_rx_path_enable(1, acdb_id);
1601 } else {
1602 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_RX_DEVICE,
1603 device_id);
1604 audio_update_acdb(device_id, acdb_id);
1605 qdsp6_standby(ac_control);
1606 qdsp6_start(ac_control);
1607 audio_rx_device_id = device_id;
1608 audio_rx_path_id = q6_device_to_path(device_id, acdb_id);
1609 }
1610}
1611
1612static void do_tx_routing(uint32_t device_id, uint32_t acdb_id)
1613{
1614 pr_debug("[%s:%s] device_id = 0x%x, acdb_id = 0x%x\n", __MM_FILE__,
1615 __func__, device_id, acdb_id);
1616 if (device_id == audio_tx_device_id &&
1617 audio_tx_path_id == q6_device_to_path(device_id, acdb_id)) {
1618 if (acdb_id != tx_acdb) {
1619 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE,
1620 device_id);
1621 audio_update_acdb(device_id, acdb_id);
1622 qdsp6_standby(ac_control);
1623 qdsp6_start(ac_control);
1624 }
1625 return;
1626 }
1627
1628 if (audio_tx_path_refcount > 0) {
1629 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE, device_id);
1630 _audio_tx_path_disable();
1631 _audio_tx_clk_reinit(device_id, acdb_id);
1632 _audio_tx_path_enable(1, acdb_id);
1633 } else {
1634 qdsp6_devchg_notify(ac_control, ADSP_AUDIO_TX_DEVICE,
1635 device_id);
1636 audio_update_acdb(device_id, acdb_id);
1637 qdsp6_standby(ac_control);
1638 qdsp6_start(ac_control);
1639 audio_tx_device_id = device_id;
1640 audio_tx_path_id = q6_device_to_path(device_id, acdb_id);
1641 tx_acdb = acdb_id;
1642 }
1643}
1644
1645int q6audio_do_routing(uint32_t device_id, uint32_t acdb_id)
1646{
1647 if (q6audio_init())
1648 return 0;
1649
1650 mutex_lock(&audio_path_lock);
1651
1652 switch(q6_device_to_dir(device_id)) {
1653 case Q6_RX:
1654 do_rx_routing(device_id, acdb_id);
1655 break;
1656 case Q6_TX:
1657 do_tx_routing(device_id, acdb_id);
1658 break;
1659 }
1660
1661 mutex_unlock(&audio_path_lock);
1662 return 0;
1663}
1664
1665int q6audio_set_route(const char *name)
1666{
1667 uint32_t route;
1668 if (!strcmp(name, "speaker")) {
1669 route = ADIE_PATH_SPEAKER_STEREO_RX;
1670 } else if (!strcmp(name, "headphones")) {
1671 route = ADIE_PATH_HEADSET_STEREO_RX;
1672 } else if (!strcmp(name, "handset")) {
1673 route = ADIE_PATH_HANDSET_RX;
1674 } else {
1675 return -EINVAL;
1676 }
1677
1678 mutex_lock(&audio_path_lock);
1679 if (route == audio_rx_path_id)
1680 goto done;
1681
1682 audio_rx_path_id = route;
1683
1684 if (audio_rx_path_refcount > 0) {
1685 _audio_rx_path_disable();
1686 _audio_rx_path_enable(1, 0);
1687 }
1688 if (audio_tx_path_refcount > 0) {
1689 _audio_tx_path_disable();
1690 _audio_tx_path_enable(1, 0);
1691 }
1692done:
1693 mutex_unlock(&audio_path_lock);
1694 return 0;
1695}
1696
1697static int audio_stream_equalizer(struct audio_client *ac, void *eq_config)
1698{
1699 int i;
1700 struct adsp_set_equalizer_command rpc;
1701 struct adsp_audio_eq_stream_config *eq_cfg;
1702 eq_cfg = (struct adsp_audio_eq_stream_config *) eq_config;
1703
1704 memset(&rpc, 0, sizeof(rpc));
1705
1706 rpc.hdr.opcode = ADSP_AUDIO_IOCTL_SET_SESSION_EQ_CONFIG;
1707 rpc.enable = eq_cfg->enable;
1708 rpc.num_bands = eq_cfg->num_bands;
1709 for (i = 0; i < eq_cfg->num_bands; i++) {
1710 rpc.eq_bands[i].band_idx = eq_cfg->eq_bands[i].band_idx;
1711 rpc.eq_bands[i].filter_type = eq_cfg->eq_bands[i].filter_type;
1712 rpc.eq_bands[i].center_freq_hz =
1713 eq_cfg->eq_bands[i].center_freq_hz;
1714 rpc.eq_bands[i].filter_gain = eq_cfg->eq_bands[i].filter_gain;
1715 rpc.eq_bands[i].q_factor = eq_cfg->eq_bands[i].q_factor;
1716 }
1717 return audio_ioctl(ac, &rpc, sizeof(rpc));
1718}
1719
1720int q6audio_set_stream_eq_pcm(struct audio_client *ac, void *eq_config)
1721{
1722 int rc = 0;
1723 mutex_lock(&audio_path_lock);
1724 rc = audio_stream_equalizer(ac, eq_config);
1725 mutex_unlock(&audio_path_lock);
1726 return rc;
1727}
1728
1729struct audio_client *q6audio_open_auxpcm(uint32_t rate,
1730 uint32_t channels, uint32_t flags, uint32_t acdb_id)
1731{
1732 int rc, retry = 5;
1733 struct audio_client *ac;
1734
1735 pr_debug("[%s:%s] rate = %d, channels = %d\n", __MM_FILE__, __func__,
1736 rate, channels);
1737 if (q6audio_init())
1738 return NULL;
1739 ac = audio_client_alloc(0);
1740 if (!ac)
1741 return NULL;
1742
1743 ac->flags = flags;
1744
1745 mutex_lock(&audio_path_lock);
1746
1747 if (ac->flags & AUDIO_FLAG_WRITE) {
1748 audio_tx_path_refcount++;
1749 if (audio_tx_path_refcount == 1) {
1750 tx_clk_freq = rate;
1751 _audio_tx_clk_enable();
1752 _audio_tx_path_enable(0, acdb_id);
1753 }
1754 } else {
1755 audio_rx_path_refcount++;
1756 if (audio_rx_path_refcount == 1) {
1757 _audio_rx_clk_enable();
1758 _audio_rx_path_enable(0, acdb_id);
1759 }
1760 }
1761
1762 ecodec_clk_enable();
1763
1764 for (retry = 5;; retry--) {
1765 if (ac->flags & AUDIO_FLAG_WRITE)
1766 rc = audio_auxpcm_out_open(ac, rate, channels);
1767 else
1768 rc = audio_auxpcm_in_open(ac, rate, channels);
1769 if (rc == 0)
1770 break;
1771 if (retry == 0)
1772 q6audio_dsp_not_responding();
1773
1774 pr_err("[%s:%s] open pcm error %d, retrying\n",
1775 __MM_FILE__, __func__, rc);
1776 msleep(1);
1777 }
1778
1779 mutex_unlock(&audio_path_lock);
1780
1781 for (retry = 5;; retry--) {
1782 rc = audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
1783 if (rc == 0)
1784 break;
1785 if (retry == 0)
1786 q6audio_dsp_not_responding();
1787
1788 pr_err("[%s:%s] stream start error %d, retrying\n",
1789 __MM_FILE__, __func__, rc);
1790 }
1791 audio_prevent_sleep();
1792 return ac;
1793
1794}
1795
1796struct audio_client *q6audio_open_pcm(uint32_t bufsz, uint32_t rate,
1797 uint32_t channels, uint32_t flags, uint32_t acdb_id)
1798{
1799 int rc, retry = 5;
1800 struct audio_client *ac;
1801
1802 pr_debug("[%s:%s] bufsz = %d, rate = %d, channels = %d\n", __MM_FILE__,
1803 __func__, bufsz, rate, channels);
1804 if (q6audio_init())
1805 return 0;
1806
1807 ac = audio_client_alloc(bufsz);
1808 if (!ac)
1809 return 0;
1810
1811 ac->flags = flags;
1812
1813 mutex_lock(&audio_path_lock);
1814
1815 if (ac->flags & AUDIO_FLAG_WRITE) {
1816 audio_rx_path_refcount++;
1817 if (audio_rx_path_refcount == 1) {
1818 _audio_rx_clk_enable();
1819 q6_rx_path_enable(0, acdb_id);
1820 adie_rx_path_enable(acdb_id);
1821 }
1822 } else {
1823 /* TODO: consider concurrency with voice call */
1824 audio_tx_path_refcount++;
1825 if (audio_tx_path_refcount == 1) {
1826 tx_clk_freq = rate;
1827 _audio_tx_clk_enable();
1828 _audio_tx_path_enable(0, acdb_id);
1829 }
1830 }
1831
1832 for (retry = 5;;retry--) {
1833 if (ac->flags & AUDIO_FLAG_WRITE)
1834 rc = audio_out_open(ac, bufsz, rate, channels);
1835 else
1836 rc = audio_in_open(ac, bufsz, flags, rate, channels);
1837 if (rc == 0)
1838 break;
1839 if (retry == 0)
1840 q6audio_dsp_not_responding();
1841
1842 pr_err("[%s:%s] open pcm error %d, retrying\n",
1843 __MM_FILE__, __func__, rc);
1844 msleep(1);
1845 }
1846
1847 if (ac->flags & AUDIO_FLAG_WRITE) {
1848 if (audio_rx_path_refcount == 1)
1849 audio_rx_analog_enable(1);
1850 }
1851 mutex_unlock(&audio_path_lock);
1852
1853 for (retry = 5;;retry--) {
1854 rc = audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
1855 if (rc == 0)
1856 break;
1857 if (retry == 0)
1858 q6audio_dsp_not_responding();
1859
1860 pr_err("[%s:%s] stream start error %d, retrying\n",
1861 __MM_FILE__, __func__, rc);
1862 }
1863
1864 if (!(ac->flags & AUDIO_FLAG_WRITE)) {
1865 ac->buf[0].used = 1;
1866 ac->buf[1].used = 1;
1867 q6audio_read(ac, &ac->buf[0]);
1868 q6audio_read(ac, &ac->buf[1]);
1869 }
1870
1871 audio_prevent_sleep();
1872 return ac;
1873}
1874
1875int q6audio_close(struct audio_client *ac)
1876{
1877 audio_close(ac);
1878 if (ac->flags & AUDIO_FLAG_WRITE)
1879 audio_rx_path_enable(0, 0);
1880 else
1881 audio_tx_path_enable(0, 0);
1882 audio_client_free(ac);
1883 audio_allow_sleep();
1884 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
1885 return 0;
1886}
1887
1888int q6audio_auxpcm_close(struct audio_client *ac)
1889{
1890 audio_close(ac);
1891 if (ac->flags & AUDIO_FLAG_WRITE) {
1892 audio_tx_path_enable(0, 0);
1893 ecodec_clk_disable(0, ADSP_PATH_RX);
1894 } else {
1895 audio_rx_path_enable(0, 0);
1896 ecodec_clk_disable(0, ADSP_PATH_TX);
1897 }
1898
1899 audio_client_free(ac);
1900 audio_allow_sleep();
1901 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
1902 return 0;
1903}
1904struct audio_client *q6voice_open(uint32_t flags)
1905{
1906 struct audio_client *ac;
1907
1908 pr_debug("[%s:%s] flags = %d\n", __MM_FILE__, __func__, flags);
1909 if (q6audio_init())
1910 return 0;
1911
1912 ac = audio_client_alloc(0);
1913 if (!ac)
1914 return 0;
1915
1916 ac->flags = flags;
1917 if (ac->flags & AUDIO_FLAG_WRITE)
1918 audio_rx_path_enable(1, rx_acdb);
1919 else {
1920 if (!audio_tx_path_refcount)
1921 tx_clk_freq = 8000;
1922 audio_tx_path_enable(1, tx_acdb);
1923 }
1924
1925 return ac;
1926}
1927
1928int q6voice_close(struct audio_client *ac)
1929{
1930 if (ac->flags & AUDIO_FLAG_WRITE)
1931 audio_rx_path_enable(0, 0);
1932 else
1933 audio_tx_path_enable(0, 0);
1934
1935 tx_mute_status = 0;
1936 audio_client_free(ac);
1937 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
1938 return 0;
1939}
1940
1941struct audio_client *q6audio_open_mp3(uint32_t bufsz, uint32_t rate,
1942 uint32_t channels, uint32_t acdb_id)
1943{
1944 struct audio_client *ac;
1945
1946 pr_debug("[%s:%s] bufsz = %d, rate = %d\n, channels = %d",
1947 __MM_FILE__, __func__, bufsz, rate, channels);
1948
1949 if (q6audio_init())
1950 return 0;
1951
1952 ac = audio_client_alloc(bufsz);
1953 if (!ac)
1954 return 0;
1955
1956 ac->flags = AUDIO_FLAG_WRITE;
1957 audio_rx_path_enable(1, acdb_id);
1958
1959 audio_mp3_open(ac, bufsz, rate, channels);
1960 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
1961
1962 mutex_lock(&audio_path_lock);
1963 audio_rx_mute(ac_control, audio_rx_device_id, 0);
1964 audio_rx_volume(ac_control, audio_rx_device_id,
1965 q6_device_volume(audio_rx_device_id, rx_vol_level));
1966 mutex_unlock(&audio_path_lock);
1967 return ac;
1968}
1969
1970struct audio_client *q6audio_open_dtmf(uint32_t rate,
1971 uint32_t channels, uint32_t acdb_id)
1972{
1973 struct audio_client *ac;
1974
1975 pr_debug("[%s:%s] rate = %d\n, channels = %d", __MM_FILE__, __func__,
1976 rate, channels);
1977 if (q6audio_init())
1978 return 0;
1979
1980 ac = audio_client_alloc(0);
1981 if (!ac)
1982 return 0;
1983
1984 ac->flags = AUDIO_FLAG_WRITE;
1985 audio_rx_path_enable(1, acdb_id);
1986
1987 audio_dtmf_open(ac, rate, channels);
1988 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
1989
1990 mutex_lock(&audio_path_lock);
1991 audio_rx_mute(ac_control, audio_rx_device_id, 0);
1992 audio_rx_volume(ac_control, audio_rx_device_id,
1993 q6_device_volume(audio_rx_device_id, rx_vol_level));
1994 mutex_unlock(&audio_path_lock);
1995
1996 return ac;
1997}
1998
1999int q6audio_play_dtmf(struct audio_client *ac, uint16_t dtmf_hi,
2000 uint16_t dtmf_low, uint16_t duration, uint16_t rx_gain)
2001{
2002 struct adsp_audio_dtmf_start_command dtmf_cmd;
2003
2004 pr_debug("[%s:%s] high = %d, low = %d\n", __MM_FILE__, __func__,
2005 dtmf_hi, dtmf_low);
2006
2007 dtmf_cmd.hdr.opcode = ADSP_AUDIO_IOCTL_CMD_SESSION_DTMF_START;
2008 dtmf_cmd.hdr.response_type = ADSP_AUDIO_RESPONSE_COMMAND;
2009 dtmf_cmd.tone1_hz = dtmf_hi;
2010 dtmf_cmd.tone2_hz = dtmf_low;
2011 dtmf_cmd.duration_usec = duration * 1000;
2012 dtmf_cmd.gain_mb = rx_gain;
2013
2014 return audio_ioctl(ac, &dtmf_cmd,
2015 sizeof(struct adsp_audio_dtmf_start_command));
2016
2017}
2018
2019int q6audio_mp3_close(struct audio_client *ac)
2020{
2021 pr_debug("[%s:%s]\n", __MM_FILE__, __func__);
2022 audio_close(ac);
2023 audio_rx_path_enable(0, 0);
2024 audio_client_free(ac);
2025 return 0;
2026}
2027
2028
2029struct audio_client *q6audio_open_aac(uint32_t bufsz, uint32_t samplerate,
2030 uint32_t channels, uint32_t bitrate,
2031 uint32_t stream_format, uint32_t flags,
2032 uint32_t acdb_id)
2033{
2034 struct audio_client *ac;
2035
2036 pr_debug("[%s:%s] bufsz = %d, samplerate = %d, channels = %d\n",
2037 __MM_FILE__, __func__, bufsz, samplerate, channels);
2038
2039 if (q6audio_init())
2040 return 0;
2041
2042 ac = audio_client_alloc(bufsz);
2043 if (!ac)
2044 return 0;
2045
2046 ac->flags = flags;
2047
2048 if (ac->flags & AUDIO_FLAG_WRITE)
2049 audio_rx_path_enable(1, acdb_id);
2050 else{
2051 if (!audio_tx_path_refcount)
2052 tx_clk_freq = 48000;
2053 audio_tx_path_enable(1, acdb_id);
2054 }
2055
2056 audio_aac_open(ac, bufsz, samplerate, channels, bitrate, flags,
2057 stream_format);
2058 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
2059
2060 if (!(ac->flags & AUDIO_FLAG_WRITE)) {
2061 ac->buf[0].used = 1;
2062 ac->buf[1].used = 1;
2063 q6audio_read(ac, &ac->buf[0]);
2064 q6audio_read(ac, &ac->buf[1]);
2065 }
2066 audio_prevent_sleep();
2067 return ac;
2068}
2069
2070
2071struct audio_client *q6audio_open_qcp(uint32_t bufsz, uint32_t min_rate,
2072 uint32_t max_rate, uint32_t flags,
2073 uint32_t format, uint32_t acdb_id)
2074{
2075 struct audio_client *ac;
2076
2077 pr_debug("[%s:%s] bufsz = %d\n", __MM_FILE__, __func__, bufsz);
2078
2079 if (q6audio_init())
2080 return 0;
2081
2082 ac = audio_client_alloc(bufsz);
2083 if (!ac)
2084 return 0;
2085
2086 ac->flags = flags;
2087
2088 if (ac->flags & AUDIO_FLAG_WRITE)
2089 audio_rx_path_enable(1, acdb_id);
2090 else{
2091 if (!audio_tx_path_refcount)
2092 tx_clk_freq = 8000;
2093 audio_tx_path_enable(1, acdb_id);
2094 }
2095
2096 audio_qcp_open(ac, bufsz, min_rate, max_rate, flags, format);
2097 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
2098
2099 if (!(ac->flags & AUDIO_FLAG_WRITE)) {
2100 ac->buf[0].used = 1;
2101 ac->buf[1].used = 1;
2102 q6audio_read(ac, &ac->buf[0]);
2103 q6audio_read(ac, &ac->buf[1]);
2104 }
2105 audio_prevent_sleep();
2106 return ac;
2107}
2108
2109struct audio_client *q6audio_open_amrnb(uint32_t bufsz, uint32_t enc_mode,
2110 uint32_t dtx_mode_enable,
2111 uint32_t flags, uint32_t acdb_id)
2112{
2113 struct audio_client *ac;
2114
2115 pr_debug("[%s:%s] bufsz = %d, dtx_mode = %d\n", __MM_FILE__,
2116 __func__, bufsz, dtx_mode_enable);
2117
2118 if (q6audio_init())
2119 return 0;
2120
2121 ac = audio_client_alloc(bufsz);
2122 if (!ac)
2123 return 0;
2124
2125 ac->flags = flags;
2126 if (ac->flags & AUDIO_FLAG_WRITE)
2127 audio_rx_path_enable(1, acdb_id);
2128 else{
2129 if (!audio_tx_path_refcount)
2130 tx_clk_freq = 8000;
2131 audio_tx_path_enable(1, acdb_id);
2132 }
2133
2134 audio_amrnb_open(ac, bufsz, enc_mode, flags, dtx_mode_enable);
2135 audio_command(ac, ADSP_AUDIO_IOCTL_CMD_SESSION_START);
2136
2137 if (!(ac->flags & AUDIO_FLAG_WRITE)) {
2138 ac->buf[0].used = 1;
2139 ac->buf[1].used = 1;
2140 q6audio_read(ac, &ac->buf[0]);
2141 q6audio_read(ac, &ac->buf[1]);
2142 }
2143 audio_prevent_sleep();
2144 return ac;
2145}
2146
2147int q6audio_async(struct audio_client *ac)
2148{
2149 struct adsp_command_hdr rpc;
2150 pr_debug("[%s:%s] ac = %p\n", __MM_FILE__, __func__, ac);
2151 memset(&rpc, 0, sizeof(rpc));
2152 rpc.opcode = ADSP_AUDIO_IOCTL_CMD_STREAM_EOS;
2153 rpc.response_type = ADSP_AUDIO_RESPONSE_ASYNC;
2154 return audio_ioctl(ac, &rpc, sizeof(rpc));
2155}