blob: 968ae3958780997a8553e89dfd0fda67e050928a [file] [log] [blame]
Naresh Tannirue3b18452014-03-04 14:44:27 +05301/*
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302 * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved.
3 * Not a Contribution.
4 *
Naresh Tannirue3b18452014-03-04 14:44:27 +05305 * Copyright (C) 2013 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053020#define LOG_TAG "msm8916_platform"
Naresh Tannirue3b18452014-03-04 14:44:27 +053021/*#define LOG_NDEBUG 0*/
22#define LOG_NDDEBUG 0
23
24#include <stdlib.h>
25#include <dlfcn.h>
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +053026#include <fcntl.h>
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -070027#include <sys/ioctl.h>
Naresh Tannirue3b18452014-03-04 14:44:27 +053028#include <cutils/log.h>
29#include <cutils/properties.h>
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053030#include <cutils/str_parms.h>
Naresh Tannirue3b18452014-03-04 14:44:27 +053031#include <audio_hw.h>
32#include <platform_api.h>
33#include "platform.h"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053034#include "audio_extn.h"
35#include "voice_extn.h"
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +053036#include "sound/msmcal-hwdep.h"
37#define SOUND_TRIGGER_DEVICE_HANDSET_MONO_LOW_POWER_ACDB_ID (100)
Naresh Tannirue3b18452014-03-04 14:44:27 +053038
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053039#define MIXER_XML_PATH "/system/etc/mixer_paths.xml"
Asish Bhattacharya4ff24802014-04-24 17:46:54 +053040#define MIXER_XML_PATH_MTP "/system/etc/mixer_paths_mtp.xml"
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +053041#define MIXER_XML_PATH_MSM8909_PM8916 "/system/etc/mixer_paths_msm8909_pm8916.xml"
Walter Yang7ca90d92014-05-06 17:48:02 +080042#define MIXER_XML_PATH_QRD_SKUH "/system/etc/mixer_paths_qrd_skuh.xml"
43#define MIXER_XML_PATH_QRD_SKUI "/system/etc/mixer_paths_qrd_skui.xml"
Walter Yang19f244a2014-06-17 13:30:08 +080044#define MIXER_XML_PATH_QRD_SKUHF "/system/etc/mixer_paths_qrd_skuhf.xml"
Meng Wangf00485b2014-06-03 19:44:38 +080045#define MIXER_XML_PATH_SKUK "/system/etc/mixer_paths_skuk.xml"
Walter Yang42886c52014-10-23 14:31:48 +080046#define MIXER_XML_PATH_SKUA "/system/etc/mixer_paths_skua.xml"
47#define MIXER_XML_PATH_SKUC "/system/etc/mixer_paths_skuc.xml"
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +053048#define MIXER_XML_PATH_SKUE "/system/etc/mixer_paths_skue.xml"
Meng Wangf00485b2014-06-03 19:44:38 +080049#define MIXER_XML_PATH_AUXPCM "/system/etc/mixer_paths_auxpcm.xml"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053050#define MIXER_XML_PATH_AUXPCM "/system/etc/mixer_paths_auxpcm.xml"
Asish Bhattacharyacb8e6d02014-06-19 12:32:25 +053051#define MIXER_XML_PATH_WCD9306 "/system/etc/mixer_paths_wcd9306.xml"
Aviral Gupta8ed0eec2014-08-25 10:22:11 +053052#define MIXER_XML_PATH_WCD9330 "/system/etc/mixer_paths_wcd9330.xml"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053053#define PLATFORM_INFO_XML_PATH "/system/etc/audio_platform_info.xml"
Naresh Tannirue3b18452014-03-04 14:44:27 +053054#define LIB_ACDB_LOADER "libacdbloader.so"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053055#define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID"
Avinash Vaish71c066d2014-08-27 12:32:35 +053056#define CVD_VERSION_MIXER_CTL "CVD Version"
Naresh Tannirue3b18452014-03-04 14:44:27 +053057
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053058#define MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE (256 * 1024)
59#define MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE (2 * 1024)
60#define COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING (2 * 1024)
61#define COMPRESS_OFFLOAD_FRAGMENT_SIZE (32 * 1024)
62/* Used in calculating fragment size for pcm offload */
63#define PCM_OFFLOAD_BUFFER_DURATION_FOR_AV 2000 /* 2 secs */
64#define PCM_OFFLOAD_BUFFER_DURATION_FOR_AV_STREAMING 100 /* 100 millisecs */
Naresh Tannirue3b18452014-03-04 14:44:27 +053065
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053066/* MAX PCM fragment size cannot be increased further due
67 * to flinger's cblk size of 1mb,and it has to be a multiple of
68 * 24 - lcm of channels supported by DSP
Naresh Tannirue3b18452014-03-04 14:44:27 +053069 */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053070#define MAX_PCM_OFFLOAD_FRAGMENT_SIZE (240 * 1024)
71#define MIN_PCM_OFFLOAD_FRAGMENT_SIZE (32 * 1024)
Naresh Tannirue3b18452014-03-04 14:44:27 +053072
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053073#define ALIGN( num, to ) (((num) + (to-1)) & (~(to-1)))
Naresh Tannirue3b18452014-03-04 14:44:27 +053074/*
75 * This file will have a maximum of 38 bytes:
76 *
77 * 4 bytes: number of audio blocks
78 * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
79 * Maximum 10 * 3 bytes: SAD blocks
80 */
81#define MAX_SAD_BLOCKS 10
82#define SAD_BLOCK_SIZE 3
Avinash Vaish71c066d2014-08-27 12:32:35 +053083#define MAX_CVD_VERSION_STRING_SIZE 100
Naresh Tannirue3b18452014-03-04 14:44:27 +053084
85/* EDID format ID for LPCM audio */
86#define EDID_FORMAT_LPCM 1
87
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -070088/* fallback app type if the default app type from acdb loader fails */
89#define DEFAULT_APP_TYPE 0x11130
90
Naresh Tannirudb72d1e2014-03-05 17:33:47 +053091/* Retry for delay in FW loading*/
92#define RETRY_NUMBER 20
93#define RETRY_US 500000
94#define MAX_SND_CARD 8
95
96#define SAMPLE_RATE_8KHZ 8000
97#define SAMPLE_RATE_16KHZ 16000
98
99#define AUDIO_PARAMETER_KEY_FLUENCE_TYPE "fluence"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530100#define AUDIO_PARAMETER_KEY_SLOWTALK "st_enable"
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530101#define AUDIO_PARAMETER_KEY_HD_VOICE "hd_voice"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530102#define AUDIO_PARAMETER_KEY_VOLUME_BOOST "volume_boost"
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530103#define MAX_CAL_NAME 20
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +0530104#define APP_TYPE_SYSTEM_SOUNDS 0x00011131
105#define APP_TYPE_GENERAL_RECORDING 0x00011132
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530106
107char cal_name_info[WCD9XXX_MAX_CAL][MAX_CAL_NAME] = {
108 [WCD9XXX_ANC_CAL] = "anc_cal",
109 [WCD9XXX_MBHC_CAL] = "mbhc_cal",
110 [WCD9XXX_MAD_CAL] = "mad_cal",
111};
112
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530113#define AUDIO_PARAMETER_KEY_REC_PLAY_CONC "rec_play_conc_on"
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530114
115enum {
116 VOICE_FEATURE_SET_DEFAULT,
117 VOICE_FEATURE_SET_VOLUME_BOOST
118};
119
Naresh Tannirue3b18452014-03-04 14:44:27 +0530120struct audio_block_header
121{
122 int reserved;
123 int length;
124};
125
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530126/* Audio calibration related functions */
Naresh Tannirue3b18452014-03-04 14:44:27 +0530127typedef void (*acdb_deallocate_t)();
Dhananjay Kumara3565b32014-07-23 01:12:48 +0530128typedef int (*acdb_init_t)(char *, char *, int);
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700129typedef void (*acdb_send_audio_cal_t)(int, int, int, int);
Naresh Tannirue3b18452014-03-04 14:44:27 +0530130typedef void (*acdb_send_voice_cal_t)(int, int);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530131typedef int (*acdb_reload_vocvoltable_t)(int);
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700132typedef int (*acdb_get_default_app_type_t)(void);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530133typedef int (*acdb_loader_get_calibration_t)(char *attr, int size, void *data);
134acdb_loader_get_calibration_t acdb_loader_get_calibration;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530135
Naresh Tannirue3b18452014-03-04 14:44:27 +0530136struct platform_data {
137 struct audio_device *adev;
138 bool fluence_in_spkr_mode;
139 bool fluence_in_voice_call;
140 bool fluence_in_voice_rec;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530141 bool fluence_in_audio_rec;
142 int fluence_type;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +0530143 char fluence_cap[PROPERTY_VALUE_MAX];
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +0530144 int fluence_mode;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530145 bool slowtalk;
Avinash Vaishd5fa4572014-09-15 14:41:14 +0530146 bool hd_voice;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530147 bool ec_ref_enabled;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530148 /* Audio calibration related functions */
149 void *acdb_handle;
150 int voice_feature_set;
151 acdb_init_t acdb_init;
152 acdb_deallocate_t acdb_deallocate;
153 acdb_send_audio_cal_t acdb_send_audio_cal;
154 acdb_send_voice_cal_t acdb_send_voice_cal;
155 acdb_reload_vocvoltable_t acdb_reload_vocvoltable;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -0700156 acdb_get_default_app_type_t acdb_get_default_app_type;
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530157#ifdef RECORD_PLAY_CONCURRENCY
158 bool rec_play_conc_set;
159#endif
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530160 void *hw_info;
161 struct csd_data *csd;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530162};
163
164static const int pcm_device_table[AUDIO_USECASE_MAX][2] = {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530165 [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
166 DEEP_BUFFER_PCM_DEVICE},
167 [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
168 LOWLATENCY_PCM_DEVICE},
169 [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
170 MULTIMEDIA2_PCM_DEVICE},
171 [USECASE_AUDIO_PLAYBACK_OFFLOAD] =
172 {PLAYBACK_OFFLOAD_DEVICE, PLAYBACK_OFFLOAD_DEVICE},
173 [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE, AUDIO_RECORD_PCM_DEVICE},
174 [USECASE_AUDIO_RECORD_COMPRESS] = {COMPRESS_CAPTURE_DEVICE, COMPRESS_CAPTURE_DEVICE},
175 [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
176 LOWLATENCY_PCM_DEVICE},
177 [USECASE_AUDIO_RECORD_FM_VIRTUAL] = {MULTIMEDIA2_PCM_DEVICE,
178 MULTIMEDIA2_PCM_DEVICE},
179 [USECASE_AUDIO_PLAYBACK_FM] = {FM_PLAYBACK_PCM_DEVICE, FM_CAPTURE_PCM_DEVICE},
180 [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
181 [USECASE_AUDIO_HFP_SCO_WB] = {HFP_PCM_RX, HFP_SCO_RX},
182 [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE, VOICE_CALL_PCM_DEVICE},
183 [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
184 [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
185 [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
Karthik Reddy Katta3b0a60c2014-04-06 14:52:37 +0530186 [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530187 [USECASE_COMPRESS_VOIP_CALL] = {COMPRESS_VOIP_CALL_PCM_DEVICE, COMPRESS_VOIP_CALL_PCM_DEVICE},
188 [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
189 AUDIO_RECORD_PCM_DEVICE},
190 [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
191 AUDIO_RECORD_PCM_DEVICE},
192 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
193 AUDIO_RECORD_PCM_DEVICE},
194 [USECASE_INCALL_REC_UPLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
195 COMPRESS_CAPTURE_DEVICE},
196 [USECASE_INCALL_REC_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
197 COMPRESS_CAPTURE_DEVICE},
198 [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS] = {COMPRESS_CAPTURE_DEVICE,
199 COMPRESS_CAPTURE_DEVICE},
200 [USECASE_INCALL_MUSIC_UPLINK] = {INCALL_MUSIC_UPLINK_PCM_DEVICE,
201 INCALL_MUSIC_UPLINK_PCM_DEVICE},
202 [USECASE_INCALL_MUSIC_UPLINK2] = {INCALL_MUSIC_UPLINK2_PCM_DEVICE,
203 INCALL_MUSIC_UPLINK2_PCM_DEVICE},
204 [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
205 [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
Naresh Tannirue3b18452014-03-04 14:44:27 +0530206};
207
208/* Array to store sound devices */
209static const char * const device_table[SND_DEVICE_MAX] = {
210 [SND_DEVICE_NONE] = "none",
211 /* Playback sound devices */
212 [SND_DEVICE_OUT_HANDSET] = "handset",
213 [SND_DEVICE_OUT_SPEAKER] = "speaker",
214 [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
215 [SND_DEVICE_OUT_HEADPHONES] = "headphones",
216 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
217 [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
218 [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
219 [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
220 [SND_DEVICE_OUT_HDMI] = "hdmi",
221 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
222 [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530223 [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530224 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
225 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
226 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530227 [SND_DEVICE_OUT_AFE_PROXY] = "afe-proxy",
228 [SND_DEVICE_OUT_USB_HEADSET] = "usb-headphones",
229 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
230 [SND_DEVICE_OUT_TRANSMISSION_FM] = "transmission-fm",
231 [SND_DEVICE_OUT_ANC_HEADSET] = "anc-headphones",
232 [SND_DEVICE_OUT_ANC_FB_HEADSET] = "anc-fb-headphones",
233 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = "voice-anc-headphones",
234 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = "voice-anc-fb-headphones",
235 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = "speaker-and-anc-headphones",
236 [SND_DEVICE_OUT_ANC_HANDSET] = "anc-handset",
237 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530238#ifdef RECORD_PLAY_CONCURRENCY
239 [SND_DEVICE_OUT_VOIP_HANDSET] = "voip-handset",
240 [SND_DEVICE_OUT_VOIP_SPEAKER] = "voip-speaker",
241 [SND_DEVICE_OUT_VOIP_HEADPHONES] = "voip-headphones",
242#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +0530243
244 /* Capture sound devices */
245 [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530246 [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530247 [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
248 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
249 [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
250 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
251 [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
252 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
253 [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
254 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
255 [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
256 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
257 [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
258 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
259 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
260 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
261 [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
262 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530263 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
264 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
265 [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
266 [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700267 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530268 [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700269 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530270 [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530271 [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
272 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
273 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = "voice-speaker-qmic",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530274 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
275 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
276 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
277 [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530278 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
279 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
280 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
281 [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
282 [SND_DEVICE_IN_CAPTURE_FM] = "capture-fm",
283 [SND_DEVICE_IN_AANC_HANDSET_MIC] = "aanc-handset-mic",
284 [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
285 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = "handset-stereo-dmic-ef",
286 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = "speaker-stereo-dmic-ef",
287 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +0530288 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = "voice-speaker-dmic-broadside",
289 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = "speaker-dmic-broadside",
290 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = "speaker-dmic-broadside",
291 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = "speaker-dmic-broadside",
292 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = "speaker-dmic-broadside",
Sidipotu Ashok3bcca232014-11-07 14:41:58 +0530293 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = "aanc-fluence-dmic-handset",
Naresh Tannirue3b18452014-03-04 14:44:27 +0530294};
295
296/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530297static int acdb_device_table[SND_DEVICE_MAX] = {
Naresh Tannirue3b18452014-03-04 14:44:27 +0530298 [SND_DEVICE_NONE] = -1,
299 [SND_DEVICE_OUT_HANDSET] = 7,
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530300 [SND_DEVICE_OUT_SPEAKER] = 14,
301 [SND_DEVICE_OUT_SPEAKER_REVERSE] = 14,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530302 [SND_DEVICE_OUT_HEADPHONES] = 10,
303 [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
304 [SND_DEVICE_OUT_VOICE_HANDSET] = 7,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530305 [SND_DEVICE_OUT_VOICE_SPEAKER] = 14,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530306 [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
307 [SND_DEVICE_OUT_HDMI] = 18,
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530308 [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 14,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530309 [SND_DEVICE_OUT_BT_SCO] = 22,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530310 [SND_DEVICE_OUT_BT_SCO_WB] = 39,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530311 [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
312 [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
313 [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530314 [SND_DEVICE_OUT_AFE_PROXY] = 0,
315 [SND_DEVICE_OUT_USB_HEADSET] = 45,
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530316 [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530317 [SND_DEVICE_OUT_TRANSMISSION_FM] = 0,
318 [SND_DEVICE_OUT_ANC_HEADSET] = 26,
319 [SND_DEVICE_OUT_ANC_FB_HEADSET] = 27,
320 [SND_DEVICE_OUT_VOICE_ANC_HEADSET] = 26,
321 [SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET] = 27,
322 [SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET] = 26,
323 [SND_DEVICE_OUT_ANC_HANDSET] = 103,
324 [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 101,
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530325#ifdef RECORD_PLAY_CONCURRENCY
326 [SND_DEVICE_OUT_VOIP_HANDSET] = 133,
327 [SND_DEVICE_OUT_VOIP_SPEAKER] = 132,
328 [SND_DEVICE_OUT_VOIP_HEADPHONES] = 134,
329#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +0530330
331 [SND_DEVICE_IN_HANDSET_MIC] = 4,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530332 [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
333 [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
334 [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
335 [SND_DEVICE_IN_HANDSET_DMIC] = 41,
336 [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
337 [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
338 [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
339 [SND_DEVICE_IN_SPEAKER_MIC] = 11,
340 [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
341 [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
342 [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
343 [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
344 [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
345 [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
346 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530347 [SND_DEVICE_IN_HEADSET_MIC] = 8,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530348 [SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530349 [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
350 [SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
351 [SND_DEVICE_IN_HDMI_MIC] = 4,
352 [SND_DEVICE_IN_BT_SCO_MIC] = 21,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700353 [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 122,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530354 [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700355 [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 123,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530356 [SND_DEVICE_IN_CAMCORDER_MIC] = 4,
357 [SND_DEVICE_IN_VOICE_DMIC] = 41,
358 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
359 [SND_DEVICE_IN_VOICE_SPEAKER_QMIC] = 19,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530360 [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
361 [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
362 [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530363 [SND_DEVICE_IN_VOICE_REC_MIC] = 4,
364 [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 107,
365 [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 34,
366 [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 41,
367 [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
368 [SND_DEVICE_IN_CAPTURE_FM] = 0,
369 [SND_DEVICE_IN_AANC_HANDSET_MIC] = 104,
370 [SND_DEVICE_IN_QUAD_MIC] = 46,
371 [SND_DEVICE_IN_HANDSET_STEREO_DMIC] = 34,
372 [SND_DEVICE_IN_SPEAKER_STEREO_DMIC] = 35,
373 [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +0530374 [SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE] = 12,
375 [SND_DEVICE_IN_SPEAKER_DMIC_BROADSIDE] = 12,
376 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE] = 119,
377 [SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE] = 121,
378 [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE] = 120,
Sidipotu Ashok3bcca232014-11-07 14:41:58 +0530379 [SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC] = 135,
Naresh Tannirue3b18452014-03-04 14:44:27 +0530380};
381
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530382struct snd_device_index {
383 char name[100];
384 unsigned int index;
385};
Naresh Tannirue3b18452014-03-04 14:44:27 +0530386
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530387#define TO_NAME_INDEX(X) #X, X
Naresh Tannirue3b18452014-03-04 14:44:27 +0530388
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530389/* Used to get index from parsed sting */
390struct snd_device_index snd_device_name_index[SND_DEVICE_MAX] = {
391 {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)},
392 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)},
393 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)},
394 {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
395 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
396 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
397 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
398 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
399 {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
400 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)},
401 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
402 {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
403 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
404 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
405 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
406 {TO_NAME_INDEX(SND_DEVICE_OUT_AFE_PROXY)},
407 {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADSET)},
408 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)},
409 {TO_NAME_INDEX(SND_DEVICE_OUT_TRANSMISSION_FM)},
410 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HEADSET)},
411 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_FB_HEADSET)},
412 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_HEADSET)},
413 {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET)},
414 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET)},
415 {TO_NAME_INDEX(SND_DEVICE_OUT_ANC_HANDSET)},
416 {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
Naresh Tanniruc0517bc2014-10-26 15:30:55 +0530417#ifdef RECORD_PLAY_CONCURRENCY
418 {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HANDSET)},
419 {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_SPEAKER)},
420 {TO_NAME_INDEX(SND_DEVICE_OUT_VOIP_HEADPHONES)},
421#endif
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530422 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
423 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
424 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)},
425 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)},
426 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)},
427 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)},
428 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)},
429 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)},
430 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)},
431 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)},
432 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)},
433 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)},
434 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)},
435 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)},
436 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)},
437 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)},
438 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)},
439 {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_FLUENCE)},
440 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
441 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
442 {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
443 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700444 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530445 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
Vicky Sehrawate240e5d2014-08-12 17:17:04 -0700446 {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530447 {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
448 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)},
449 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)},
450 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_QMIC)},
451 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)},
452 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)},
453 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)},
454 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
455 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
456 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
457 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
458 {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC)},
459 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_FM)},
460 {TO_NAME_INDEX(SND_DEVICE_IN_AANC_HANDSET_MIC)},
461 {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
462 {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_STEREO_DMIC)},
463 {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_STEREO_DMIC)},
464 {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
Sidipotu Ashok3bcca232014-11-07 14:41:58 +0530465 {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC)},
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530466};
467
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700468#define NO_COLS 2
469static int msm_be_id_array_len;
470static int (*msm_device_to_be_id)[];
471
472/* Below table lists output device to BE_ID mapping*/
473/* Update the table based on the board configuration*/
474
475static int msm_device_to_be_id_internal_codec [][NO_COLS] = {
476 {AUDIO_DEVICE_OUT_EARPIECE , 34},
477 {AUDIO_DEVICE_OUT_SPEAKER , 34},
478 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 34},
479 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 34},
480 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
481 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
482 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
483 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
484 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
485 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
486 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
487 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
488 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
489 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
490 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
491 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
492 {AUDIO_DEVICE_OUT_PROXY , 9},
493 {AUDIO_DEVICE_OUT_FM , 7},
494 {AUDIO_DEVICE_OUT_FM_TX , 8},
495 {AUDIO_DEVICE_OUT_ALL , -1},
496 {AUDIO_DEVICE_NONE , -1},
497 {AUDIO_DEVICE_OUT_DEFAULT , -1},
498};
499
500static int msm_device_to_be_id_external_codec [][NO_COLS] = {
501 {AUDIO_DEVICE_OUT_EARPIECE , 2},
502 {AUDIO_DEVICE_OUT_SPEAKER , 2},
503 {AUDIO_DEVICE_OUT_WIRED_HEADSET , 2},
504 {AUDIO_DEVICE_OUT_WIRED_HEADPHONE , 2},
505 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO , 11},
506 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET , 11},
507 {AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT , 11},
508 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP , -1},
509 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES , -1},
510 {AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER , -1},
511 {AUDIO_DEVICE_OUT_AUX_DIGITAL , 4},
512 {AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET , 9},
513 {AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET , 9},
514 {AUDIO_DEVICE_OUT_USB_ACCESSORY , -1},
515 {AUDIO_DEVICE_OUT_USB_DEVICE , -1},
516 {AUDIO_DEVICE_OUT_REMOTE_SUBMIX , 9},
517 {AUDIO_DEVICE_OUT_PROXY , 9},
518 {AUDIO_DEVICE_OUT_FM , 7},
519 {AUDIO_DEVICE_OUT_FM_TX , 8},
520 {AUDIO_DEVICE_OUT_ALL , -1},
521 {AUDIO_DEVICE_NONE , -1},
522 {AUDIO_DEVICE_OUT_DEFAULT , -1},
523};
524
525
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530526#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
527#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
Naresh Tannirue3b18452014-03-04 14:44:27 +0530528
Asish Bhattacharya4ff24802014-04-24 17:46:54 +0530529static void query_platform(const char *snd_card_name,
530 char *mixer_xml_path)
531{
532 if (!strncmp(snd_card_name, "msm8x16-snd-card-mtp",
533 sizeof("msm8x16-snd-card-mtp"))) {
534 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
535 sizeof(MIXER_XML_PATH_MTP));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700536
537 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
538 msm_be_id_array_len =
539 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
540
Walter Yang7ca90d92014-05-06 17:48:02 +0800541 } else if (!strncmp(snd_card_name, "msm8x16-skuh-snd-card",
542 sizeof("msm8x16-skuh-snd-card"))) {
543 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUH,
544 sizeof(MIXER_XML_PATH_QRD_SKUH));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700545
546 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
547 msm_be_id_array_len =
548 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
549
Walter Yang7ca90d92014-05-06 17:48:02 +0800550 } else if (!strncmp(snd_card_name, "msm8x16-skui-snd-card",
551 sizeof("msm8x16-skui-snd-card"))) {
552 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUI,
553 sizeof(MIXER_XML_PATH_QRD_SKUI));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700554
555 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
556 msm_be_id_array_len =
557 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
558
Walter Yang19f244a2014-06-17 13:30:08 +0800559 } else if (!strncmp(snd_card_name, "msm8x16-skuhf-snd-card",
560 sizeof("msm8x16-skuhf-snd-card"))) {
561 strlcpy(mixer_xml_path, MIXER_XML_PATH_QRD_SKUHF,
562 sizeof(MIXER_XML_PATH_QRD_SKUHF));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700563
564 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
565 msm_be_id_array_len =
566 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
567
Walter Yangc899d572014-05-27 21:52:17 +0800568 } else if (!strncmp(snd_card_name, "msm8939-snd-card-mtp",
Yamit Mehtac6003e22014-05-19 10:26:02 +0530569 sizeof("msm8939-snd-card-mtp"))) {
Aravind Kumar71ba22b2014-06-23 15:18:50 +0530570 strlcpy(mixer_xml_path, MIXER_XML_PATH_MTP,
571 sizeof(MIXER_XML_PATH_MTP));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700572
573 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
574 msm_be_id_array_len =
575 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
576
Meng Wangf00485b2014-06-03 19:44:38 +0800577 } else if (!strncmp(snd_card_name, "msm8939-snd-card-skuk",
578 sizeof("msm8939-snd-card-skuk"))) {
579 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUK,
580 sizeof(MIXER_XML_PATH_SKUK));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700581 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
582 msm_be_id_array_len =
583 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
584
Asish Bhattacharyacb8e6d02014-06-19 12:32:25 +0530585 } else if (!strncmp(snd_card_name, "msm8939-tapan-snd-card",
586 sizeof("msm8939-tapan-snd-card"))) {
587 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9306,
588 sizeof(MIXER_XML_PATH_WCD9306));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700589 msm_device_to_be_id = msm_device_to_be_id_external_codec;
590 msm_be_id_array_len =
591 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
592
Asish Bhattacharyacb8e6d02014-06-19 12:32:25 +0530593 } else if (!strncmp(snd_card_name, "msm8939-tapan9302-snd-card",
594 sizeof("msm8939-tapan9302-snd-card"))) {
595 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9306,
596 sizeof(MIXER_XML_PATH_WCD9306));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700597
598 msm_device_to_be_id = msm_device_to_be_id_external_codec;
599 msm_be_id_array_len =
600 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
601
Aviral Gupta8ed0eec2014-08-25 10:22:11 +0530602 } else if (!strncmp(snd_card_name, "msm8939-tomtom9330-snd-card",
603 sizeof("msm8939-tomtom9330-snd-card"))) {
604 strlcpy(mixer_xml_path, MIXER_XML_PATH_WCD9330,
605 sizeof(MIXER_XML_PATH_WCD9330));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700606 msm_device_to_be_id = msm_device_to_be_id_external_codec;
607 msm_be_id_array_len =
608 sizeof(msm_device_to_be_id_external_codec) / sizeof(msm_device_to_be_id_external_codec[0]);
609
Walter Yang42886c52014-10-23 14:31:48 +0800610 } else if (!strncmp(snd_card_name, "msm8909-skua-snd-card",
611 sizeof("msm8909-skua-snd-card"))) {
612 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUA,
613 sizeof(MIXER_XML_PATH_SKUA));
Walter Yang42886c52014-10-23 14:31:48 +0800614 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
615 msm_be_id_array_len =
616 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +0530617
Walter Yang42886c52014-10-23 14:31:48 +0800618 } else if (!strncmp(snd_card_name, "msm8909-skuc-snd-card",
619 sizeof("msm8909-skuc-snd-card"))) {
620 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUC,
621 sizeof(MIXER_XML_PATH_SKUC));
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +0530622 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
623 msm_be_id_array_len =
624 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
625
626 } else if (!strncmp(snd_card_name, "msm8909-pm8916-snd-card",
627 sizeof("msm8909-pm8916-snd-card"))) {
628 strlcpy(mixer_xml_path, MIXER_XML_PATH_MSM8909_PM8916,
629 sizeof(MIXER_XML_PATH_MSM8909_PM8916));
Walter Yang42886c52014-10-23 14:31:48 +0800630
631 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
632 msm_be_id_array_len =
633 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +0530634
635 } else if (!strncmp(snd_card_name, "msm8909-skue-snd-card",
636 sizeof("msm8909-skue-snd-card"))) {
637 strlcpy(mixer_xml_path, MIXER_XML_PATH_SKUE,
638 sizeof(MIXER_XML_PATH_SKUE));
639 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
640 msm_be_id_array_len =
641 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
642
Asish Bhattacharya4ff24802014-04-24 17:46:54 +0530643 } else {
644 strlcpy(mixer_xml_path, MIXER_XML_PATH,
645 sizeof(MIXER_XML_PATH));
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -0700646
647 msm_device_to_be_id = msm_device_to_be_id_internal_codec;
648 msm_be_id_array_len =
649 sizeof(msm_device_to_be_id_internal_codec) / sizeof(msm_device_to_be_id_internal_codec[0]);
650
Asish Bhattacharya4ff24802014-04-24 17:46:54 +0530651 }
652}
653
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530654void platform_set_echo_reference(void *platform, bool enable)
Naresh Tannirue3b18452014-03-04 14:44:27 +0530655{
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530656 struct platform_data *my_data = (struct platform_data *)platform;
657 struct audio_device *adev = my_data->adev;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530658
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530659 if (enable) {
660 my_data->ec_ref_enabled = enable;
661 audio_route_apply_and_update_path(adev->audio_route, "echo-reference");
662 } else {
663 if (my_data->ec_ref_enabled) {
664 audio_route_reset_and_update_path(adev->audio_route, "echo-reference");
665 my_data->ec_ref_enabled = enable;
666 } else {
667 ALOGV("EC reference is already disabled : %d", my_data->ec_ref_enabled);
668 }
669 }
Venkata Narendra Kumar Gutta3fa54c72014-08-18 18:02:21 +0530670
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +0530671 ALOGV("Setting EC Reference: %d", enable);
Naresh Tannirue3b18452014-03-04 14:44:27 +0530672}
673
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530674static struct csd_data *open_csd_client()
675{
676 struct csd_data *csd = calloc(1, sizeof(struct csd_data));
677
678 csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
679 if (csd->csd_client == NULL) {
680 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
681 goto error;
682 } else {
683 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
684
685 csd->deinit = (deinit_t)dlsym(csd->csd_client,
686 "csd_client_deinit");
687 if (csd->deinit == NULL) {
688 ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
689 dlerror());
690 goto error;
691 }
692 csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
693 "csd_client_disable_device");
694 if (csd->disable_device == NULL) {
695 ALOGE("%s: dlsym error %s for csd_client_disable_device",
696 __func__, dlerror());
697 goto error;
698 }
699 csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client,
700 "csd_client_enable_device_config");
701 if (csd->enable_device_config == NULL) {
702 ALOGE("%s: dlsym error %s for csd_client_enable_device_config",
703 __func__, dlerror());
704 goto error;
705 }
706 csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
707 "csd_client_enable_device");
708 if (csd->enable_device == NULL) {
709 ALOGE("%s: dlsym error %s for csd_client_enable_device",
710 __func__, dlerror());
711 goto error;
712 }
713 csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
714 "csd_client_start_voice");
715 if (csd->start_voice == NULL) {
716 ALOGE("%s: dlsym error %s for csd_client_start_voice",
717 __func__, dlerror());
718 goto error;
719 }
720 csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
721 "csd_client_stop_voice");
722 if (csd->stop_voice == NULL) {
723 ALOGE("%s: dlsym error %s for csd_client_stop_voice",
724 __func__, dlerror());
725 goto error;
726 }
727 csd->volume = (volume_t)dlsym(csd->csd_client,
728 "csd_client_volume");
729 if (csd->volume == NULL) {
730 ALOGE("%s: dlsym error %s for csd_client_volume",
731 __func__, dlerror());
732 goto error;
733 }
734 csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
735 "csd_client_mic_mute");
736 if (csd->mic_mute == NULL) {
737 ALOGE("%s: dlsym error %s for csd_client_mic_mute",
738 __func__, dlerror());
739 goto error;
740 }
741 csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
742 "csd_client_slow_talk");
743 if (csd->slow_talk == NULL) {
744 ALOGE("%s: dlsym error %s for csd_client_slow_talk",
745 __func__, dlerror());
746 goto error;
747 }
748 csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
749 "csd_client_start_playback");
750 if (csd->start_playback == NULL) {
751 ALOGE("%s: dlsym error %s for csd_client_start_playback",
752 __func__, dlerror());
753 goto error;
754 }
755 csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
756 "csd_client_stop_playback");
757 if (csd->stop_playback == NULL) {
758 ALOGE("%s: dlsym error %s for csd_client_stop_playback",
759 __func__, dlerror());
760 goto error;
761 }
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -0700762 csd->set_lch = (set_lch_t)dlsym(csd->csd_client, "csd_client_set_lch");
763 if (csd->set_lch == NULL) {
764 ALOGE("%s: dlsym error %s for csd_client_set_lch",
765 __func__, dlerror());
766 /* Ignore the error as this is not mandatory function for
767 * basic voice call to work.
768 */
769 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530770 csd->start_record = (start_record_t)dlsym(csd->csd_client,
771 "csd_client_start_record");
772 if (csd->start_record == NULL) {
773 ALOGE("%s: dlsym error %s for csd_client_start_record",
774 __func__, dlerror());
775 goto error;
776 }
777 csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
778 "csd_client_stop_record");
779 if (csd->stop_record == NULL) {
780 ALOGE("%s: dlsym error %s for csd_client_stop_record",
781 __func__, dlerror());
782 goto error;
783 }
784 csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
785
786 if (csd->init == NULL) {
787 ALOGE("%s: dlsym error %s for csd_client_init",
788 __func__, dlerror());
789 goto error;
790 } else {
791 csd->init();
792 }
793 }
794 return csd;
795
796error:
797 free(csd);
798 csd = NULL;
799 return csd;
800}
801
802void close_csd_client(struct csd_data *csd)
803{
804 if (csd != NULL) {
805 csd->deinit();
806 dlclose(csd->csd_client);
807 free(csd);
808 csd = NULL;
809 }
810}
811
Avinash Vaish71c066d2014-08-27 12:32:35 +0530812void get_cvd_version(char *cvd_version, struct audio_device *adev)
813{
814 struct mixer_ctl *ctl;
815 int count;
816 int ret = 0;
817
818 ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL);
819 if (!ctl) {
820 ALOGE("%s: Could not get ctl for mixer cmd - %s", __func__, CVD_VERSION_MIXER_CTL);
821 goto done;
822 }
823 mixer_ctl_update(ctl);
824
825 count = mixer_ctl_get_num_values(ctl);
826 if (count > MAX_CVD_VERSION_STRING_SIZE)
827 count = MAX_CVD_VERSION_STRING_SIZE;
828
829 ret = mixer_ctl_get_array(ctl, cvd_version, count);
830 if (ret != 0) {
831 ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__);
832 goto done;
833 }
834
835done:
836 return;
837}
838
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530839static int hw_util_open(int card_no)
840{
841 int fd = -1;
842 char dev_name[256];
843
844 snprintf(dev_name, sizeof(dev_name), "/dev/snd/hwC%uD%u",
845 card_no, WCD9XXX_CODEC_HWDEP_NODE);
846 ALOGD("%s Opening device %s\n", __func__, dev_name);
847 fd = open(dev_name, O_WRONLY);
848 if (fd < 0) {
849 ALOGE("%s: cannot open device '%s'\n", __func__, dev_name);
850 return fd;
851 }
852 ALOGD("%s success", __func__);
853 return fd;
854}
855
856struct param_data {
857 int use_case;
858 int acdb_id;
859 int get_size;
860 int buff_size;
861 int data_size;
862 void *buff;
863};
864
865static int send_codec_cal(acdb_loader_get_calibration_t acdb_loader_get_calibration, int fd)
866{
867 int ret = 0, type;
868
869 for (type = WCD9XXX_ANC_CAL; type < WCD9XXX_MAX_CAL; type++) {
870 struct wcdcal_ioctl_buffer codec_buffer;
871 struct param_data calib;
872
873 if (!strcmp(cal_name_info[type], "mad_cal"))
874 calib.acdb_id = SOUND_TRIGGER_DEVICE_HANDSET_MONO_LOW_POWER_ACDB_ID;
875 calib.get_size = 1;
876 ret = acdb_loader_get_calibration(cal_name_info[type], sizeof(struct param_data),
877 &calib);
878 if (ret < 0) {
879 ALOGE("%s get_calibration failed\n", __func__);
880 return ret;
881 }
882 calib.get_size = 0;
883 calib.buff = malloc(calib.buff_size);
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +0530884 if(calib.buff == NULL) {
885 ALOGE("%s mem allocation for %d bytes for %s failed\n"
886 , __func__, calib.buff_size, cal_name_info[type]);
887 return -1;
888 }
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530889 ret = acdb_loader_get_calibration(cal_name_info[type],
890 sizeof(struct param_data), &calib);
891 if (ret < 0) {
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +0530892 ALOGE("%s get_calibration failed type=%s calib.size=%d\n"
893 , __func__, cal_name_info[type], codec_buffer.size);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530894 free(calib.buff);
895 return ret;
896 }
897 codec_buffer.buffer = calib.buff;
898 codec_buffer.size = calib.data_size;
899 codec_buffer.cal_type = type;
900 if (ioctl(fd, SNDRV_CTL_IOCTL_HWDEP_CAL_TYPE, &codec_buffer) < 0)
Sidipotu Ashok04ab3d32014-12-30 10:28:31 +0530901 ALOGE("Failed to call ioctl for %s err=%d calib.size=%d",
902 cal_name_info[type], errno, codec_buffer.size);
903 ALOGD("%s cal sent for %s calib.size=%d"
904 , __func__, cal_name_info[type], codec_buffer.size);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +0530905 free(calib.buff);
906 }
907 return ret;
908}
909
910static void audio_hwdep_send_cal(struct platform_data *plat_data)
911{
912 int fd;
913
914 fd = hw_util_open(plat_data->adev->snd_card);
915 if (fd == -1) {
916 ALOGE("%s error open\n", __func__);
917 return;
918 }
919
920 acdb_loader_get_calibration = (acdb_loader_get_calibration_t)
921 dlsym(plat_data->acdb_handle, "acdb_loader_get_calibration");
922
923 if (acdb_loader_get_calibration == NULL) {
924 ALOGE("%s: ERROR. dlsym Error:%s acdb_loader_get_calibration", __func__,
925 dlerror());
926 return;
927 }
928 if (send_codec_cal(acdb_loader_get_calibration, fd) < 0)
929 ALOGE("%s: Could not send anc cal", __FUNCTION__);
930}
931
Naresh Tannirue3b18452014-03-04 14:44:27 +0530932void *platform_init(struct audio_device *adev)
933{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530934 char platform[PROPERTY_VALUE_MAX];
935 char baseband[PROPERTY_VALUE_MAX];
Naresh Tannirue3b18452014-03-04 14:44:27 +0530936 char value[PROPERTY_VALUE_MAX];
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530937 struct platform_data *my_data = NULL;
Dhananjay Kumara3565b32014-07-23 01:12:48 +0530938 int retry_num = 0, snd_card_num = 0, key = 0;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530939 const char *snd_card_name;
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +0530940 char mixer_xml_path[100],ffspEnable[PROPERTY_VALUE_MAX];
Avinash Vaish71c066d2014-08-27 12:32:35 +0530941 char *cvd_version = NULL;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530942
943 my_data = calloc(1, sizeof(struct platform_data));
944
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530945 while (snd_card_num < MAX_SND_CARD) {
946 adev->mixer = mixer_open(snd_card_num);
947
948 while (!adev->mixer && retry_num < RETRY_NUMBER) {
949 usleep(RETRY_US);
950 adev->mixer = mixer_open(snd_card_num);
951 retry_num++;
952 }
953
954 if (!adev->mixer) {
955 ALOGE("%s: Unable to open the mixer card: %d", __func__,
956 snd_card_num);
957 retry_num = 0;
958 snd_card_num++;
959 continue;
960 }
961
962 snd_card_name = mixer_get_name(adev->mixer);
963 ALOGV("%s: snd_card_name: %s", __func__, snd_card_name);
964
965 my_data->hw_info = hw_info_init(snd_card_name);
966 if (!my_data->hw_info) {
967 ALOGE("%s: Failed to init hardware info", __func__);
968 } else {
Asish Bhattacharya4ff24802014-04-24 17:46:54 +0530969 query_platform(snd_card_name, mixer_xml_path);
970 ALOGD("%s: mixer path file is %s", __func__,
971 mixer_xml_path);
972 if (audio_extn_read_xml(adev, snd_card_num, mixer_xml_path,
973 MIXER_XML_PATH_AUXPCM) == -ENOSYS) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530974 adev->audio_route = audio_route_init(snd_card_num,
Asish Bhattacharya4ff24802014-04-24 17:46:54 +0530975 mixer_xml_path);
976 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +0530977 if (!adev->audio_route) {
978 ALOGE("%s: Failed to init audio route controls, aborting.",
979 __func__);
980 free(my_data);
981 return NULL;
982 }
983 adev->snd_card = snd_card_num;
984 ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
985 break;
986 }
987 retry_num = 0;
988 snd_card_num++;
989 }
990
991 if (snd_card_num >= MAX_SND_CARD) {
992 ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
993 free(my_data);
994 return NULL;
995 }
996
Naresh Tannirue3b18452014-03-04 14:44:27 +0530997 my_data->adev = adev;
Naresh Tannirue3b18452014-03-04 14:44:27 +0530998 my_data->fluence_in_spkr_mode = false;
999 my_data->fluence_in_voice_call = false;
1000 my_data->fluence_in_voice_rec = false;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301001 my_data->fluence_in_audio_rec = false;
1002 my_data->fluence_type = FLUENCE_NONE;
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05301003 my_data->fluence_mode = FLUENCE_ENDFIRE;
Avinash Vaishd5fa4572014-09-15 14:41:14 +05301004 my_data->slowtalk = false;
1005 my_data->hd_voice = false;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301006
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05301007 property_get("ro.qc.sdk.audio.fluencetype", my_data->fluence_cap, "");
1008 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro"))) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301009 my_data->fluence_type = FLUENCE_QUAD_MIC | FLUENCE_DUAL_MIC;
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05301010 } else if (!strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301011 my_data->fluence_type = FLUENCE_DUAL_MIC;
1012 } else {
1013 my_data->fluence_type = FLUENCE_NONE;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301014 }
1015
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301016 if (my_data->fluence_type != FLUENCE_NONE) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301017 property_get("persist.audio.fluence.voicecall",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301018 if (!strncmp("true", value, sizeof("true"))) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301019 my_data->fluence_in_voice_call = true;
1020 }
1021
1022 property_get("persist.audio.fluence.voicerec",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301023 if (!strncmp("true", value, sizeof("true"))) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301024 my_data->fluence_in_voice_rec = true;
1025 }
1026
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301027 property_get("persist.audio.fluence.audiorec",value,"");
1028 if (!strncmp("true", value, sizeof("true"))) {
1029 my_data->fluence_in_audio_rec = true;
1030 }
1031
Naresh Tannirue3b18452014-03-04 14:44:27 +05301032 property_get("persist.audio.fluence.speaker",value,"");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301033 if (!strncmp("true", value, sizeof("true"))) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301034 my_data->fluence_in_spkr_mode = true;
1035 }
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05301036
1037 property_get("persist.audio.fluence.mode",value,"");
1038 if (!strncmp("broadside", value, sizeof("broadside"))) {
1039 my_data->fluence_mode = FLUENCE_BROADSIDE;
1040 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05301041 }
Srikanth Uyyalaa675cd12014-10-15 14:48:11 +05301042 property_get("persist.audio.FFSP.enable", ffspEnable, "");
1043 if (!strncmp("true", ffspEnable, sizeof("true"))) {
1044 acdb_device_table[SND_DEVICE_OUT_SPEAKER] = 131;
1045 acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = 131;
1046 acdb_device_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 131;
1047 acdb_device_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 131;
1048 }
Dhananjay Kumara3565b32014-07-23 01:12:48 +05301049 property_get("audio.ds1.metainfo.key",value,"0");
1050 key = atoi(value);
1051
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301052 my_data->voice_feature_set = VOICE_FEATURE_SET_DEFAULT;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301053 my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
1054 if (my_data->acdb_handle == NULL) {
1055 ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
1056 } else {
1057 ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
1058 my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
1059 "acdb_loader_deallocate_ACDB");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301060 if (!my_data->acdb_deallocate)
1061 ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
1062 __func__, LIB_ACDB_LOADER);
1063
Naresh Tannirue3b18452014-03-04 14:44:27 +05301064 my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07001065 "acdb_loader_send_audio_cal_v2");
Naresh Tannirue3b18452014-03-04 14:44:27 +05301066 if (!my_data->acdb_send_audio_cal)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301067 ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s",
Naresh Tannirue3b18452014-03-04 14:44:27 +05301068 __func__, LIB_ACDB_LOADER);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301069
Naresh Tannirue3b18452014-03-04 14:44:27 +05301070 my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
1071 "acdb_loader_send_voice_cal");
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301072 if (!my_data->acdb_send_voice_cal)
1073 ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
1074 __func__, LIB_ACDB_LOADER);
1075
1076 my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
1077 "acdb_loader_reload_vocvoltable");
1078 if (!my_data->acdb_reload_vocvoltable)
1079 ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
1080 __func__, LIB_ACDB_LOADER);
1081
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07001082 my_data->acdb_get_default_app_type = (acdb_get_default_app_type_t)dlsym(
1083 my_data->acdb_handle,
1084 "acdb_loader_get_default_app_type");
1085 if (!my_data->acdb_get_default_app_type)
1086 ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
1087 __func__, LIB_ACDB_LOADER);
1088
Naresh Tannirue3b18452014-03-04 14:44:27 +05301089 my_data->acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301090 "acdb_loader_init_v2");
Avinash Vaish71c066d2014-08-27 12:32:35 +05301091 if (my_data->acdb_init == NULL) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301092 ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror());
Avinash Vaish71c066d2014-08-27 12:32:35 +05301093 goto acdb_init_fail;
1094 }
1095
1096 cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
1097 if (!cvd_version)
1098 ALOGE("Failed to allocate cvd version");
Naresh Tannirue3b18452014-03-04 14:44:27 +05301099 else
Avinash Vaish71c066d2014-08-27 12:32:35 +05301100 get_cvd_version(cvd_version, adev);
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301101 my_data->acdb_init(snd_card_name, cvd_version, key);
Avinash Vaish71c066d2014-08-27 12:32:35 +05301102 if (cvd_version)
1103 free(cvd_version);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301104 }
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301105 audio_extn_pm_vote();
Naresh Tannirue3b18452014-03-04 14:44:27 +05301106
Avinash Vaish71c066d2014-08-27 12:32:35 +05301107acdb_init_fail:
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301108 /* Initialize ACDB ID's */
1109 platform_info_init(PLATFORM_INFO_XML_PATH);
1110
1111 /* init usb */
1112 audio_extn_usb_init(adev);
1113 /* update sound cards appropriately */
1114 audio_extn_usb_set_proxy_sound_card(adev->snd_card);
1115
1116 /* Read one time ssr property */
1117 audio_extn_ssr_update_enabled();
1118 audio_extn_spkr_prot_init(adev);
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05301119
Ashish Jain8ec50472014-10-16 13:56:28 +05301120 /* init dap hal */
1121 audio_extn_dap_hal_init(adev->snd_card);
1122
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05301123 audio_extn_dolby_set_license(adev);
Srikanth Uyyalacae4aa32014-10-17 13:44:09 +05301124 audio_hwdep_send_cal(my_data);
Dhananjay Kumar89ea3bd2014-04-29 15:45:57 +05301125
Naresh Tannirue3b18452014-03-04 14:44:27 +05301126 return my_data;
1127}
1128
1129void platform_deinit(void *platform)
1130{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301131 struct platform_data *my_data = (struct platform_data *)platform;
1132
1133 hw_info_deinit(my_data->hw_info);
1134 close_csd_client(my_data->csd);
1135
Naresh Tannirue3b18452014-03-04 14:44:27 +05301136 free(platform);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301137 /* deinit usb */
1138 audio_extn_usb_deinit();
Ashish Jain8ec50472014-10-16 13:56:28 +05301139 audio_extn_dap_hal_deinit();
Naresh Tannirue3b18452014-03-04 14:44:27 +05301140}
1141
1142const char *platform_get_snd_device_name(snd_device_t snd_device)
1143{
1144 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX)
1145 return device_table[snd_device];
1146 else
1147 return "";
1148}
1149
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301150int platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
1151 char *device_name)
1152{
1153 struct platform_data *my_data = (struct platform_data *)platform;
1154
1155 if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
1156 strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
1157 hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
1158 } else {
1159 strlcpy(device_name, "", DEVICE_NAME_MAX_SIZE);
1160 return -EINVAL;
1161 }
1162
1163 return 0;
1164}
1165
Naresh Tannirue3b18452014-03-04 14:44:27 +05301166void platform_add_backend_name(char *mixer_path, snd_device_t snd_device)
1167{
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07001168 if ((snd_device == SND_DEVICE_IN_BT_SCO_MIC) ||
1169 (snd_device == SND_DEVICE_IN_BT_SCO_MIC_NREC))
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301170 strlcat(mixer_path, " bt-sco", MIXER_PATH_MAX_LENGTH);
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07001171 else if ((snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB) ||
1172 (snd_device == SND_DEVICE_IN_BT_SCO_MIC_WB_NREC))
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301173 strlcat(mixer_path, " bt-sco-wb", MIXER_PATH_MAX_LENGTH);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301174 else if(snd_device == SND_DEVICE_OUT_BT_SCO)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301175 strlcat(mixer_path, " bt-sco", MIXER_PATH_MAX_LENGTH);
1176 else if(snd_device == SND_DEVICE_OUT_BT_SCO_WB)
1177 strlcat(mixer_path, " bt-sco-wb", MIXER_PATH_MAX_LENGTH);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301178 else if (snd_device == SND_DEVICE_OUT_HDMI)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301179 strlcat(mixer_path, " hdmi", MIXER_PATH_MAX_LENGTH);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301180 else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HDMI)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301181 strlcat(mixer_path, " speaker-and-hdmi", MIXER_PATH_MAX_LENGTH);
1182 else if (snd_device == SND_DEVICE_OUT_AFE_PROXY)
1183 strlcat(mixer_path, " afe-proxy", MIXER_PATH_MAX_LENGTH);
1184 else if (snd_device == SND_DEVICE_OUT_USB_HEADSET)
1185 strlcat(mixer_path, " usb-headphones", MIXER_PATH_MAX_LENGTH);
1186 else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)
1187 strlcat(mixer_path, " speaker-and-usb-headphones",
1188 MIXER_PATH_MAX_LENGTH);
1189 else if (snd_device == SND_DEVICE_IN_USB_HEADSET_MIC)
1190 strlcat(mixer_path, " usb-headset-mic", MIXER_PATH_MAX_LENGTH);
1191 else if (snd_device == SND_DEVICE_IN_CAPTURE_FM)
1192 strlcat(mixer_path, " capture-fm", MIXER_PATH_MAX_LENGTH);
1193 else if (snd_device == SND_DEVICE_OUT_TRANSMISSION_FM)
1194 strlcat(mixer_path, " transmission-fm", MIXER_PATH_MAX_LENGTH);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301195}
1196
1197int platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
1198{
1199 int device_id;
1200 if (device_type == PCM_PLAYBACK)
1201 device_id = pcm_device_table[usecase][0];
1202 else
1203 device_id = pcm_device_table[usecase][1];
1204 return device_id;
1205}
1206
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301207int platform_get_snd_device_index(char *snd_device_index_name)
1208{
1209 int ret = 0;
1210 int i;
1211
1212 if (snd_device_index_name == NULL) {
1213 ALOGE("%s: snd_device_index_name is NULL", __func__);
1214 ret = -ENODEV;
1215 goto done;
1216 }
1217
1218 for (i=0; i < SND_DEVICE_MAX; i++) {
1219 if(strcmp(snd_device_name_index[i].name, snd_device_index_name) == 0) {
1220 ret = snd_device_name_index[i].index;
1221 goto done;
1222 }
1223 }
1224 ALOGE("%s: Could not find index for snd_device_index_name = %s",
1225 __func__, snd_device_index_name);
1226 ret = -ENODEV;
1227done:
1228 return ret;
1229}
1230
Venkata Narendra Kumar Gutta88fd0bc2014-03-27 19:47:56 +05301231int platform_set_fluence_type(void *platform, char *value)
1232{
1233 int ret = 0;
1234 int fluence_type = FLUENCE_NONE;
1235 int fluence_flag = NONE_FLAG;
1236 struct platform_data *my_data = (struct platform_data *)platform;
1237 struct audio_device *adev = my_data->adev;
1238
1239 ALOGV("%s: fluence type:%d", __func__, my_data->fluence_type);
1240
1241 /* only dual mic turn on and off is supported as of now through setparameters */
1242 if (!strncmp(AUDIO_PARAMETER_VALUE_DUALMIC,value, sizeof(AUDIO_PARAMETER_VALUE_DUALMIC))) {
1243 if (!strncmp("fluencepro", my_data->fluence_cap, sizeof("fluencepro")) ||
1244 !strncmp("fluence", my_data->fluence_cap, sizeof("fluence"))) {
1245 ALOGV("fluence dualmic feature enabled \n");
1246 fluence_type = FLUENCE_DUAL_MIC;
1247 fluence_flag = DMIC_FLAG;
1248 } else {
1249 ALOGE("%s: Failed to set DUALMIC", __func__);
1250 ret = -1;
1251 goto done;
1252 }
1253 } else if (!strncmp(AUDIO_PARAMETER_KEY_NO_FLUENCE, value, sizeof(AUDIO_PARAMETER_KEY_NO_FLUENCE))) {
1254 ALOGV("fluence disabled");
1255 fluence_type = FLUENCE_NONE;
1256 } else {
1257 ALOGE("Invalid fluence value : %s",value);
1258 ret = -1;
1259 goto done;
1260 }
1261
1262 if (fluence_type != my_data->fluence_type) {
1263 ALOGV("%s: Updating fluence_type to :%d", __func__, fluence_type);
1264 my_data->fluence_type = fluence_type;
1265 adev->acdb_settings = (adev->acdb_settings & FLUENCE_MODE_CLEAR) | fluence_flag;
1266 }
1267done:
1268 return ret;
1269}
1270
1271int platform_get_fluence_type(void *platform, char *value, uint32_t len)
1272{
1273 int ret = 0;
1274 struct platform_data *my_data = (struct platform_data *)platform;
1275
1276 if (my_data->fluence_type == FLUENCE_QUAD_MIC) {
1277 strlcpy(value, "quadmic", len);
1278 } else if (my_data->fluence_type == FLUENCE_DUAL_MIC) {
1279 strlcpy(value, "dualmic", len);
1280 } else if (my_data->fluence_type == FLUENCE_NONE) {
1281 strlcpy(value, "none", len);
1282 } else
1283 ret = -1;
1284
1285 return ret;
1286}
1287
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301288int platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id)
1289{
1290 int ret = 0;
1291
1292 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
1293 ALOGE("%s: Invalid snd_device = %d",
1294 __func__, snd_device);
1295 ret = -EINVAL;
1296 goto done;
1297 }
1298
1299 acdb_device_table[snd_device] = acdb_id;
1300done:
1301 return ret;
1302}
1303
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07001304int platform_get_default_app_type(void *platform)
1305{
1306 struct platform_data *my_data = (struct platform_data *)platform;
1307
1308 if (my_data->acdb_get_default_app_type)
1309 return my_data->acdb_get_default_app_type();
1310 else
1311 return DEFAULT_APP_TYPE;
1312}
1313
Subhash Chandra Bose Naripeddy19dc03b2014-03-10 14:43:05 -07001314int platform_get_snd_device_acdb_id(snd_device_t snd_device)
1315{
1316 if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
1317 ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
1318 return -EINVAL;
1319 }
1320 return acdb_device_table[snd_device];
1321}
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07001322int platform_set_snd_device_bit_width(snd_device_t snd_device __unused,
1323 unsigned int bit_width __unused)
Amit Shekhar5a39c912014-10-14 15:39:30 -07001324{
1325 ALOGE("%s: Not implemented", __func__);
1326 return -ENOSYS;
1327}
1328
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07001329int platform_get_snd_device_bit_width(snd_device_t snd_device __unused)
Amit Shekhar5a39c912014-10-14 15:39:30 -07001330{
1331 ALOGE("%s: Not implemented", __func__);
1332 return -ENOSYS;
1333}
1334
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301335int platform_send_audio_calibration(void *platform, struct audio_usecase *usecase,
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07001336 int app_type, int sample_rate)
Naresh Tannirue3b18452014-03-04 14:44:27 +05301337{
1338 struct platform_data *my_data = (struct platform_data *)platform;
1339 int acdb_dev_id, acdb_dev_type;
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05301340 struct audio_device *adev = my_data->adev;
1341 int snd_device = SND_DEVICE_OUT_SPEAKER;
1342
1343 if (usecase->type == PCM_PLAYBACK) {
1344 snd_device = platform_get_output_snd_device(adev->platform,
1345 usecase->stream.out->devices);
1346 if(usecase->id != USECASE_AUDIO_PLAYBACK_OFFLOAD)
1347 app_type = APP_TYPE_SYSTEM_SOUNDS;
1348 } else if ((usecase->type == PCM_HFP_CALL) || (usecase->type == PCM_CAPTURE)) {
1349 snd_device = platform_get_input_snd_device(adev->platform,
1350 adev->primary_output->devices);
1351 app_type = APP_TYPE_GENERAL_RECORDING;
1352 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05301353
1354 acdb_dev_id = acdb_device_table[snd_device];
1355 if (acdb_dev_id < 0) {
1356 ALOGE("%s: Could not find acdb id for device(%d)",
1357 __func__, snd_device);
1358 return -EINVAL;
1359 }
1360 if (my_data->acdb_send_audio_cal) {
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07001361 ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
Naresh Tannirue3b18452014-03-04 14:44:27 +05301362 __func__, snd_device, acdb_dev_id);
1363 if (snd_device >= SND_DEVICE_OUT_BEGIN &&
1364 snd_device < SND_DEVICE_OUT_END)
1365 acdb_dev_type = ACDB_DEV_TYPE_OUT;
1366 else
1367 acdb_dev_type = ACDB_DEV_TYPE_IN;
Subhash Chandra Bose Naripeddy54274672014-03-10 14:51:02 -07001368 my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type, app_type,
1369 sample_rate);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301370 }
1371 return 0;
1372}
1373
1374int platform_switch_voice_call_device_pre(void *platform)
1375{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301376 struct platform_data *my_data = (struct platform_data *)platform;
1377 int ret = 0;
1378
1379 if (my_data->csd != NULL &&
Ravi Kumar Alamandabe149392014-10-20 17:07:43 -07001380 voice_is_in_call(my_data->adev)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301381 /* This must be called before disabling mixer controls on APQ side */
1382 ret = my_data->csd->disable_device();
1383 if (ret < 0) {
1384 ALOGE("%s: csd_client_disable_device, failed, error %d",
1385 __func__, ret);
1386 }
1387 }
1388 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301389}
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301390int platform_switch_voice_call_enable_device_config(void *platform,
1391 snd_device_t out_snd_device,
1392 snd_device_t in_snd_device)
1393{
1394 struct platform_data *my_data = (struct platform_data *)platform;
1395 int acdb_rx_id, acdb_tx_id;
1396 int ret = 0;
1397
1398 acdb_rx_id = acdb_device_table[out_snd_device];
1399 acdb_tx_id = acdb_device_table[in_snd_device];
1400
1401 if (my_data->csd != NULL) {
1402 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
1403 ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
1404 if (ret < 0) {
1405 ALOGE("%s: csd_enable_device_config, failed, error %d",
1406 __func__, ret);
1407 }
1408 } else {
1409 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
1410 acdb_rx_id, acdb_tx_id);
1411 }
1412 }
1413 return ret;
1414}
1415
Naresh Tannirue3b18452014-03-04 14:44:27 +05301416
1417int platform_switch_voice_call_device_post(void *platform,
1418 snd_device_t out_snd_device,
1419 snd_device_t in_snd_device)
1420{
1421 struct platform_data *my_data = (struct platform_data *)platform;
1422 int acdb_rx_id, acdb_tx_id;
1423
1424 if (my_data->acdb_send_voice_cal == NULL) {
1425 ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
1426 } else {
1427 acdb_rx_id = acdb_device_table[out_snd_device];
1428 acdb_tx_id = acdb_device_table[in_snd_device];
1429
1430 if (acdb_rx_id > 0 && acdb_tx_id > 0)
1431 my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
1432 else
1433 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
1434 acdb_rx_id, acdb_tx_id);
1435 }
1436
1437 return 0;
1438}
1439
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301440int platform_switch_voice_call_usecase_route_post(void *platform,
1441 snd_device_t out_snd_device,
1442 snd_device_t in_snd_device)
Naresh Tannirue3b18452014-03-04 14:44:27 +05301443{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301444 struct platform_data *my_data = (struct platform_data *)platform;
1445 int acdb_rx_id, acdb_tx_id;
1446 int ret = 0;
1447
1448 acdb_rx_id = acdb_device_table[out_snd_device];
1449 acdb_tx_id = acdb_device_table[in_snd_device];
1450
1451 if (my_data->csd != NULL) {
1452 if (acdb_rx_id > 0 && acdb_tx_id > 0) {
1453 ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
1454 my_data->adev->acdb_settings);
1455 if (ret < 0) {
1456 ALOGE("%s: csd_enable_device, failed, error %d",
1457 __func__, ret);
1458 }
1459 } else {
1460 ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
1461 acdb_rx_id, acdb_tx_id);
1462 }
1463 }
1464 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301465}
1466
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301467int platform_start_voice_call(void *platform, uint32_t vsid)
1468{
1469 struct platform_data *my_data = (struct platform_data *)platform;
1470 int ret = 0;
1471
1472 if (my_data->csd != NULL) {
1473 ret = my_data->csd->start_voice(vsid);
1474 if (ret < 0) {
1475 ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
1476 }
1477 }
1478 return ret;
1479}
1480
1481int platform_stop_voice_call(void *platform, uint32_t vsid)
1482{
1483 struct platform_data *my_data = (struct platform_data *)platform;
1484 int ret = 0;
1485
1486 if (my_data->csd != NULL) {
1487 ret = my_data->csd->stop_voice(vsid);
1488 if (ret < 0) {
1489 ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
1490 }
1491 }
1492 return ret;
1493}
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07001494
1495int platform_get_sample_rate(void *platform __unused, uint32_t *rate __unused)
Naresh Tannirue3b18452014-03-04 14:44:27 +05301496{
1497 return 0;
1498}
1499
1500int platform_set_voice_volume(void *platform, int volume)
1501{
1502 struct platform_data *my_data = (struct platform_data *)platform;
1503 struct audio_device *adev = my_data->adev;
1504 struct mixer_ctl *ctl;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301505 const char *mixer_ctl_name = "Voice Rx Gain";
1506 int vol_index = 0, ret = 0;
1507 uint32_t set_values[ ] = {0,
1508 ALL_SESSION_VSID,
1509 DEFAULT_VOLUME_RAMP_DURATION_MS};
Naresh Tannirue3b18452014-03-04 14:44:27 +05301510
1511 // Voice volume levels are mapped to adsp volume levels as follows.
1512 // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1 0 -> 0
1513 // But this values don't changed in kernel. So, below change is need.
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301514 vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, MAX_VOL_INDEX);
1515 set_values[0] = vol_index;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301516
1517 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1518 if (!ctl) {
1519 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1520 __func__, mixer_ctl_name);
1521 return -EINVAL;
1522 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301523 ALOGV("Setting voice volume index: %d", set_values[0]);
1524 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Naresh Tannirue3b18452014-03-04 14:44:27 +05301525
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301526 if (my_data->csd != NULL) {
1527 ret = my_data->csd->volume(ALL_SESSION_VSID, volume);
1528 if (ret < 0) {
1529 ALOGE("%s: csd_volume error %d", __func__, ret);
1530 }
1531 }
1532 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301533}
1534
1535int platform_set_mic_mute(void *platform, bool state)
1536{
1537 struct platform_data *my_data = (struct platform_data *)platform;
1538 struct audio_device *adev = my_data->adev;
1539 struct mixer_ctl *ctl;
1540 const char *mixer_ctl_name = "Voice Tx Mute";
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301541 int ret = 0;
1542 uint32_t set_values[ ] = {0,
1543 ALL_SESSION_VSID,
1544 DEFAULT_VOLUME_RAMP_DURATION_MS};
Naresh Tannirue3b18452014-03-04 14:44:27 +05301545
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301546 set_values[0] = state;
1547 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1548 if (!ctl) {
1549 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1550 __func__, mixer_ctl_name);
1551 return -EINVAL;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301552 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301553 ALOGV("Setting voice mute state: %d", state);
1554 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
Naresh Tannirue3b18452014-03-04 14:44:27 +05301555
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301556 if (my_data->csd != NULL) {
1557 ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state);
1558 if (ret < 0) {
1559 ALOGE("%s: csd_mic_mute error %d", __func__, ret);
1560 }
1561 }
1562 return ret;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301563}
1564
Shiv Maliyappanahallic6fd8ee2014-03-07 15:31:55 -08001565int platform_set_device_mute(void *platform, bool state, char *dir)
1566{
1567 struct platform_data *my_data = (struct platform_data *)platform;
1568 struct audio_device *adev = my_data->adev;
1569 struct mixer_ctl *ctl;
1570 char *mixer_ctl_name = NULL;
1571 int ret = 0;
1572 uint32_t set_values[ ] = {0,
1573 ALL_SESSION_VSID,
1574 0};
1575 if(dir == NULL) {
1576 ALOGE("%s: Invalid direction:%s", __func__, dir);
1577 return -EINVAL;
1578 }
1579
1580 if (!strncmp("rx", dir, sizeof("rx"))) {
1581 mixer_ctl_name = "Voice Rx Device Mute";
1582 } else if (!strncmp("tx", dir, sizeof("tx"))) {
1583 mixer_ctl_name = "Voice Tx Device Mute";
1584 } else {
1585 return -EINVAL;
1586 }
1587
1588 set_values[0] = state;
1589 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1590 if (!ctl) {
1591 ALOGE("%s: Could not get ctl for mixer cmd - %s",
1592 __func__, mixer_ctl_name);
1593 return -EINVAL;
1594 }
1595
1596 ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s",
1597 __func__,state, mixer_ctl_name);
1598 mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
1599
1600 return ret;
1601}
1602
Naresh Tannirue3b18452014-03-04 14:44:27 +05301603snd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices)
1604{
1605 struct platform_data *my_data = (struct platform_data *)platform;
1606 struct audio_device *adev = my_data->adev;
1607 audio_mode_t mode = adev->mode;
1608 snd_device_t snd_device = SND_DEVICE_NONE;
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05301609#ifdef RECORD_PLAY_CONCURRENCY
1610 bool use_voip_out_devices = false;
1611 bool prop_rec_play_enabled = false;
1612 char recConcPropValue[PROPERTY_VALUE_MAX];
1613
1614 if (property_get("rec.playback.conc.disabled", recConcPropValue, NULL)) {
1615 prop_rec_play_enabled = atoi(recConcPropValue) || !strncmp("true", recConcPropValue, 4);
1616 }
1617 use_voip_out_devices = prop_rec_play_enabled &&
1618 (my_data->rec_play_conc_set || adev->mode == AUDIO_MODE_IN_COMMUNICATION);
1619 ALOGV("platform_get_output_snd_device use_voip_out_devices : %d",use_voip_out_devices);
1620#endif
Naresh Tannirue3b18452014-03-04 14:44:27 +05301621
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301622 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
1623 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
1624 int channel_count = popcount(channel_mask);
1625
Naresh Tannirue3b18452014-03-04 14:44:27 +05301626 ALOGV("%s: enter: output devices(%#x)", __func__, devices);
1627 if (devices == AUDIO_DEVICE_NONE ||
1628 devices & AUDIO_DEVICE_BIT_IN) {
1629 ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
1630 goto exit;
1631 }
1632
Naresh Tannirue3b18452014-03-04 14:44:27 +05301633 if (popcount(devices) == 2) {
1634 if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
1635 AUDIO_DEVICE_OUT_SPEAKER)) {
1636 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
1637 } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
1638 AUDIO_DEVICE_OUT_SPEAKER)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301639 if (audio_extn_get_anc_enabled())
1640 snd_device = SND_DEVICE_OUT_SPEAKER_AND_ANC_HEADSET;
1641 else
1642 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301643 } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
1644 AUDIO_DEVICE_OUT_SPEAKER)) {
1645 snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301646 } else if (devices == (AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET |
1647 AUDIO_DEVICE_OUT_SPEAKER)) {
1648 snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301649 } else {
1650 ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
1651 goto exit;
1652 }
1653 if (snd_device != SND_DEVICE_NONE) {
1654 goto exit;
1655 }
1656 }
1657
1658 if (popcount(devices) != 1) {
1659 ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
1660 goto exit;
1661 }
1662
Ravi Kumar Alamandabe149392014-10-20 17:07:43 -07001663 if (voice_is_in_call(adev) || voice_extn_compress_voip_is_active(adev)) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301664 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
1665 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1666 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
1667 !voice_extn_compress_voip_is_active(adev)) {
1668 switch (adev->voice.tty_mode) {
1669 case TTY_MODE_FULL:
1670 snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
1671 break;
1672 case TTY_MODE_VCO:
1673 snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
1674 break;
1675 case TTY_MODE_HCO:
1676 snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
1677 break;
1678 default:
1679 ALOGE("%s: Invalid TTY mode (%#x)",
1680 __func__, adev->voice.tty_mode);
1681 }
1682 } else if (audio_extn_get_anc_enabled()) {
1683 if (audio_extn_should_use_fb_anc())
1684 snd_device = SND_DEVICE_OUT_VOICE_ANC_FB_HEADSET;
1685 else
1686 snd_device = SND_DEVICE_OUT_VOICE_ANC_HEADSET;
1687 } else {
1688 snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
1689 }
1690 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07001691 if (adev->bt_wb_speech_enabled)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301692 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
1693 else
1694 snd_device = SND_DEVICE_OUT_BT_SCO;
1695 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
1696 snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
1697 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
1698 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
1699 snd_device = SND_DEVICE_OUT_USB_HEADSET;
1700 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
1701 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
1702 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
1703 if (audio_extn_should_use_handset_anc(channel_count))
1704 snd_device = SND_DEVICE_OUT_ANC_HANDSET;
1705 else
1706 snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
1707 }
1708 if (snd_device != SND_DEVICE_NONE) {
1709 goto exit;
1710 }
1711 }
1712
Naresh Tannirue3b18452014-03-04 14:44:27 +05301713 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
1714 devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301715 if (devices & AUDIO_DEVICE_OUT_WIRED_HEADSET
1716 && audio_extn_get_anc_enabled()) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05301717#ifdef RECORD_PLAY_CONCURRENCY
1718 if (use_voip_out_devices) {
1719 // ANC should be disabled for voip concurrency
1720 snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES;
1721 } else
1722#endif
1723 {
1724 if (audio_extn_should_use_fb_anc())
1725 snd_device = SND_DEVICE_OUT_ANC_FB_HEADSET;
1726 else
1727 snd_device = SND_DEVICE_OUT_ANC_HEADSET;
1728 }
1729 } else {
1730#ifdef RECORD_PLAY_CONCURRENCY
1731 if (use_voip_out_devices)
1732 snd_device = SND_DEVICE_OUT_VOIP_HEADPHONES;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301733 else
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05301734#endif
1735 snd_device = SND_DEVICE_OUT_HEADPHONES;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301736 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05301737 } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05301738#ifdef RECORD_PLAY_CONCURRENCY
1739 if (use_voip_out_devices) {
1740 snd_device = SND_DEVICE_OUT_VOIP_SPEAKER;
1741 } else
1742#endif
1743 {
1744 if (adev->speaker_lr_swap)
1745 snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
1746 else
1747 snd_device = SND_DEVICE_OUT_SPEAKER;
1748 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05301749 } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
Mingming Yin514a8bc2014-07-29 15:22:21 -07001750 if (adev->bt_wb_speech_enabled)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301751 snd_device = SND_DEVICE_OUT_BT_SCO_WB;
1752 else
1753 snd_device = SND_DEVICE_OUT_BT_SCO;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301754 } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
1755 snd_device = SND_DEVICE_OUT_HDMI ;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301756 } else if (devices & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
1757 devices & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08001758 ALOGD("%s: setting USB hadset channel capability(2) for Proxy", __func__);
1759 audio_extn_set_afe_proxy_channel_mixer(adev, 2);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301760 snd_device = SND_DEVICE_OUT_USB_HEADSET;
1761 } else if (devices & AUDIO_DEVICE_OUT_FM_TX) {
1762 snd_device = SND_DEVICE_OUT_TRANSMISSION_FM;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301763 } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05301764#ifdef RECORD_PLAY_CONCURRENCY
1765 if (use_voip_out_devices)
1766 snd_device = SND_DEVICE_OUT_VOIP_HANDSET;
1767 else
1768#endif
1769 snd_device = SND_DEVICE_OUT_HANDSET;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301770 } else if (devices & AUDIO_DEVICE_OUT_PROXY) {
Mingming Yin5a7c5d62014-03-05 17:45:03 -08001771 channel_count = audio_extn_get_afe_proxy_channel_count();
1772 ALOGD("%s: setting sink capability(%d) for Proxy", __func__, channel_count);
1773 audio_extn_set_afe_proxy_channel_mixer(adev, channel_count);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301774 snd_device = SND_DEVICE_OUT_AFE_PROXY;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301775 } else {
1776 ALOGE("%s: Unknown device(s) %#x", __func__, devices);
1777 }
1778exit:
1779 ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
1780 return snd_device;
1781}
1782
1783snd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
1784{
1785 struct platform_data *my_data = (struct platform_data *)platform;
1786 struct audio_device *adev = my_data->adev;
1787 audio_source_t source = (adev->active_input == NULL) ?
1788 AUDIO_SOURCE_DEFAULT : adev->active_input->source;
1789
1790 audio_mode_t mode = adev->mode;
1791 audio_devices_t in_device = ((adev->active_input == NULL) ?
1792 AUDIO_DEVICE_NONE : adev->active_input->device)
1793 & ~AUDIO_DEVICE_BIT_IN;
1794 audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
1795 AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
1796 snd_device_t snd_device = SND_DEVICE_NONE;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301797 int channel_count = popcount(channel_mask);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301798
1799 ALOGV("%s: enter: out_device(%#x) in_device(%#x)",
1800 __func__, out_device, in_device);
Ravi Kumar Alamandabe149392014-10-20 17:07:43 -07001801 if ((out_device != AUDIO_DEVICE_NONE) && (voice_is_in_call(adev) ||
Satya Krishna Pindiproli2aaa6152014-05-21 15:05:22 +05301802 voice_extn_compress_voip_is_active(adev) || audio_extn_hfp_is_active(adev))) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301803 if ((adev->voice.tty_mode != TTY_MODE_OFF) &&
1804 !voice_extn_compress_voip_is_active(adev)) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301805 if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
1806 out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301807 switch (adev->voice.tty_mode) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301808 case TTY_MODE_FULL:
1809 snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
1810 break;
1811 case TTY_MODE_VCO:
1812 snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
1813 break;
1814 case TTY_MODE_HCO:
1815 snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
1816 break;
1817 default:
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301818 ALOGE("%s: Invalid TTY mode (%#x)",
1819 __func__, adev->voice.tty_mode);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301820 }
1821 goto exit;
1822 }
1823 }
1824 if (out_device & AUDIO_DEVICE_OUT_EARPIECE ||
1825 out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301826 if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
Sidipotu Ashok3bcca232014-11-07 14:41:58 +05301827 audio_extn_should_use_handset_anc(channel_count) &&
1828 my_data->fluence_type != FLUENCE_NONE) {
1829 snd_device = SND_DEVICE_IN_VOICE_FLUENCE_DMIC_AANC;
1830 adev->acdb_settings |= DMIC_FLAG;
1831 ALOGD("Selecting AANC, Fluence combo device");
1832 } else if (out_device & AUDIO_DEVICE_OUT_EARPIECE &&
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301833 audio_extn_should_use_handset_anc(channel_count)) {
1834 snd_device = SND_DEVICE_IN_AANC_HANDSET_MIC;
1835 } else if (my_data->fluence_type == FLUENCE_NONE ||
1836 my_data->fluence_in_voice_call == false) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301837 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301838 if (audio_extn_hfp_is_active(adev))
1839 platform_set_echo_reference(adev->platform, true);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301840 } else {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301841 snd_device = SND_DEVICE_IN_VOICE_DMIC;
1842 adev->acdb_settings |= DMIC_FLAG;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301843 }
1844 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1845 snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301846 if (audio_extn_hfp_is_active(adev))
1847 platform_set_echo_reference(adev->platform, true);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301848 } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07001849 if (adev->bt_wb_speech_enabled) {
1850 if (adev->bluetooth_nrec)
1851 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
1852 else
1853 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
1854 } else {
1855 if (adev->bluetooth_nrec)
1856 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
1857 else
1858 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
1859 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05301860 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301861 if (my_data->fluence_type != FLUENCE_NONE &&
1862 my_data->fluence_in_voice_call &&
1863 my_data->fluence_in_spkr_mode) {
1864 if(my_data->fluence_type & FLUENCE_QUAD_MIC) {
1865 adev->acdb_settings |= QMIC_FLAG;
1866 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_QMIC;
1867 } else {
1868 adev->acdb_settings |= DMIC_FLAG;
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05301869 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
1870 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC_BROADSIDE;
1871 else
1872 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301873 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05301874 } else {
1875 snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301876 if (audio_extn_hfp_is_active(adev))
1877 platform_set_echo_reference(adev->platform, true);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301878 }
1879 }
1880 } else if (source == AUDIO_SOURCE_CAMCORDER) {
1881 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
1882 in_device & AUDIO_DEVICE_IN_BACK_MIC) {
kunleiz18a33302014-05-30 09:52:25 +08001883 if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
1884 channel_count == 2)
kunleiz8f7e9e22014-06-24 15:12:02 +08001885 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
kunleiz18a33302014-05-30 09:52:25 +08001886 else
1887 snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301888 }
1889 } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
1890 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301891 if (channel_count == 2) {
1892 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
1893 adev->acdb_settings |= DMIC_FLAG;
1894 } else if (adev->active_input->enable_ns)
1895 snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
1896 else if (my_data->fluence_type != FLUENCE_NONE &&
1897 my_data->fluence_in_voice_rec) {
1898 snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
1899 adev->acdb_settings |= DMIC_FLAG;
1900 } else {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301901 snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
1902 }
1903 }
Karthik Reddy Kattaf621ec72014-11-21 16:37:38 +05301904 } else if ((source == AUDIO_SOURCE_VOICE_COMMUNICATION) ||
1905 (mode == AUDIO_MODE_IN_COMMUNICATION)) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301906 if (out_device & AUDIO_DEVICE_OUT_SPEAKER)
1907 in_device = AUDIO_DEVICE_IN_BACK_MIC;
1908 if (adev->active_input) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301909 if (adev->active_input->enable_aec &&
1910 adev->active_input->enable_ns) {
Naresh Tannirue3b18452014-03-04 14:44:27 +05301911 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301912 if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
1913 my_data->fluence_in_spkr_mode) {
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05301914 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
1915 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS_BROADSIDE;
1916 else
1917 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301918 adev->acdb_settings |= DMIC_FLAG;
1919 } else
1920 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301921 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301922 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1923 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
1924 adev->acdb_settings |= DMIC_FLAG;
1925 } else
1926 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301927 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301928 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301929 }
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301930 platform_set_echo_reference(adev->platform, true);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301931 } else if (adev->active_input->enable_aec) {
1932 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05301933 if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
1934 my_data->fluence_in_spkr_mode) {
1935 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
1936 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_BROADSIDE;
1937 else
1938 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301939 adev->acdb_settings |= DMIC_FLAG;
1940 } else
1941 snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
1942 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1943 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1944 snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
1945 adev->acdb_settings |= DMIC_FLAG;
1946 } else
1947 snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
1948 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1949 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
1950 }
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301951 platform_set_echo_reference(adev->platform, true);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301952 } else if (adev->active_input->enable_ns) {
1953 if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
Karthik Reddy Kattad9fff862014-07-21 21:07:21 +05301954 if (my_data->fluence_type & FLUENCE_DUAL_MIC &&
1955 my_data->fluence_in_spkr_mode) {
1956 if (my_data->fluence_mode == FLUENCE_BROADSIDE)
1957 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS_BROADSIDE;
1958 else
1959 snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301960 adev->acdb_settings |= DMIC_FLAG;
1961 } else
1962 snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
1963 } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
1964 if (my_data->fluence_type & FLUENCE_DUAL_MIC) {
1965 snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
1966 adev->acdb_settings |= DMIC_FLAG;
1967 } else
1968 snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
1969 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
1970 snd_device = SND_DEVICE_IN_HEADSET_MIC_FLUENCE;
1971 }
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301972 platform_set_echo_reference(adev->platform,false);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301973 } else
Venkata Narendra Kumar Gutta1bbbf542014-09-04 19:11:25 +05301974 platform_set_echo_reference(adev->platform, false);
Naresh Tannirue3b18452014-03-04 14:44:27 +05301975 }
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301976 } else if (source == AUDIO_SOURCE_MIC) {
1977 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC &&
1978 channel_count == 1 ) {
1979 if(my_data->fluence_type & FLUENCE_DUAL_MIC &&
1980 my_data->fluence_in_audio_rec)
1981 snd_device = SND_DEVICE_IN_HANDSET_DMIC;
1982 }
1983 } else if (source == AUDIO_SOURCE_FM_RX ||
1984 source == AUDIO_SOURCE_FM_RX_A2DP) {
1985 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Naresh Tannirue3b18452014-03-04 14:44:27 +05301986 } else if (source == AUDIO_SOURCE_DEFAULT) {
1987 goto exit;
1988 }
1989
1990
1991 if (snd_device != SND_DEVICE_NONE) {
1992 goto exit;
1993 }
1994
1995 if (in_device != AUDIO_DEVICE_NONE &&
1996 !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
1997 !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
1998 if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05301999 if (audio_extn_ssr_get_enabled() && channel_count == 6)
2000 snd_device = SND_DEVICE_IN_QUAD_MIC;
2001 else if (channel_count == 2)
2002 snd_device = SND_DEVICE_IN_HANDSET_STEREO_DMIC;
2003 else
2004 snd_device = SND_DEVICE_IN_HANDSET_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302005 } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
2006 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2007 } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2008 snd_device = SND_DEVICE_IN_HEADSET_MIC;
2009 } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07002010 if (adev->bt_wb_speech_enabled) {
2011 if (adev->bluetooth_nrec)
2012 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2013 else
2014 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
2015 } else {
2016 if (adev->bluetooth_nrec)
2017 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2018 else
2019 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
2020 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302021 } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
2022 snd_device = SND_DEVICE_IN_HDMI_MIC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302023 } else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
2024 in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
2025 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
2026 } else if (in_device & AUDIO_DEVICE_IN_FM_RX) {
2027 snd_device = SND_DEVICE_IN_CAPTURE_FM;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302028 } else {
2029 ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
2030 ALOGW("%s: Using default handset-mic", __func__);
2031 snd_device = SND_DEVICE_IN_HANDSET_MIC;
2032 }
2033 } else {
2034 if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
2035 snd_device = SND_DEVICE_IN_HANDSET_MIC;
2036 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
2037 snd_device = SND_DEVICE_IN_HEADSET_MIC;
2038 } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER) {
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302039 if (channel_count > 1)
2040 snd_device = SND_DEVICE_IN_SPEAKER_STEREO_DMIC;
2041 else
2042 snd_device = SND_DEVICE_IN_SPEAKER_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302043 } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE) {
2044 snd_device = SND_DEVICE_IN_HANDSET_MIC;
2045 } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
Vicky Sehrawate240e5d2014-08-12 17:17:04 -07002046 if (adev->bt_wb_speech_enabled) {
2047 if (adev->bluetooth_nrec)
2048 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2049 else
2050 snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
2051 } else {
2052 if (adev->bluetooth_nrec)
2053 snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2054 else
2055 snd_device = SND_DEVICE_IN_BT_SCO_MIC;
2056 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302057 } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2058 snd_device = SND_DEVICE_IN_HDMI_MIC;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302059 } else if (out_device & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET ||
2060 out_device & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
2061 snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302062 } else {
2063 ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
2064 ALOGW("%s: Using default handset-mic", __func__);
2065 snd_device = SND_DEVICE_IN_HANDSET_MIC;
2066 }
2067 }
2068exit:
2069 ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
2070 return snd_device;
2071}
2072
2073int platform_set_hdmi_channels(void *platform, int channel_count)
2074{
2075 struct platform_data *my_data = (struct platform_data *)platform;
2076 struct audio_device *adev = my_data->adev;
2077 struct mixer_ctl *ctl;
2078 const char *channel_cnt_str = NULL;
2079 const char *mixer_ctl_name = "HDMI_RX Channels";
2080 switch (channel_count) {
2081 case 8:
2082 channel_cnt_str = "Eight"; break;
2083 case 7:
2084 channel_cnt_str = "Seven"; break;
2085 case 6:
2086 channel_cnt_str = "Six"; break;
2087 case 5:
2088 channel_cnt_str = "Five"; break;
2089 case 4:
2090 channel_cnt_str = "Four"; break;
2091 case 3:
2092 channel_cnt_str = "Three"; break;
2093 default:
2094 channel_cnt_str = "Two"; break;
2095 }
2096 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2097 if (!ctl) {
2098 ALOGE("%s: Could not get ctl for mixer cmd - %s",
2099 __func__, mixer_ctl_name);
2100 return -EINVAL;
2101 }
2102 ALOGV("HDMI channel count: %s", channel_cnt_str);
2103 mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
2104 return 0;
2105}
2106
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302107int platform_edid_get_max_channels(void *platform)
Naresh Tannirue3b18452014-03-04 14:44:27 +05302108{
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302109 struct platform_data *my_data = (struct platform_data *)platform;
2110 struct audio_device *adev = my_data->adev;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302111 char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
2112 char *sad = block;
2113 int num_audio_blocks;
2114 int channel_count;
2115 int max_channels = 0;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302116 int i, ret, count;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302117
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302118 struct mixer_ctl *ctl;
2119
2120 ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL);
2121 if (!ctl) {
2122 ALOGE("%s: Could not get ctl for mixer cmd - %s",
2123 __func__, AUDIO_DATA_BLOCK_MIXER_CTL);
Naresh Tannirue3b18452014-03-04 14:44:27 +05302124 return 0;
2125 }
2126
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302127 mixer_ctl_update(ctl);
2128
2129 count = mixer_ctl_get_num_values(ctl);
Naresh Tannirue3b18452014-03-04 14:44:27 +05302130
2131 /* Read SAD blocks, clamping the maximum size for safety */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302132 if (count > (int)sizeof(block))
2133 count = (int)sizeof(block);
Naresh Tannirue3b18452014-03-04 14:44:27 +05302134
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302135 ret = mixer_ctl_get_array(ctl, block, count);
2136 if (ret != 0) {
2137 ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
2138 return 0;
2139 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302140
2141 /* Calculate the number of SAD blocks */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302142 num_audio_blocks = count / SAD_BLOCK_SIZE;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302143
2144 for (i = 0; i < num_audio_blocks; i++) {
2145 /* Only consider LPCM blocks */
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302146 if ((sad[0] >> 3) != EDID_FORMAT_LPCM) {
2147 sad += 3;
Naresh Tannirue3b18452014-03-04 14:44:27 +05302148 continue;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302149 }
Naresh Tannirue3b18452014-03-04 14:44:27 +05302150
2151 channel_count = (sad[0] & 0x7) + 1;
2152 if (channel_count > max_channels)
2153 max_channels = channel_count;
2154
2155 /* Advance to next block */
2156 sad += 3;
2157 }
2158
2159 return max_channels;
2160}
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302161
2162static int platform_set_slowtalk(struct platform_data *my_data, bool state)
2163{
2164 int ret = 0;
2165 struct audio_device *adev = my_data->adev;
2166 struct mixer_ctl *ctl;
2167 const char *mixer_ctl_name = "Slowtalk Enable";
2168 uint32_t set_values[ ] = {0,
2169 ALL_SESSION_VSID};
2170
2171 set_values[0] = state;
2172 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2173 if (!ctl) {
2174 ALOGE("%s: Could not get ctl for mixer cmd - %s",
2175 __func__, mixer_ctl_name);
2176 ret = -EINVAL;
2177 } else {
2178 ALOGV("Setting slowtalk state: %d", state);
2179 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
2180 my_data->slowtalk = state;
2181 }
2182
2183 if (my_data->csd != NULL) {
2184 ret = my_data->csd->slow_talk(ALL_SESSION_VSID, state);
2185 if (ret < 0) {
2186 ALOGE("%s: csd_client_disable_device, failed, error %d",
2187 __func__, ret);
2188 }
2189 }
2190 return ret;
2191}
2192
Avinash Vaishd5fa4572014-09-15 14:41:14 +05302193static int set_hd_voice(struct platform_data *my_data, bool state)
2194{
2195 struct audio_device *adev = my_data->adev;
2196 struct mixer_ctl *ctl;
2197 const char *mixer_ctl_name = "HD Voice Enable";
2198 int ret = 0;
2199 uint32_t set_values[ ] = {0,
2200 ALL_SESSION_VSID};
2201
2202 set_values[0] = state;
2203 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2204 if (!ctl) {
2205 ALOGE("%s: Could not get ctl for mixer cmd - %s",
2206 __func__, mixer_ctl_name);
2207 ret = -EINVAL;
2208 } else {
2209 ALOGV("Setting HD Voice state: %d", state);
2210 ret = mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
2211 my_data->hd_voice = state;
2212 }
2213
2214 return ret;
2215}
2216
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302217int platform_set_parameters(void *platform, struct str_parms *parms)
2218{
2219 struct platform_data *my_data = (struct platform_data *)platform;
2220 char *str;
2221 char value[256] = {0};
2222 int val;
2223 int ret = 0, err;
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05302224 char *kv_pairs = NULL;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302225
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05302226 kv_pairs = str_parms_to_str(parms);
2227 ALOGV("%s: enter: - %s", __func__, kv_pairs);
2228 free(kv_pairs);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302229
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302230 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_SLOWTALK, value, sizeof(value));
2231 if (err >= 0) {
2232 bool state = false;
2233 if (!strncmp("true", value, sizeof("true"))) {
2234 state = true;
2235 }
2236
2237 str_parms_del(parms, AUDIO_PARAMETER_KEY_SLOWTALK);
2238 ret = platform_set_slowtalk(my_data, state);
2239 if (ret)
2240 ALOGE("%s: Failed to set slow talk err: %d", __func__, ret);
2241 }
2242
Avinash Vaishd5fa4572014-09-15 14:41:14 +05302243 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_HD_VOICE, value, sizeof(value));
2244 if (err >= 0) {
2245 bool state = false;
2246 if (!strncmp("true", value, sizeof("true"))) {
2247 state = true;
2248 }
2249
2250 str_parms_del(parms, AUDIO_PARAMETER_KEY_HD_VOICE);
2251 if (my_data->hd_voice != state) {
2252 ret = set_hd_voice(my_data, state);
2253 if (ret)
2254 ALOGE("%s: Failed to set HD voice err: %d", __func__, ret);
2255 } else {
2256 ALOGV("%s: HD Voice already set to %d", __func__, state);
2257 }
2258 }
2259
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302260 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
2261 value, sizeof(value));
2262 if (err >= 0) {
2263 str_parms_del(parms, AUDIO_PARAMETER_KEY_VOLUME_BOOST);
2264
2265 if (my_data->acdb_reload_vocvoltable == NULL) {
2266 ALOGE("%s: acdb_reload_vocvoltable is NULL", __func__);
2267 } else if (!strcmp(value, "on")) {
2268 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_VOLUME_BOOST)) {
2269 my_data->voice_feature_set = 1;
2270 }
2271 } else {
2272 if (!my_data->acdb_reload_vocvoltable(VOICE_FEATURE_SET_DEFAULT)) {
2273 my_data->voice_feature_set = 0;
2274 }
2275 }
2276 }
2277
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05302278#ifdef RECORD_PLAY_CONCURRENCY
2279 err = str_parms_get_str(parms, AUDIO_PARAMETER_KEY_REC_PLAY_CONC, value, sizeof(value));
2280 if (err >= 0) {
2281 if (!strncmp("true", value, sizeof("true"))) {
2282 ALOGD("setting record playback concurrency to true");
2283 my_data->rec_play_conc_set = true;
2284 } else {
2285 ALOGD("setting record playback concurrency to false");
2286 my_data->rec_play_conc_set = false;
2287 }
Naresh Tanniruc0517bc2014-10-26 15:30:55 +05302288 }
2289#endif
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302290 ALOGV("%s: exit with code(%d)", __func__, ret);
2291 return ret;
2292}
2293
2294int platform_set_incall_recording_session_id(void *platform,
2295 uint32_t session_id, int rec_mode)
2296{
2297 int ret = 0;
2298 struct platform_data *my_data = (struct platform_data *)platform;
2299 struct audio_device *adev = my_data->adev;
2300 struct mixer_ctl *ctl;
2301 const char *mixer_ctl_name = "Voc VSID";
2302 int num_ctl_values;
2303 int i;
2304
2305 ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2306 if (!ctl) {
2307 ALOGE("%s: Could not get ctl for mixer cmd - %s",
2308 __func__, mixer_ctl_name);
2309 ret = -EINVAL;
2310 } else {
2311 num_ctl_values = mixer_ctl_get_num_values(ctl);
2312 for (i = 0; i < num_ctl_values; i++) {
2313 if (mixer_ctl_set_value(ctl, i, session_id)) {
2314 ALOGV("Error: invalid session_id: %x", session_id);
2315 ret = -EINVAL;
2316 break;
2317 }
2318 }
2319 }
2320
2321 if (my_data->csd != NULL) {
2322 ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
2323 if (ret < 0) {
2324 ALOGE("%s: csd_client_start_record failed, error %d",
2325 __func__, ret);
2326 }
2327 }
2328
2329 return ret;
2330}
2331
2332int platform_stop_incall_recording_usecase(void *platform)
2333{
2334 int ret = 0;
2335 struct platform_data *my_data = (struct platform_data *)platform;
2336
2337 if (my_data->csd != NULL) {
2338 ret = my_data->csd->stop_record(ALL_SESSION_VSID);
2339 if (ret < 0) {
2340 ALOGE("%s: csd_client_stop_record failed, error %d",
2341 __func__, ret);
2342 }
2343 }
2344
2345 return ret;
2346}
2347
2348int platform_start_incall_music_usecase(void *platform)
2349{
2350 int ret = 0;
2351 struct platform_data *my_data = (struct platform_data *)platform;
2352
2353 if (my_data->csd != NULL) {
2354 ret = my_data->csd->start_playback(ALL_SESSION_VSID);
2355 if (ret < 0) {
2356 ALOGE("%s: csd_client_start_playback failed, error %d",
2357 __func__, ret);
2358 }
2359 }
2360
2361 return ret;
2362}
2363
2364int platform_stop_incall_music_usecase(void *platform)
2365{
2366 int ret = 0;
2367 struct platform_data *my_data = (struct platform_data *)platform;
2368
2369 if (my_data->csd != NULL) {
2370 ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
2371 if (ret < 0) {
2372 ALOGE("%s: csd_client_stop_playback failed, error %d",
2373 __func__, ret);
2374 }
2375 }
2376
2377 return ret;
2378}
2379
Vidyakumar Athota21b3bb92014-04-25 11:08:08 -07002380int platform_update_lch(void *platform, struct voice_session *session,
2381 enum voice_lch_mode lch_mode)
2382{
2383 int ret = 0;
2384 struct platform_data *my_data = (struct platform_data *)platform;
2385
2386 if ((my_data->csd != NULL) && (my_data->csd->set_lch != NULL))
2387 ret = my_data->csd->set_lch(session->vsid, lch_mode);
2388 else
2389 ret = pcm_ioctl(session->pcm_tx, SNDRV_VOICE_IOCTL_LCH, &lch_mode);
2390
2391 return ret;
2392}
2393
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302394void platform_get_parameters(void *platform,
2395 struct str_parms *query,
2396 struct str_parms *reply)
2397{
2398 struct platform_data *my_data = (struct platform_data *)platform;
2399 char *str = NULL;
2400 char value[256] = {0};
2401 int ret;
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05302402 char *kv_pairs = NULL;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302403
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302404 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_SLOWTALK,
2405 value, sizeof(value));
2406 if (ret >= 0) {
2407 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_SLOWTALK,
2408 my_data->slowtalk?"true":"false");
2409 }
2410
Avinash Vaishd5fa4572014-09-15 14:41:14 +05302411 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_HD_VOICE,
2412 value, sizeof(value));
2413 if (ret >= 0) {
2414 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_HD_VOICE,
2415 my_data->hd_voice?"true":"false");
2416 }
2417
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302418 ret = str_parms_get_str(query, AUDIO_PARAMETER_KEY_VOLUME_BOOST,
2419 value, sizeof(value));
2420 if (ret >= 0) {
2421 if (my_data->voice_feature_set == VOICE_FEATURE_SET_VOLUME_BOOST) {
2422 strlcpy(value, "on", sizeof(value));
2423 } else {
2424 strlcpy(value, "off", sizeof(value));
2425 }
2426
2427 str_parms_add_str(reply, AUDIO_PARAMETER_KEY_VOLUME_BOOST, value);
2428 }
2429
Karthik Reddy Kattabfe193d2014-08-14 17:58:18 +05302430 kv_pairs = str_parms_to_str(reply);
2431 ALOGV("%s: exit: returns - %s", __func__, kv_pairs);
2432 free(kv_pairs);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302433}
2434
2435/* Delay in Us */
2436int64_t platform_render_latency(audio_usecase_t usecase)
2437{
2438 switch (usecase) {
2439 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
2440 return DEEP_BUFFER_PLATFORM_DELAY;
2441 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
2442 return LOW_LATENCY_PLATFORM_DELAY;
2443 default:
2444 return 0;
2445 }
2446}
2447
2448int platform_update_usecase_from_source(int source, int usecase)
2449{
2450 ALOGV("%s: input source :%d", __func__, source);
2451 if(source == AUDIO_SOURCE_FM_RX_A2DP)
2452 usecase = USECASE_AUDIO_RECORD_FM_VIRTUAL;
2453 return usecase;
2454}
2455
Dhananjay Kumar45b71742014-05-29 21:47:27 +05302456bool platform_listen_device_needs_event(snd_device_t snd_device)
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302457{
Dhananjay Kumar45b71742014-05-29 21:47:27 +05302458 bool needs_event = false;
2459
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302460 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
2461 (snd_device < SND_DEVICE_IN_END) &&
2462 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
2463 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
Dhananjay Kumar45b71742014-05-29 21:47:27 +05302464 needs_event = true;
2465
2466 return needs_event;
2467}
2468
2469bool platform_listen_usecase_needs_event(audio_usecase_t uc_id)
2470{
2471 bool needs_event = false;
2472
2473 switch(uc_id){
2474 /* concurrent playback usecases needs event */
2475 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
2476 case USECASE_AUDIO_PLAYBACK_MULTI_CH:
2477 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
2478 needs_event = true;
2479 break;
2480 /* concurrent playback in low latency allowed */
2481 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
2482 break;
2483 /* concurrent playback FM needs event */
2484 case USECASE_AUDIO_PLAYBACK_FM:
2485 needs_event = true;
2486 break;
2487
2488 /* concurrent capture usecases, no event, capture handled by device
2489 * USECASE_AUDIO_RECORD:
2490 * USECASE_AUDIO_RECORD_COMPRESS:
2491 * USECASE_AUDIO_RECORD_LOW_LATENCY:
2492
2493 * USECASE_VOICE_CALL:
2494 * USECASE_VOICE2_CALL:
2495 * USECASE_VOLTE_CALL:
2496 * USECASE_QCHAT_CALL:
2497 * USECASE_VOWLAN_CALL:
2498 * USECASE_COMPRESS_VOIP_CALL:
2499 * USECASE_AUDIO_RECORD_FM_VIRTUAL:
2500 * USECASE_INCALL_REC_UPLINK:
2501 * USECASE_INCALL_REC_DOWNLINK:
2502 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK:
2503 * USECASE_INCALL_REC_UPLINK_COMPRESS:
2504 * USECASE_INCALL_REC_DOWNLINK_COMPRESS:
2505 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS:
2506 * USECASE_INCALL_MUSIC_UPLINK:
2507 * USECASE_INCALL_MUSIC_UPLINK2:
2508 * USECASE_AUDIO_SPKR_CALIB_RX:
2509 * USECASE_AUDIO_SPKR_CALIB_TX:
2510 */
2511 default:
2512 ALOGV("%s:usecase_id[%d} no need to raise event.", __func__, uc_id);
2513 }
2514 return needs_event;
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302515}
2516
Ravi Kumar Alamanda8fa6b192014-09-09 16:06:42 -07002517bool platform_sound_trigger_device_needs_event(snd_device_t snd_device)
2518{
2519 bool needs_event = false;
2520
2521 if ((snd_device >= SND_DEVICE_IN_BEGIN) &&
2522 (snd_device < SND_DEVICE_IN_END) &&
2523 (snd_device != SND_DEVICE_IN_CAPTURE_FM) &&
2524 (snd_device != SND_DEVICE_IN_CAPTURE_VI_FEEDBACK))
2525 needs_event = true;
2526
2527 return needs_event;
2528}
2529
2530bool platform_sound_trigger_usecase_needs_event(audio_usecase_t uc_id)
2531{
2532 bool needs_event = false;
2533
2534 switch(uc_id){
2535 /* concurrent playback usecases needs event */
2536 case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
2537 case USECASE_AUDIO_PLAYBACK_MULTI_CH:
2538 case USECASE_AUDIO_PLAYBACK_OFFLOAD:
2539 needs_event = true;
2540 break;
2541 /* concurrent playback in low latency allowed */
2542 case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
2543 break;
2544 /* concurrent playback FM needs event */
2545 case USECASE_AUDIO_PLAYBACK_FM:
2546 needs_event = true;
2547 break;
2548
2549 /* concurrent capture usecases, no event, capture handled by device
2550 * USECASE_AUDIO_RECORD:
2551 * USECASE_AUDIO_RECORD_COMPRESS:
2552 * USECASE_AUDIO_RECORD_LOW_LATENCY:
2553
2554 * USECASE_VOICE_CALL:
2555 * USECASE_VOICE2_CALL:
2556 * USECASE_VOLTE_CALL:
2557 * USECASE_QCHAT_CALL:
2558 * USECASE_VOWLAN_CALL:
2559 * USECASE_COMPRESS_VOIP_CALL:
2560 * USECASE_AUDIO_RECORD_FM_VIRTUAL:
2561 * USECASE_INCALL_REC_UPLINK:
2562 * USECASE_INCALL_REC_DOWNLINK:
2563 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK:
2564 * USECASE_INCALL_REC_UPLINK_COMPRESS:
2565 * USECASE_INCALL_REC_DOWNLINK_COMPRESS:
2566 * USECASE_INCALL_REC_UPLINK_AND_DOWNLINK_COMPRESS:
2567 * USECASE_INCALL_MUSIC_UPLINK:
2568 * USECASE_INCALL_MUSIC_UPLINK2:
2569 * USECASE_AUDIO_SPKR_CALIB_RX:
2570 * USECASE_AUDIO_SPKR_CALIB_TX:
2571 */
2572 default:
2573 ALOGV("%s:usecase_id[%d] no need to raise event.", __func__, uc_id);
2574 }
2575 return needs_event;
2576}
2577
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302578/* Read offload buffer size from a property.
2579 * If value is not power of 2 round it to
2580 * power of 2.
2581 */
2582uint32_t platform_get_compress_offload_buffer_size(audio_offload_info_t* info)
2583{
2584 char value[PROPERTY_VALUE_MAX] = {0};
2585 uint32_t fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE;
2586 if((property_get("audio.offload.buffer.size.kb", value, "")) &&
2587 atoi(value)) {
2588 fragment_size = atoi(value) * 1024;
2589 }
2590
2591 if (info != NULL && info->has_video && info->is_streaming) {
2592 fragment_size = COMPRESS_OFFLOAD_FRAGMENT_SIZE_FOR_AV_STREAMING;
2593 ALOGV("%s: offload fragment size reduced for AV streaming to %d",
Apoorv Raghuvanshi44bd9172014-05-28 14:50:07 -07002594 __func__, fragment_size);
Naresh Tannirudb72d1e2014-03-05 17:33:47 +05302595 }
2596
2597 fragment_size = ALIGN( fragment_size, 1024);
2598
2599 if(fragment_size < MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
2600 fragment_size = MIN_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
2601 else if(fragment_size > MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE)
2602 fragment_size = MAX_COMPRESS_OFFLOAD_FRAGMENT_SIZE;
2603 ALOGV("%s: fragment_size %d", __func__, fragment_size);
2604 return fragment_size;
2605}
2606
2607uint32_t platform_get_pcm_offload_buffer_size(audio_offload_info_t* info)
2608{
2609 uint32_t fragment_size = MIN_PCM_OFFLOAD_FRAGMENT_SIZE;
2610 uint32_t bits_per_sample = 16;
2611
2612 if (info->format == AUDIO_FORMAT_PCM_24_BIT_OFFLOAD) {
2613 bits_per_sample = 32;
2614 }
2615
2616 if (!info->has_video) {
2617 fragment_size = MAX_PCM_OFFLOAD_FRAGMENT_SIZE;
2618
2619 } else if (info->has_video && info->is_streaming) {
2620 fragment_size = (PCM_OFFLOAD_BUFFER_DURATION_FOR_AV_STREAMING
2621 * info->sample_rate
2622 * bits_per_sample
2623 * popcount(info->channel_mask))/1000;
2624
2625 } else if (info->has_video) {
2626 fragment_size = (PCM_OFFLOAD_BUFFER_DURATION_FOR_AV
2627 * info->sample_rate
2628 * bits_per_sample
2629 * popcount(info->channel_mask))/1000;
2630 }
2631
2632 fragment_size = ALIGN( fragment_size, 1024);
2633
2634 if(fragment_size < MIN_PCM_OFFLOAD_FRAGMENT_SIZE)
2635 fragment_size = MIN_PCM_OFFLOAD_FRAGMENT_SIZE;
2636 else if(fragment_size > MAX_PCM_OFFLOAD_FRAGMENT_SIZE)
2637 fragment_size = MAX_PCM_OFFLOAD_FRAGMENT_SIZE;
2638
2639 ALOGV("%s: fragment_size %d", __func__, fragment_size);
2640 return fragment_size;
2641}
2642
Pradnya Chaphekar8a9dcd82014-09-09 09:49:10 -07002643void platform_get_device_to_be_id_map(int **device_to_be_id, int *length)
2644{
2645 *device_to_be_id = msm_device_to_be_id;
2646 *length = msm_be_id_array_len;
2647}
2648
2649bool platform_check_24_bit_support() {
2650 return false;
2651}
2652
Ravi Kumar Alamandabdf14162014-09-05 16:14:17 -07002653bool platform_check_and_set_codec_backend_cfg(struct audio_device* adev __unused,
2654 struct audio_usecase *usecase __unused)
2655{
Mingming Yin3ee55c62014-08-04 14:23:35 -07002656 return false;
2657}
Haynes Mathew Georgef4da6fe2014-06-20 19:14:25 -07002658
2659int platform_get_usecase_index(const char * usecase __unused)
2660{
2661 return -ENOSYS;
2662}
2663
2664int platform_set_usecase_pcm_id(audio_usecase_t usecase __unused, int32_t type __unused,
2665 int32_t pcm_id __unused)
2666{
2667 return -ENOSYS;
2668}
2669
2670int platform_set_snd_device_backend(snd_device_t snd_device __unused,
2671 const char * backend __unused)
2672{
2673 return -ENOSYS;
2674}
Pradnya Chaphekar4403bd72014-09-09 09:50:01 -07002675int platform_get_edid_info(void *platform __unused)
2676{
2677 return -ENOSYS;
2678}
2679
2680int platform_set_channel_map(void *platform __unused, int ch_count __unused,
2681 char *ch_map __unused, int snd_id __unused)
2682{
2683 return -ENOSYS;
2684}
2685
2686int platform_set_stream_channel_map(void *platform __unused,
2687 audio_channel_mask_t channel_mask __unused,
2688 int snd_id __unused)
2689{
2690 return -ENOSYS;
2691}
2692
2693int platform_set_edid_channels_configuration(void *platform __unused,
2694 int channels __unused)
2695{
2696 return 0;
2697}
2698
2699void platform_cache_edid(void * platform __unused)
2700{
2701}
2702
2703void platform_invalidate_edid(void * platform __unused)
2704{
2705}
Preetam Singh Ranawat2d0e4632015-02-02 12:40:59 +05302706int platform_get_subsys_image_name(char *buf)
2707{
2708 strlcpy(buf, PLATFORM_IMAGE_NAME, sizeof(PLATFORM_IMAGE_NAME));
2709 return 0;
2710}