platform.c revision 1de6e5aac3120408a003dc8b5f7fdd68c40f436d
1b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*
2a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent * Copyright (C) 2013 The Android Open Source Project
3b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
4b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * you may not use this file except in compliance with the License.
6b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * You may obtain a copy of the License at
7b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
8b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
10b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Unless required by applicable law or agreed to in writing, software
11b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * See the License for the specific language governing permissions and
14b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * limitations under the License.
15b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent */
16b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
17b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LOG_TAG "msm8974_platform"
18b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*#define LOG_NDEBUG 0*/
19b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LOG_NDDEBUG 0
20b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
21b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <stdlib.h>
22b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <dlfcn.h>
23b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/log.h>
249f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda#include <cutils/str_parms.h>
25b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/properties.h>
26b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <audio_hw.h>
27b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <platform_api.h>
28b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include "platform.h"
2983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084
3083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#include "mdm_detect.h"
3183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
32b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
3347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
34b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LIB_ACDB_LOADER "libacdbloader.so"
3547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George#define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID"
36b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
37b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DUALMIC_CONFIG_NONE 0      /* Target does not contain 2 mics */
38b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DUALMIC_CONFIG_ENDFIRE 1
39b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define DUALMIC_CONFIG_BROADSIDE 2
40b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
41b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*
42b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * This file will have a maximum of 38 bytes:
43b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
44b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4 bytes: number of audio blocks
45b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
46b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Maximum 10 * 3 bytes: SAD blocks
47b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent */
48b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SAD_BLOCKS      10
49b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define SAD_BLOCK_SIZE      3
50b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
51b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* EDID format ID for LPCM audio */
52b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define EDID_FORMAT_LPCM    1
53b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
541b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo/* Retry for delay in FW loading*/
551b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo#define RETRY_NUMBER 10
561b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo#define RETRY_US 500000
57a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent
58a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent#define MAX_VOL_INDEX 5
59a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent#define MIN_VOL_INDEX 0
60a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent#define percent_to_index(val, min, max) \
61a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent	        ((val) * ((max) - (min)) * 0.01 + (min) + .5)
6253b2cf0c72aa18a5848919e2309731af652e84f9sangwoo
63b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct audio_block_header
64b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
65b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int reserved;
66b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int length;
67b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
68b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
6983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda/* Audio calibration related functions */
70b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_deallocate_t)();
7183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084
7283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandatypedef int  (*acdb_init_t)(char *);
7383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
74b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int  (*acdb_init_t)();
7583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
76b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_send_audio_cal_t)(int, int);
77b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_send_voice_cal_t)(int, int);
7883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandatypedef int (*acdb_reload_vocvoltable_t)(int);
79b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
80b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Audio calibration related functions */
81b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct platform_data {
82b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev;
83b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_spkr_mode;
84b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_voice_call;
85b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_voice_rec;
86b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int  dualmic_config;
87b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    void *acdb_handle;
88b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    acdb_init_t acdb_init;
89b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    acdb_deallocate_t acdb_deallocate;
90b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    acdb_send_audio_cal_t acdb_send_audio_cal;
91b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    acdb_send_voice_cal_t acdb_send_voice_cal;
9283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_reload_vocvoltable_t  acdb_reload_vocvoltable;
9383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct csd_data *csd;
94299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    bool ext_speaker;
95299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    bool ext_earpiece;
96b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
97b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
98b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic const int pcm_device_table[AUDIO_USECASE_MAX][2] = {
9983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
10083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                            DEEP_BUFFER_PCM_DEVICE},
10183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
10283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                            LOWLATENCY_PCM_DEVICE},
10383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
10483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                         MULTIMEDIA2_PCM_DEVICE},
10583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {PLAYBACK_OFFLOAD_DEVICE,
10683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                        PLAYBACK_OFFLOAD_DEVICE},
10783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE,
10883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                              AUDIO_RECORD_PCM_DEVICE},
10983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
11083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                          LOWLATENCY_PCM_DEVICE},
11183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE,
11283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                            VOICE_CALL_PCM_DEVICE},
1138e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
114b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
115b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
116b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Array to store sound devices */
117b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic const char * const device_table[SND_DEVICE_MAX] = {
118b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_NONE] = "none",
119b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Playback sound devices */
120b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HANDSET] = "handset",
121b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER] = "speaker",
122b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
123b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HEADPHONES] = "headphones",
124b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
125b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
126b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
127b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
128b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HDMI] = "hdmi",
129b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
130b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
1319f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
132b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus",
133b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
134b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
135b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
136b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
137b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Capture sound devices */
138b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
139b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
140b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
141b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
14234fa769ab5835cefb9a6b842590f5f690c0a52dbEric Laurent    [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic-aec",
143b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HEADSET_MIC_AEC] = "headset-mic",
144b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
145b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
146b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
147b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
1489f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
149b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
150b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_DMIC_EF] = "voice-dmic-ef",
151b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_DMIC_BS] = "voice-dmic-bs",
152b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_DMIC_EF_TMUS] = "voice-dmic-ef-tmus",
153b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_EF] = "voice-speaker-dmic-ef",
154b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BS] = "voice-speaker-dmic-bs",
155b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
156b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
157b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
158b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
159b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_EF] = "voice-rec-dmic-ef",
160b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_BS] = "voice-rec-dmic-bs",
161b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_EF_FLUENCE] = "voice-rec-dmic-ef-fluence",
162b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_BS_FLUENCE] = "voice-rec-dmic-bs-fluence",
163b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
164b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
165b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
166b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic const int acdb_device_table[SND_DEVICE_MAX] = {
167b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_NONE] = -1,
168b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HANDSET] = 7,
169b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER] = 15,
170b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_REVERSE] = 15,
171b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HEADPHONES] = 10,
172b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
1731de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda#ifdef PLATFORM_MSM8084
1741de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_HANDSET] = 67,
1751de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER] = 66,
1761de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda#else
177b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
178b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_SPEAKER] = 15,
1791de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda#endif
180b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
181b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HDMI] = 18,
182b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15,
183b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_BT_SCO] = 22,
1849f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_OUT_BT_SCO_WB] = 39,
18583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = ACDB_ID_VOICE_HANDSET_TMUS,
186b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
187b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
188b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
189b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
190b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC] = 4,
191b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_SPEAKER_MIC] = 4, /* ToDo: Check if this needs to changed to 11 */
192b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HEADSET_MIC] = 8,
193b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC_AEC] = 40,
194b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 42,
195b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HEADSET_MIC_AEC] = 47,
196b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
197b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
198b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HDMI_MIC] = 4,
199b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_BT_SCO_MIC] = 21,
2009f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
201b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_CAMCORDER_MIC] = 61,
202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_DMIC_EF] = 41,
203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_DMIC_BS] = 5,
20483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC_EF_TMUS] = ACDB_ID_VOICE_DMIC_EF_TMUS,
205b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_EF] = 43,
206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BS] = 12,
207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
208b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
210b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_MIC] = 62,
211b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* TODO: Update with proper acdb ids */
212b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_EF] = 62,
213b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_BS] = 62,
214b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_EF_FLUENCE] = 6,
215b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_DMIC_BS_FLUENCE] = 5,
216b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
217b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2187ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
2197ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
2207ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George
221b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic pthread_once_t check_op_once_ctl = PTHREAD_ONCE_INIT;
222b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic bool is_tmus = false;
223b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
224b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic void check_operator()
225b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
226b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char value[PROPERTY_VALUE_MAX];
227b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int mccmnc;
228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    property_get("gsm.sim.operator.numeric",value,"0");
229b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mccmnc = atoi(value);
230b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGD("%s: tmus mccmnc %d", __func__, mccmnc);
231b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    switch(mccmnc) {
232b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* TMUS MCC(310), MNC(490, 260, 026) */
233b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310490:
234b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310260:
235b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310026:
236b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    /* Add new TMUS MNC(800, 660, 580, 310, 270, 250, 240, 230, 220, 210, 200, 160) */
237b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310800:
238b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310660:
239b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310580:
240b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310310:
241b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310270:
242b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310250:
243b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310240:
244b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310230:
245b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310220:
246b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310210:
247b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310200:
248b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310160:
249b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        is_tmus = true;
250b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        break;
251b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
252b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
253b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
254b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentbool is_operator_tmus()
255b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
256b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    pthread_once(&check_op_once_ctl, check_operator);
257b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return is_tmus;
258b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
259b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
260a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurentstatic int set_volume_values(int type, int volume, int* values)
261a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent{
262a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    values[0] = volume;
263a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    values[1] = ALL_SESSION_VSID;
264a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent
265a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    switch(type) {
266a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    case VOLUME_SET:
267a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        values[2] = DEFAULT_VOLUME_RAMP_DURATION_MS;
268a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        break;
269a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    case MUTE_SET:
270a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        values[2] = DEFAULT_MUTE_RAMP_DURATION;
271a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        break;
272a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    default:
273a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        return -EINVAL;
274a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    }
275a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    return 0;
276a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent}
277a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent
278b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic int set_echo_reference(struct mixer *mixer, const char* ec_ref)
279b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
280b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
281b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "EC_REF_RX";
282b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
283b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(mixer, mixer_ctl_name);
284b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
285b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
286b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
287b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
288b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
289b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("Setting EC Reference: %s", ec_ref);
290b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mixer_ctl_set_enum_by_string(ctl, ec_ref);
291b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
292b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
293b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
29483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic struct csd_data *open_csd_client(bool i2s_ext_modem)
29583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
29683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct csd_data *csd = calloc(1, sizeof(struct csd_data));
29783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
29883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
29983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (csd->csd_client == NULL) {
30083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
30183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        goto error;
30283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
30383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
30483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
30583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->deinit = (deinit_t)dlsym(csd->csd_client,
30683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_deinit");
30783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->deinit == NULL) {
30883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
30983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  dlerror());
31083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
31183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
31283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
31383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_disable_device");
31483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->disable_device == NULL) {
31583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_disable_device",
31683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
31783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
31883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
31983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client,
32083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                               "csd_client_enable_device_config");
32183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->enable_device_config == NULL) {
32283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_enable_device_config",
32383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
32483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
32583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
32683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
32783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_enable_device");
32883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->enable_device == NULL) {
32983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_enable_device",
33083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
33183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
33283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
33383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
33483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_voice");
33583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_voice == NULL) {
33683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_voice",
33783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
33883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
33983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
34083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
34183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_voice");
34283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_voice == NULL) {
34383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_voice",
34483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
34583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
34683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
34783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->volume = (volume_t)dlsym(csd->csd_client,
34883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_volume");
34983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->volume == NULL) {
35083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_volume",
35183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
35283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
35383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
35483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
35583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_mic_mute");
35683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->mic_mute == NULL) {
35783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_mic_mute",
35883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
35983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
36083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
36183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
36283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_slow_talk");
36383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->slow_talk == NULL) {
36483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_slow_talk",
36583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
36683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
36783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
36883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
36983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_playback");
37083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_playback == NULL) {
37183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_playback",
37283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
37383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
37483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
37583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
37683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_playback");
37783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_playback == NULL) {
37883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_playback",
37983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
38083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
38183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
38283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_record = (start_record_t)dlsym(csd->csd_client,
38383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_record");
38483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_record == NULL) {
38583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_record",
38683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
38783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
38883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
38983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
39083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_record");
39183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_record == NULL) {
39283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_record",
39383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
39483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
39583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
39683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
39783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client,
39883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_get_sample_rate");
39983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->get_sample_rate == NULL) {
40083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_get_sample_rate",
40183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
40283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
40383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
40483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
40583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
40683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
40783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
40883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->init == NULL) {
40983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_init",
41083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
41183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
41283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        } else {
41383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            csd->init(i2s_ext_modem);
41483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
41583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
41683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return csd;
41783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
41883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaerror:
41983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    free(csd);
42083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    csd = NULL;
42183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return csd;
42283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
42383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
42483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandavoid close_csd_client(struct csd_data *csd)
42583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
42683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (csd != NULL) {
42783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->deinit();
42883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        dlclose(csd->csd_client);
42983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        free(csd);
43083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd = NULL;
43183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
43283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
43383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
43483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic void platform_csd_init(struct platform_data *my_data)
43583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
43683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084
43783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct dev_info mdm_detect_info;
43883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
43983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
44083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    /* Call ESOC API to get the number of modems.
44183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     * If the number of modems is not zero, load CSD Client specific
44283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     * symbols. Voice call is handled by MDM and apps processor talks to
44383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     * MDM through CSD Client
44483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     */
44583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    ret = get_system_info(&mdm_detect_info);
44683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (ret > 0) {
44783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Failed to get system info, ret %d", __func__, ret);
44883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
44983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    ALOGD("%s: num_modems %d\n", __func__, mdm_detect_info.num_modems);
45083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
45183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (mdm_detect_info.num_modems > 0)
45283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->csd = open_csd_client(false /*is_i2s_ext_modem*/);
45383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
45483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     my_data->csd = NULL;
45583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
45683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
45783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
458b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid *platform_init(struct audio_device *adev)
459b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
460b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char value[PROPERTY_VALUE_MAX];
461b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data;
462a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    int retry_num = 0;
46383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    const char *snd_card_name;
4641b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo
465a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    adev->mixer = mixer_open(MIXER_CARD);
4661b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo
467a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    while (!adev->mixer && retry_num < RETRY_NUMBER) {
468a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        usleep(RETRY_US);
469a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        adev->mixer = mixer_open(MIXER_CARD);
470a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        retry_num++;
471a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    }
47283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
473a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    if (!adev->mixer) {
474a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ALOGE("Unable to open the mixer, aborting.");
475a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        return NULL;
476cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George    }
477cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
478a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    snd_card_name = mixer_get_name(adev->mixer);
479a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    ALOGD("%s: snd_card_name: %s", __func__, snd_card_name);
480a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent
481a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    adev->audio_route = audio_route_init(MIXER_CARD, MIXER_XML_PATH);
482a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    if (!adev->audio_route) {
483a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ALOGE("%s: Failed to init audio route controls, aborting.", __func__);
4841b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo        return NULL;
4851b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo    }
486b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
487b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data = calloc(1, sizeof(struct platform_data));
488b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
489b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->adev = adev;
490b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->dualmic_config = DUALMIC_CONFIG_NONE;
491b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_spkr_mode = false;
492b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_voice_call = false;
493b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_voice_rec = false;
494b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
495299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    /*
496299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda     * The default assumption is that earpiece (handset), speaker and headphones
497299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda     * devices are connected to internal HW codec and communicated through
498299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda     * slimbus backend. If any platform communicates with speaker or earpiece
499299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda     * or headphones through non-slimbus backend such as MI2S or AUXPCM etc.,
500299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda     * the ext_xxxx flags must be set accordingly.
501299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda     */
502299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    if (strstr(snd_card_name, "tfa9890_stereo")) {
503299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda        my_data->ext_speaker = true;
504299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda        my_data->ext_earpiece = true;
505299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    } else if (strstr(snd_card_name, "tfa9890")) {
506299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda        my_data->ext_speaker = true;
507299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    }
508299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda
509b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    property_get("persist.audio.dualmic.config",value,"");
510b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!strcmp("broadside", value)) {
511b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->dualmic_config = DUALMIC_CONFIG_BROADSIDE;
512b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        adev->acdb_settings |= DMIC_FLAG;
513b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (!strcmp("endfire", value)) {
514b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->dualmic_config = DUALMIC_CONFIG_ENDFIRE;
515b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        adev->acdb_settings |= DMIC_FLAG;
516b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
517b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
518b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->dualmic_config != DUALMIC_CONFIG_NONE) {
519b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.voicecall",value,"");
520b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
521b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_voice_call = true;
522b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
523b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
524b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.voicerec",value,"");
525b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
526b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_voice_rec = true;
527b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
528b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
529b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.speaker",value,"");
530b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
531b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_spkr_mode = true;
532b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
533b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
534b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
535b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
536b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_handle == NULL) {
537b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
538b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
539b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
540b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
541b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_deallocate_ACDB");
54283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_deallocate)
54383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
54483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
54583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
546b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
547b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_send_audio_cal");
548b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!my_data->acdb_send_audio_cal)
54983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s",
550b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                  __func__, LIB_ACDB_LOADER);
55183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
552b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
553b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_send_voice_cal");
55483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_send_voice_cal)
55583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
55683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
55783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
55883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
55983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    "acdb_loader_reload_vocvoltable");
56083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_reload_vocvoltable)
56183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
56283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
56383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084
56483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
56583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    "acdb_loader_init_v2");
56683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (my_data->acdb_init == NULL)
56783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror());
56883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        else
56983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            my_data->acdb_init(snd_card_name);
57083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
571b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
572b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_init_ACDB");
573b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (my_data->acdb_init == NULL)
574b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror());
575b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
576b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->acdb_init();
57783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
578b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
579b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
58083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    /* load csd client */
58183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    platform_csd_init(my_data);
58283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
583b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return my_data;
584b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
585b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
586b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid platform_deinit(void *platform)
587b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
588b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    free(platform);
589b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
590b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
591b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentconst char *platform_get_snd_device_name(snd_device_t snd_device)
592b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
593b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
594b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return device_table[snd_device];
595b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else
596b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return "";
597b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
598b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
599299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamandavoid platform_add_backend_name(void *platform, char *mixer_path,
600299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda                               snd_device_t snd_device)
601b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
602299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
603299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda
604b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (snd_device == SND_DEVICE_IN_BT_SCO_MIC)
605b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        strcat(mixer_path, " bt-sco");
606b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else if(snd_device == SND_DEVICE_OUT_BT_SCO)
607b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        strcat(mixer_path, " bt-sco");
608b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else if (snd_device == SND_DEVICE_OUT_HDMI)
609b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        strcat(mixer_path, " hdmi");
610b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
611b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        strcat(mixer_path, " speaker-and-hdmi");
6129f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    else if (snd_device == SND_DEVICE_OUT_BT_SCO_WB ||
6139f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda             snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB)
6149f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        strcat(mixer_path, " bt-sco-wb");
615299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    else if (my_data->ext_speaker) {
616299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda        if (snd_device == SND_DEVICE_OUT_SPEAKER ||
617299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda            snd_device == SND_DEVICE_OUT_VOICE_SPEAKER ||
618299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda            snd_device == SND_DEVICE_OUT_SPEAKER_REVERSE)
619299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda            strcat(mixer_path, " speaker");
620299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda        else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)
621299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda            strcat(mixer_path, " speaker-and-headphones");
6221de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda    }
6231de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda    if (my_data->ext_earpiece &&
6241de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda        (snd_device == SND_DEVICE_OUT_VOICE_HANDSET ||
6251de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda         snd_device == SND_DEVICE_OUT_VOICE_HANDSET_TMUS ||
6261de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda         snd_device == SND_DEVICE_OUT_HANDSET ||
6271de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda         snd_device == SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)) {
628299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda        strcat(mixer_path, " handset");
629299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    }
630b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
631b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
632b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
633b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
634b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int device_id;
635b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (device_type == PCM_PLAYBACK)
636b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        device_id = pcm_device_table[usecase][0];
637b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else
638b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        device_id = pcm_device_table[usecase][1];
639b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return device_id;
640b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
641b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
642b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_send_audio_calibration(void *platform, snd_device_t snd_device)
643b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
644b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
645b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int acdb_dev_id, acdb_dev_type;
646b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
647b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    acdb_dev_id = acdb_device_table[snd_device];
648b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (acdb_dev_id < 0) {
649b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not find acdb id for device(%d)",
650b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, snd_device);
651b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
652b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
653b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_send_audio_cal) {
654994a693158202488516c48c22534ae2035b5c8faEric Laurent        ("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
655b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, snd_device, acdb_dev_id);
656b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device >= SND_DEVICE_OUT_BEGIN &&
657b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device < SND_DEVICE_OUT_END)
658b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            acdb_dev_type = ACDB_DEV_TYPE_OUT;
659b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
660b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            acdb_dev_type = ACDB_DEV_TYPE_IN;
661b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type);
662b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
663b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
664b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
665b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
666b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_pre(void *platform)
667b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
66883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
66983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
67083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
67183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL &&
67283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->adev->mode == AUDIO_MODE_IN_CALL) {
67383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        /* This must be called before disabling mixer controls on APQ side */
67483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->disable_device();
67583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
67683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_client_disable_device, failed, error %d",
67783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, ret);
67883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
67983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
68083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
68183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
68283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
68383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_enable_device_config(void *platform,
68483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    snd_device_t out_snd_device,
68583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    snd_device_t in_snd_device)
68683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
68783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
68883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int acdb_rx_id, acdb_tx_id;
68983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
69083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
69183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd == NULL)
69283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        return ret;
69383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
69483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_rx_id = acdb_device_table[out_snd_device];
69583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
69683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_tx_id = acdb_device_table[in_snd_device];
69783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
69883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (acdb_rx_id > 0 && acdb_tx_id > 0) {
69983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
70083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
70183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_enable_device_config, failed, error %d",
70283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, ret);
70383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
70483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
70583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
70683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda              acdb_rx_id, acdb_tx_id);
70783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
70883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
70983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
710b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
711b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
712b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_post(void *platform,
713b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                           snd_device_t out_snd_device,
714b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                           snd_device_t in_snd_device)
715b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
716b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
717b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int acdb_rx_id, acdb_tx_id;
718b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
719b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_send_voice_cal == NULL) {
720b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
721b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
722b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        acdb_rx_id = acdb_device_table[out_snd_device];
723b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        acdb_tx_id = acdb_device_table[in_snd_device];
724b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
725b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (acdb_rx_id > 0 && acdb_tx_id > 0)
726b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
727b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
728b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
729b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                  acdb_rx_id, acdb_tx_id);
730b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
731b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
732b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
733b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
734b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
73583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_usecase_route_post(void *platform,
73683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                  snd_device_t out_snd_device,
73783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                  snd_device_t in_snd_device)
73883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
73983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
74083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int acdb_rx_id, acdb_tx_id;
74183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
74283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
74383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd == NULL)
74483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        return ret;
74583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
74683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_rx_id = acdb_device_table[out_snd_device];
74783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
74883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_tx_id = acdb_device_table[in_snd_device];
74983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
75083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (acdb_rx_id > 0 && acdb_tx_id > 0) {
75183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
75283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                          my_data->adev->acdb_settings);
75383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
75483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret);
75583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
75683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
75783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
75883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda              acdb_rx_id, acdb_tx_id);
75983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
76083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
76183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
76283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
76383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
764a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurentint platform_start_voice_call(void *platform)
765b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
76683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
76783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
76883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
76983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
770a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ret = my_data->csd->start_voice(VOICE_VSID);
77183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
77283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
77383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
77483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
77583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
776b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
777b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
778a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurentint platform_stop_voice_call(void *platform)
779b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
78083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
78183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
78283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
78383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
784a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ret = my_data->csd->stop_voice(VOICE_VSID);
78583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
78683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
78783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
78883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
78983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
790b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
791b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
792b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_voice_volume(void *platform, int volume)
793b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
794b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
795b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
796b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
79753b2cf0c72aa18a5848919e2309731af652e84f9sangwoo    const char *mixer_ctl_name = "Voice Rx Gain";
798a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    int values[VOLUME_CTL_PARAM_NUM];
799a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    int ret = 0;
800b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
801b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // Voice volume levels are mapped to adsp volume levels as follows.
802b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1  0 -> 0
803b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // But this values don't changed in kernel. So, below change is need.
804a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    volume = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
805b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
806b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
807b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
808b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
809b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
810b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
811b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
812a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    ret = set_volume_values(VOLUME_SET, volume, values);
813a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    if (ret < 0) {
814a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ALOGV("%s: failed setting volume by incorrect type", __func__);
815a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        return -EINVAL;
816a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    }
817a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    ret = mixer_ctl_set_array(ctl, values, sizeof(values)/sizeof(int));
818a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    if (ret < 0) {
819a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ALOGV("%s: failed set mixer ctl by %d", __func__, ret);
820a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        return -EINVAL;
821a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    }
82283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
82383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->volume(ALL_SESSION_VSID, volume,
82483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                   DEFAULT_VOLUME_RAMP_DURATION_MS);
82583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
82683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_volume error %d", __func__, ret);
82783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
82883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
82983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
830b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
831b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
832b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_mic_mute(void *platform, bool state)
833b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
834b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
835b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
836b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
837b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "Voice Tx Mute";
838a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    int values[VOLUME_CTL_PARAM_NUM];
83953b2cf0c72aa18a5848919e2309731af652e84f9sangwoo    int ret = 0;
840cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
841a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    if (adev->mode == AUDIO_MODE_IN_CALL) {
842a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
843a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        if (!ctl) {
844a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            ALOGE("%s: Could not get ctl for mixer cmd - %s",
845a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent                  __func__, mixer_ctl_name);
846a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            return -EINVAL;
847a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        }
848a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ALOGV("Setting mic mute: %d", state);
849a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ret = set_volume_values(MUTE_SET, state, values);
85053b2cf0c72aa18a5848919e2309731af652e84f9sangwoo        if (ret < 0) {
851a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            ALOGV("%s: failed setting mute by incorrect type", __func__);
852a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            return -EINVAL;
853a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        }
854a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        ret = mixer_ctl_set_array(ctl, values, sizeof(values)/sizeof(int));
855a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        if (ret < 0) {
856a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            ALOGV("%s: failed set mixer ctl by %d", __func__, ret);
857a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            return -EINVAL;
85853b2cf0c72aa18a5848919e2309731af652e84f9sangwoo        }
859cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George    }
860cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
861a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent    return 0;
862b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
863b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
864b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices)
865b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
866b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
867b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
868b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_mode_t mode = adev->mode;
869b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
870b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
871b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: enter: output devices(%#x)", __func__, devices);
872b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (devices == AUDIO_DEVICE_NONE ||
873b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        devices & AUDIO_DEVICE_BIT_IN) {
874b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
875b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
876b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
877b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
878b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (mode == AUDIO_MODE_IN_CALL) {
879b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
880b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
881a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            if (adev->tty_mode == TTY_MODE_FULL)
882b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
883a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            else if (adev->tty_mode == TTY_MODE_VCO)
884b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
885a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent            else if (adev->tty_mode == TTY_MODE_HCO)
886b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
887b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            else
888b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
889b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
8909f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
8919f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_OUT_BT_SCO_WB;
8929f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
8939f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_OUT_BT_SCO;
8949f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
895b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
896b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
897b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
898b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (is_operator_tmus())
899b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HANDSET_TMUS;
900b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            else
901b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_HANDSET;
902b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
903b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device != SND_DEVICE_NONE) {
904b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            goto exit;
905b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
906b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
907b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
908b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (popcount(devices) == 2) {
909b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
910b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                        AUDIO_DEVICE_OUT_SPEAKER)) {
911b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
912b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
913b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER)) {
914b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
915b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
916b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER)) {
917b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
918b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
919b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
920b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            goto exit;
921b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
922b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device != SND_DEVICE_NONE) {
923b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            goto exit;
924b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
925b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
926b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
927b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (popcount(devices) != 1) {
928b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
929b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
930b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
931b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
932b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
933b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
934b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HEADPHONES;
935b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
936b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (adev->speaker_lr_swap)
937b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
938b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
939b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER;
940b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
9419f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        if (adev->bt_wb_speech_enabled) {
9429f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_BT_SCO_WB;
9439f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        } else {
9449f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_BT_SCO;
9459f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        }
946b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
947b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HDMI ;
948b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
949b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HANDSET;
950b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
951b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Unknown device(s) %#x", __func__, devices);
952b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
953b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit:
954b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
955b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return snd_device;
956b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
957b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
958b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
959b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
960b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
961b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
962b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_source_t  source = (adev->active_input == NULL) ?
963b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                AUDIO_SOURCE_DEFAULT : adev->active_input->source;
964b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
965b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_mode_t    mode   = adev->mode;
966b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_devices_t in_device = ((adev->active_input == NULL) ?
967b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                    AUDIO_DEVICE_NONE : adev->active_input->device)
968b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                & ~AUDIO_DEVICE_BIT_IN;
969b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
970b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
971b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
972b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
973b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: enter: out_device(%#x) in_device(%#x)",
974b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent          __func__, out_device, in_device);
975b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (mode == AUDIO_MODE_IN_CALL) {
976b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (out_device == AUDIO_DEVICE_NONE) {
977b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: No output device set for voice call", __func__);
978b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            goto exit;
979b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
980a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        if (adev->tty_mode != TTY_MODE_OFF) {
981b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
982b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
983a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent                switch (adev->tty_mode) {
984b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                case TTY_MODE_FULL:
985b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
986b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    break;
987b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                case TTY_MODE_VCO:
988b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
989b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    break;
990b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                case TTY_MODE_HCO:
991b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
992b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    break;
993b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                default:
994a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent                    ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->tty_mode);
995b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                }
996b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                goto exit;
997b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
998b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
999b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
1000b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
1001b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (my_data->fluence_in_voice_call == false) {
1002b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_HANDSET_MIC;
10038e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda                set_echo_reference(adev->mixer, "SLIM_RX");
1004b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else {
1005b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                if (my_data->dualmic_config == DUALMIC_CONFIG_ENDFIRE) {
1006b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    if (is_operator_tmus())
1007b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                        snd_device = SND_DEVICE_IN_VOICE_DMIC_EF_TMUS;
1008b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    else
1009b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                        snd_device = SND_DEVICE_IN_VOICE_DMIC_EF;
1010b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                } else if(my_data->dualmic_config == DUALMIC_CONFIG_BROADSIDE)
1011b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_DMIC_BS;
1012b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                else
1013b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_HANDSET_MIC;
1014b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
1015b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1016b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
1017b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
10189f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
10199f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
10209f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
10219f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_IN_BT_SCO_MIC;
10229f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
1023b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
1024b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode &&
1025b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    my_data->dualmic_config == DUALMIC_CONFIG_ENDFIRE) {
1026b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_EF;
1027b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode &&
1028b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    my_data->dualmic_config == DUALMIC_CONFIG_BROADSIDE) {
1029b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BS;
1030b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else {
1031b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
1032b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
1033b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1034b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_CAMCORDER) {
1035b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
1036b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1037b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
1038b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1039b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1040b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1041b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (my_data->dualmic_config == DUALMIC_CONFIG_ENDFIRE) {
1042b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                if (channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK)
1043b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_EF;
1044b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                else if (my_data->fluence_in_voice_rec)
1045b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_EF_FLUENCE;
1046b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else if (my_data->dualmic_config == DUALMIC_CONFIG_BROADSIDE) {
1047b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                if (channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK)
1048b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_BS;
1049b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                else if (my_data->fluence_in_voice_rec)
1050b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_BS_FLUENCE;
1051b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
1052b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1053b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (snd_device == SND_DEVICE_NONE) {
1054b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
1055b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
1056b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1057b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION) {
1058b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
1059b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            in_device = AUDIO_DEVICE_IN_BACK_MIC;
1060b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (adev->active_input) {
1061b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (adev->active_input->enable_aec) {
1062b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1063b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
1064b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1065b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
1066b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1067b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC;
1068b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                }
1069b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                set_echo_reference(adev->mixer, "SLIM_RX");
1070b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else
1071b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                set_echo_reference(adev->mixer, "NONE");
1072b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1073b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_DEFAULT) {
1074b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
1075b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1076b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1077b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1078b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (snd_device != SND_DEVICE_NONE) {
1079b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
1080b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1081b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1082b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (in_device != AUDIO_DEVICE_NONE &&
1083b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
1084b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
1085b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1086b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
1087b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
1088b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_SPEAKER_MIC;
1089b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1090b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HEADSET_MIC;
1091b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
10929f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
10939f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
10949f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
10959f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_IN_BT_SCO_MIC;
10969f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
1097b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
1098b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HDMI_MIC;
1099b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
1100b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
1101b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGW("%s: Using default handset-mic", __func__);
1102b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
1103b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1104b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
1105b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
1106b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
1107b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1108b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HEADSET_MIC;
1109b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
1110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_SPEAKER_MIC;
1111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
1112b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
1113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
11149f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
11159f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
11169f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
11179f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_IN_BT_SCO_MIC;
11189f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
1119b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
1120b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HDMI_MIC;
1121b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
1122b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
1123b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGW("%s: Using default handset-mic", __func__);
1124b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
1125b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1126b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1127b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit:
1128b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
1129b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return snd_device;
1130b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1131b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1132b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_hdmi_channels(void *platform,  int channel_count)
1133b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1134b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1135b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1136b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
1137b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *channel_cnt_str = NULL;
1138b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "HDMI_RX Channels";
1139b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    switch (channel_count) {
1140b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 8:
1141b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Eight"; break;
1142b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 7:
1143b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Seven"; break;
1144b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 6:
1145b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Six"; break;
1146b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 5:
1147b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Five"; break;
1148b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 4:
1149b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Four"; break;
1150b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 3:
1151b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Three"; break;
1152b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    default:
1153b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Two"; break;
1154b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1155b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1156b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
1157b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
1158b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
1159b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
1160b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1161b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("HDMI channel count: %s", channel_cnt_str);
1162b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
1163b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
1164b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1165b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
116647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew Georgeint platform_edid_get_max_channels(void *platform)
1167b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
116847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct platform_data *my_data = (struct platform_data *)platform;
116947cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct audio_device *adev = my_data->adev;
1170b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
1171b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char *sad = block;
1172b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int num_audio_blocks;
1173b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int channel_count;
1174b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int max_channels = 0;
117547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    int i, ret, count;
1176b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
117747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct mixer_ctl *ctl;
117847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George
117947cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL);
118047cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (!ctl) {
118147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        ALOGE("%s: Could not get ctl for mixer cmd - %s",
118247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George              __func__, AUDIO_DATA_BLOCK_MIXER_CTL);
1183b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return 0;
1184b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1185b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
118647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    mixer_ctl_update(ctl);
118747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George
118847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    count = mixer_ctl_get_num_values(ctl);
1189b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1190b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Read SAD blocks, clamping the maximum size for safety */
119147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (count > (int)sizeof(block))
119247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        count = (int)sizeof(block);
1193b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
119447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    ret = mixer_ctl_get_array(ctl, block, count);
119547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (ret != 0) {
119647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
119747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        return 0;
119847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    }
1199b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1200b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Calculate the number of SAD blocks */
120147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    num_audio_blocks = count / SAD_BLOCK_SIZE;
1202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    for (i = 0; i < num_audio_blocks; i++) {
1204b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        /* Only consider LPCM blocks */
120547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        if ((sad[0] >> 3) != EDID_FORMAT_LPCM) {
120647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George            sad += 3;
1207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            continue;
120847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        }
1209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1210b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_count = (sad[0] & 0x7) + 1;
1211b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (channel_count > max_channels)
1212b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            max_channels = channel_count;
1213b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1214b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        /* Advance to next block */
1215b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        sad += 3;
1216b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1217b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1218b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return max_channels;
1219b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
12207ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George
12217ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George/* Delay in Us */
12227ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew Georgeint64_t platform_render_latency(audio_usecase_t usecase)
12237ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George{
12247ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George    switch (usecase) {
12257ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
12267ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return DEEP_BUFFER_PLATFORM_DELAY;
12277ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
12287ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return LOW_LATENCY_PLATFORM_DELAY;
12297ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        default:
12307ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return 0;
12317ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George    }
12327ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George}
1233