1b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*
2a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta * Copyright (C) 2013-2016 The Android Open Source Project
3b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
4b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
5b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * you may not use this file except in compliance with the License.
6b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * You may obtain a copy of the License at
7b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
8b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
9b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
10b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Unless required by applicable law or agreed to in writing, software
11b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
12b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * See the License for the specific language governing permissions and
14b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * limitations under the License.
15b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent */
16b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LOG_TAG "msm8974_platform"
17b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*#define LOG_NDEBUG 0*/
18b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LOG_NDDEBUG 0
19b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
20b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <stdlib.h>
21b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <dlfcn.h>
22b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/log.h>
239f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda#include <cutils/str_parms.h>
24b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <cutils/properties.h>
25b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <audio_hw.h>
26b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include <platform_api.h>
27b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#include "platform.h"
2863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda#include "audio_extn.h"
291a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta#include <linux/msm_audio.h>
30b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
3160ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define MIXER_XML_DEFAULT_PATH "/system/etc/mixer_paths.xml"
3260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define MIXER_XML_BASE_STRING "/system/etc/mixer_paths"
3360ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define TOMTOM_8226_SND_CARD_NAME "msm8226-tomtom-snd-card"
3460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta#define TOMTOM_MIXER_FILE_SUFFIX "wcd9330"
3560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta
36b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define LIB_ACDB_LOADER "libacdbloader.so"
3747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George#define AUDIO_DATA_BLOCK_MIXER_CTL "HDMI EDID"
385c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#define CVD_VERSION_MIXER_CTL "CVD Version"
39b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
40f9583c366559860ec5f287816908216c50cb917eEric Laurent#define min(a, b) ((a) < (b) ? (a) : (b))
41b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
42b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*
43b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * This file will have a maximum of 38 bytes:
44b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent *
45b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4 bytes: number of audio blocks
46b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * 4 bytes: total length of Short Audio Descriptor (SAD) blocks
47b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent * Maximum 10 * 3 bytes: SAD blocks
48b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent */
49b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define MAX_SAD_BLOCKS      10
50b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define SAD_BLOCK_SIZE      3
51b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
525c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#define MAX_CVD_VERSION_STRING_SIZE    100
535c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
54b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* EDID format ID for LPCM audio */
55b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent#define EDID_FORMAT_LPCM    1
56b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
571b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo/* Retry for delay in FW loading*/
581b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo#define RETRY_NUMBER 10
591b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo#define RETRY_US 500000
604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava#define MAX_SND_CARD 8
6153b2cf0c72aa18a5848919e2309731af652e84f9sangwoo
62c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda#define MAX_SND_CARD_NAME_LEN 31
63c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
641a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta#define DEFAULT_APP_TYPE_RX_PATH  0x11130
651a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
66c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park#define TOSTRING_(x) #x
67c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park#define TOSTRING(x) TOSTRING_(x)
68c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park
69b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct audio_block_header
70b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
71b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int reserved;
72b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int length;
73b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
74b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
751a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtaenum {
761a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    CAL_MODE_SEND           = 0x1,
771a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    CAL_MODE_PERSIST        = 0x2,
781a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    CAL_MODE_RTAC           = 0x4
791a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta};
801a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park#define PLATFORM_CONFIG_KEY_OPERATOR_INFO "operator_info"
822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstruct operator_info {
842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode list;
852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *name;
862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *mccmnc;
872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park};
882f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
892f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstruct operator_specific_device {
902f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode list;
912f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *operator;
922f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *mixer_path;
932f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    int acdb_id;
942f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park};
952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct listnode operator_info_list;
972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct listnode *operator_specific_device_table[SND_DEVICE_MAX];
982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
9983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda/* Audio calibration related functions */
100b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_deallocate_t)();
101c698f1313378541ec781a986fc68615ec35536c3vivek mehtatypedef int  (*acdb_init_v2_cvd_t)(char *, char *, int);
1025c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandatypedef int  (*acdb_init_v2_t)(char *);
103b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef int  (*acdb_init_t)();
104b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_send_audio_cal_t)(int, int);
105b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurenttypedef void (*acdb_send_voice_cal_t)(int, int);
10683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandatypedef int (*acdb_reload_vocvoltable_t)(int);
1071a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtatypedef int (*acdb_send_gain_dep_cal_t)(int, int, int, int, int);
108b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
109b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Audio calibration related functions */
110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct platform_data {
111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev;
112b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_spkr_mode;
113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_voice_call;
1143ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    bool fluence_in_voice_comm;
115b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_voice_rec;
116c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    /* 0 = no fluence, 1 = fluence, 2 = fluence pro */
117c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    int  fluence_type;
118c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    int  source_mic_type;
1191f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    bool speaker_lr_swap;
1201f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
121b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    void *acdb_handle;
1223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    acdb_deallocate_t          acdb_deallocate;
1233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    acdb_send_audio_cal_t      acdb_send_audio_cal;
1243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    acdb_send_voice_cal_t      acdb_send_voice_cal;
12583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_reload_vocvoltable_t  acdb_reload_vocvoltable;
1261a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    acdb_send_gain_dep_cal_t   acdb_send_gain_dep_cal;
12783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct csd_data *csd;
128f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    char ec_ref_mixer_path[64];
129c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
130c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    char *snd_card_name;
131c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    int max_vol_index;
132c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    int max_mic_count;
133de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
134de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    void *hw_info;
135b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
136b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
13798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic int pcm_device_table[AUDIO_USECASE_MAX][2] = {
13883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
13983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                            DEEP_BUFFER_PCM_DEVICE},
14083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
14183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                            LOWLATENCY_PCM_DEVICE},
14283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
14383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                         MULTIMEDIA2_PCM_DEVICE},
14483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {PLAYBACK_OFFLOAD_DEVICE,
14583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                        PLAYBACK_OFFLOAD_DEVICE},
1462bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_TTS] = {MULTIMEDIA2_PCM_DEVICE,
1472bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda                                        MULTIMEDIA2_PCM_DEVICE},
1482bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE,
1492bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda                                    MULTIMEDIA3_PCM_DEVICE},
1502bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda
15183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE,
15283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                              AUDIO_RECORD_PCM_DEVICE},
15383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
15483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                          LOWLATENCY_PCM_DEVICE},
1552bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda
15683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE,
15783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                            VOICE_CALL_PCM_DEVICE},
1584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
1594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
1604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
1614b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
162a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta    [USECASE_VOICEMMODE1_CALL] = {VOICEMMODE1_CALL_PCM_DEVICE,
163a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta                                  VOICEMMODE1_CALL_PCM_DEVICE},
164a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta    [USECASE_VOICEMMODE2_CALL] = {VOICEMMODE2_CALL_PCM_DEVICE,
165a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta                                  VOICEMMODE2_CALL_PCM_DEVICE},
166a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta
1674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
1684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                   AUDIO_RECORD_PCM_DEVICE},
1694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
1704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                     AUDIO_RECORD_PCM_DEVICE},
1714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
1724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                                AUDIO_RECORD_PCM_DEVICE},
1738e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
17499c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
17563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
17663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
17763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
17899c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
17999c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda                                          AFE_PROXY_RECORD_PCM_DEVICE},
18099c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
18199c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda                                        AFE_PROXY_RECORD_PCM_DEVICE},
1824211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin    [USECASE_AUDIO_DSM_FEEDBACK] = {QUAT_MI2S_PCM_DEVICE, QUAT_MI2S_PCM_DEVICE},
18399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
184b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
185b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
186b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Array to store sound devices */
187b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic const char * const device_table[SND_DEVICE_MAX] = {
188b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_NONE] = "none",
189b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Playback sound devices */
190b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HANDSET] = "handset",
191b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER] = "speaker",
192b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
1931b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    [SND_DEVICE_OUT_SPEAKER_SAFE] = "speaker-safe",
194b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HEADPHONES] = "headphones",
19509f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    [SND_DEVICE_OUT_LINE] = "line",
196b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
1973b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = "speaker-safe-and-headphones",
198744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_LINE] = "speaker-and-line",
1993b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = "speaker-safe-and-line",
200b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
2019d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent    [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = "voice-hac-handset",
202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
20409f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    [SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
205b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HDMI] = "hdmi",
206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
2089f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus",
210b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
211b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
212b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
21399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_TX] = "voice-tx",
21463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
21563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
2167629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti    [SND_DEVICE_OUT_VOICE_SPEAKER_HFP] = "voice-speaker-hfp",
217b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
218b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Capture sound devices */
219b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
2203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
2213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
2223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
2233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
2243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
2253ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
2263ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
2273ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_STEREO] = "dmic-endfire",
2283ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
229b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
2303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
2313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
2323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
2333ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
2343ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
2353ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
2363ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
2373ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = "speaker-dmic-endfire",
2383ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
239b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
240cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    [SND_DEVICE_IN_HEADSET_MIC_AEC] = "headset-mic",
2413ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
242b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
243b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
244e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
2459f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
246e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb",
247b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
2483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
2493ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
2503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC_TMUS] = "voice-dmic-ef-tmus",
2513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
2523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
2537629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti    [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = "voice-speaker-mic-hfp",
2543ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
255b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
256b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
257b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
2583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
259b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
2603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
261733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = "voice-rec-mic",
2623ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
2633ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
2648c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi    [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "headset-mic",
26599c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
2669034bc45854d86d45f44e23ac705aeff9a6e6e51Ricardo Garcia    [SND_DEVICE_IN_UNPROCESSED_MIC] = "unprocessed-mic",
2670125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = "unprocessed-stereo-mic",
2680125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "unprocessed-three-mic",
2690125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "unprocessed-quad-mic",
2700125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "unprocessed-headset-mic",
27190fb96106e9e2db75e214722c797d013e10e5328rago
27299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_IN_VOICE_RX] = "voice-rx",
27363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
274c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_THREE_MIC] = "three-mic",
275c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
27663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
277c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_TMIC] = "three-mic",
278c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic",
279733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_TMIC_AEC] = "three-mic",
280733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_QMIC_AEC] = "quad-mic",
281b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
282b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
283b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
2845bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgestatic int acdb_device_table[SND_DEVICE_MAX] = {
285b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_NONE] = -1,
286b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HANDSET] = 7,
287b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER] = 15,
288b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_REVERSE] = 15,
2891b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    [SND_DEVICE_OUT_SPEAKER_SAFE] = 15,
290b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HEADPHONES] = 10,
291744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_LINE] = 77,
292b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
2933b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = 10,
294744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_LINE] = 77,
2953b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = 77,
296235c34827f7b3b8977fe76dea1fb8d818fd74312Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_HANDSET] = ACDB_ID_VOICE_HANDSET,
297235c34827f7b3b8977fe76dea1fb8d818fd74312Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER] = ACDB_ID_VOICE_SPEAKER,
2989d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent    [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = 53,
299b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
300744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_VOICE_LINE] = 77,
301b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HDMI] = 18,
302b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15,
303b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_BT_SCO] = 22,
3049f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_OUT_BT_SCO_WB] = 39,
30583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = ACDB_ID_VOICE_HANDSET_TMUS,
306b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
307b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
308b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
30999c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_TX] = 45,
31063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
31163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
312e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    [SND_DEVICE_OUT_VOICE_SPEAKER_HFP] = ACDB_ID_VOICE_SPEAKER,
313b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
314b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC] = 4,
3153ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
3163ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
3173ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
3183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC] = 41,
3193ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
3203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
3213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
3223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_STEREO] = 34,
3233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
3243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC] = 11,
3253ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
3263ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
3273ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
3283ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
3293ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
3303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
3313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
3323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = 35,
3333ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
33490fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
335cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    [SND_DEVICE_IN_HEADSET_MIC_AEC] = ACDB_ID_HEADSET_MIC_AEC,
3363ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
337b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HDMI_MIC] = 4,
338b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_BT_SCO_MIC] = 21,
339e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 21,
3409f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
341e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 38,
342b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_CAMCORDER_MIC] = 61,
3433ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
3443ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC] = 41,
3453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC_TMUS] = ACDB_ID_VOICE_DMIC_EF_TMUS,
3463ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
347e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11,
3483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
34990fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_VOICE_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
350b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
351b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
352b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
3533ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
35490fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_VOICE_REC_MIC] = ACDB_ID_VOICE_REC_MIC,
3553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 113,
356733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = 112,
3573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 35,
3583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 43,
35990fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
36090fb96106e9e2db75e214722c797d013e10e5328rago
36190fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_UNPROCESSED_MIC] = ACDB_ID_VOICE_REC_MIC,
36290fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
3634ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = 35,
3644ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 125,
3654ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 125,
36699c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
36799c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_IN_VOICE_RX] = 44,
36863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
369c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_THREE_MIC] = 46,
370c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_QUAD_MIC] = 46,
37163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
372c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_TMIC] = 125,
373c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_QMIC] = 125,
374733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_TMIC_AEC] = 125, /* override this for new target to 140 */
375733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_QMIC_AEC] = 125, /* override this for new target to 140 */
376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
377b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
37898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestruct name_to_index {
3795bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    char name[100];
3805bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    unsigned int index;
3815bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George};
3825bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
3835bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#define TO_NAME_INDEX(X)   #X, X
3845bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
38598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George/* Used to get index from parsed string */
38698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic const struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = {
38798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    /* out */
3885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)},
3895bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)},
3905bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)},
3911b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE)},
3925bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
39309f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_LINE)},
3945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
3953b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES)},
396744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_LINE)},
3973b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE)},
3985bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
3995bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
400e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_HFP)},
4015bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
40209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
4035bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
4045bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)},
4055bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
4065bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
40798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET_TMUS)},
4089d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HAC_HANDSET)},
4095bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
4105bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
4115bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
41298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
41398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    /* in */
41463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
41563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
4165bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
41798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
4183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)},
4193ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)},
4203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)},
4213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)},
4223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)},
4233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)},
4243ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_STEREO)},
4253ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4263ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)},
42798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)},
4283ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)},
4293ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)},
4303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)},
4313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)},
4323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)},
4333ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)},
4343ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_STEREO)},
4353ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4363ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)},
437b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_AEC)},
4383ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4395bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
4405bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
441e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
4425bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
443e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)},
4445bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
4453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4463ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)},
4473ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC_TMUS)},
4483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
449e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP)},
4503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)},
4513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
4525bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)},
4535bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)},
4545bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)},
4553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4565bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
4573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
458733c1df5828d63f547553b4a441668905306a4e2vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_AEC)},
4593ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
4603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
4618c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_HEADSET_MIC)},
46263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
46390fb96106e9e2db75e214722c797d013e10e5328rago    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)},
46490fb96106e9e2db75e214722c797d013e10e5328rago    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
4654ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_STEREO_MIC)},
4664ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)},
4674ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)},
46890fb96106e9e2db75e214722c797d013e10e5328rago
469c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)},
470c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
47163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
472c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)},
473c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)},
474733c1df5828d63f547553b4a441668905306a4e2vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_AEC)},
475733c1df5828d63f547553b4a441668905306a4e2vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC_AEC)},
47698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George};
47798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
478b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandastatic char * backend_tag_table[SND_DEVICE_MAX] = {0};
479b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandastatic char * hw_interface_table[SND_DEVICE_MAX] = {0};
48098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
48198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic const struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = {
48298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_DEEP_BUFFER)},
48398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)},
48498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)},
48598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)},
4862bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_TTS)},
4872bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)},
48898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
48998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},
49098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOICE_CALL)},
49198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOICE2_CALL)},
49298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOLTE_CALL)},
49398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_QCHAT_CALL)},
49498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOWLAN_CALL)},
49598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK)},
49698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
49798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
49898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
4995bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George};
5005bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
5017ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
5027ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
5037ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George
504b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic pthread_once_t check_op_once_ctl = PTHREAD_ONCE_INIT;
505b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic bool is_tmus = false;
506b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
507b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic void check_operator()
508b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
509b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char value[PROPERTY_VALUE_MAX];
510b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int mccmnc;
511b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    property_get("gsm.sim.operator.numeric",value,"0");
512b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mccmnc = atoi(value);
5132bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent    ALOGD("%s: tmus mccmnc %d", __func__, mccmnc);
514b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    switch(mccmnc) {
515b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* TMUS MCC(310), MNC(490, 260, 026) */
516b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310490:
517b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310260:
518b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310026:
519b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    /* Add new TMUS MNC(800, 660, 580, 310, 270, 250, 240, 230, 220, 210, 200, 160) */
520b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310800:
521b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310660:
522b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310580:
523b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310310:
524b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310270:
525b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310250:
526b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310240:
527b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310230:
528b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310220:
529b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310210:
530b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310200:
531b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310160:
532b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        is_tmus = true;
533b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        break;
534b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
535b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
536b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
537b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentbool is_operator_tmus()
538b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
539b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    pthread_once(&check_op_once_ctl, check_operator);
540b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return is_tmus;
541b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
542b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
5432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic char *get_current_operator()
5442f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
5452f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode *node;
5462f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_info *info_item;
5472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char mccmnc[PROPERTY_VALUE_MAX];
5482f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *ret = NULL;
5492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5502f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    property_get("gsm.sim.operator.numeric",mccmnc,"0");
5512f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5522f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_for_each(node, &operator_info_list) {
5532f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info_item = node_to_item(node, struct operator_info, list);
5542f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (strstr(info_item->mccmnc, mccmnc) != NULL) {
5552f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            ret = info_item->name;
5562f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
5572f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
5582f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5592f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
5602f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
5612f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5622f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct operator_specific_device *get_operator_specific_device(snd_device_t snd_device)
5632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
5642f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode *node;
5652f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *ret = NULL;
5662f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device_item;
5672f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *operator_name;
5682f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    operator_name = get_current_operator();
5702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (operator_name == NULL)
5712f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        return ret;
5722f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5732f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_for_each(node, operator_specific_device_table[snd_device]) {
5742f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        device_item = node_to_item(node, struct operator_specific_device, list);
5752f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (strcmp(operator_name, device_item->operator) == 0) {
5762f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            ret = device_item;
5772f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
5782f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
5792f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5802f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
5812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
5822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic int get_operator_specific_device_acdb_id(snd_device_t snd_device)
5852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
5862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device;
5872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    int ret = acdb_device_table[snd_device];
5882f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5892f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device = get_operator_specific_device(snd_device);
5902f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (device != NULL)
5912f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        ret = device->acdb_id;
5922f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5932f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
5942f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
5952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
5962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic const char *get_operator_specific_device_mixer_path(snd_device_t snd_device)
5972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
5982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device;
5992f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    const char *ret = device_table[snd_device];
6002f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6012f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device = get_operator_specific_device(snd_device);
6022f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (device != NULL)
6032f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        ret = device->mixer_path;
6042f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6052f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
6062f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
6072f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6081a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtabool platform_send_gain_dep_cal(void *platform, int level)
6091a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta{
6101a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    bool ret_val = false;
6111a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct platform_data *my_data = (struct platform_data *)platform;
6121a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct audio_device *adev = my_data->adev;
6131a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    int acdb_dev_id, app_type;
6141a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    int acdb_dev_type = MSM_SNDDEV_CAP_RX;
6151a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    int mode = CAL_MODE_RTAC;
6161a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct listnode *node;
6171a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct audio_usecase *usecase;
6181a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6191a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    if (my_data->acdb_send_gain_dep_cal == NULL) {
6201a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__);
6211a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        return ret_val;
6221a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    }
6231a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6241a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    if (!voice_is_in_call(adev)) {
6251a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        ALOGV("%s: Not Voice call usecase, apply new cal for level %d",
6261a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta               __func__, level);
6271a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        app_type = DEFAULT_APP_TYPE_RX_PATH;
6281a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6291a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        // find the current active sound device
6301a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        list_for_each(node, &adev->usecase_list) {
6311a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            usecase = node_to_item(node, struct audio_usecase, list);
6321a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6331a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            if (usecase != NULL &&
6341a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                usecase->type == PCM_PLAYBACK &&
6351a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                (usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER)) {
6361a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6371a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                ALOGV("%s: out device is %d", __func__,  usecase->out_snd_device);
6384cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                if (audio_extn_spkr_prot_is_enabled()) {
6394cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                    acdb_dev_id = audio_extn_spkr_prot_get_acdb_id(usecase->out_snd_device);
6404cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                } else {
6414cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                    acdb_dev_id = acdb_device_table[usecase->out_snd_device];
6424cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                }
6434cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta
6441a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
6451a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                                                     acdb_dev_type, mode, level)) {
6461a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                    // set ret_val true if at least one calibration is set successfully
6471a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                    ret_val = true;
6481a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                } else {
6491a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                    ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__);
6501a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                }
6511a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            } else {
6521a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                ALOGW("%s: Usecase list is empty", __func__);
6531a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            }
6541a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        }
6551a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    } else {
6561a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        ALOGW("%s: Voice call in progress .. ignore setting new cal",
6571a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta              __func__);
6581a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    }
6591a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    return ret_val;
6601a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta}
6611a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
662cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurentvoid platform_set_echo_reference(struct audio_device *adev, bool enable, audio_devices_t out_device)
663b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
664f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)adev->platform;
665cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
666cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent
667f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    if (strcmp(my_data->ec_ref_mixer_path, "")) {
668f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        ALOGV("%s: diabling %s", __func__, my_data->ec_ref_mixer_path);
669f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        audio_route_reset_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
670cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    }
671cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent
672f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    if (enable) {
673f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        strcpy(my_data->ec_ref_mixer_path, "echo-reference");
674f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        if (out_device != AUDIO_DEVICE_NONE) {
675f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda            snd_device = platform_get_output_snd_device(adev->platform, out_device);
676f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda            platform_add_backend_name(adev->platform, my_data->ec_ref_mixer_path, snd_device);
677f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        }
678b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
679188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato        ALOGV("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
680f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
681f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    }
682b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
683b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
68483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic struct csd_data *open_csd_client(bool i2s_ext_modem)
68583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
68683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct csd_data *csd = calloc(1, sizeof(struct csd_data));
68783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
68883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
68983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (csd->csd_client == NULL) {
69083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
69183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        goto error;
69283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
69383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
69483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
69583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->deinit = (deinit_t)dlsym(csd->csd_client,
69683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_deinit");
69783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->deinit == NULL) {
69883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
69983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  dlerror());
70083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
70183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
70283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
70383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_disable_device");
70483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->disable_device == NULL) {
70583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_disable_device",
70683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
70783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
70883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
70983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client,
71083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                               "csd_client_enable_device_config");
71183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->enable_device_config == NULL) {
71283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_enable_device_config",
71383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
71483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
71583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
71683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
71783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_enable_device");
71883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->enable_device == NULL) {
71983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_enable_device",
72083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
72183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
72283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
72383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
72483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_voice");
72583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_voice == NULL) {
72683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_voice",
72783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
72883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
72983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
73083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
73183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_voice");
73283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_voice == NULL) {
73383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_voice",
73483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
73583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
73683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
73783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->volume = (volume_t)dlsym(csd->csd_client,
73883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_volume");
73983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->volume == NULL) {
74083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_volume",
74183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
74283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
74383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
74483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
74583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_mic_mute");
74683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->mic_mute == NULL) {
74783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_mic_mute",
74883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
74983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
75083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
75183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
75283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_slow_talk");
75383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->slow_talk == NULL) {
75483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_slow_talk",
75583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
75683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
75783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
75883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
75983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_playback");
76083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_playback == NULL) {
76183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_playback",
76283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
76383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
76483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
76583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
76683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_playback");
76783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_playback == NULL) {
76883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_playback",
76983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
77083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
77183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
77283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_record = (start_record_t)dlsym(csd->csd_client,
77383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_record");
77483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_record == NULL) {
77583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_record",
77683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
77783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
77883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
77983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
78083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_record");
78183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_record == NULL) {
78283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_record",
78383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
78483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
78583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
78683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
78783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client,
78883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_get_sample_rate");
78983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->get_sample_rate == NULL) {
79083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_get_sample_rate",
79183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
79283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
79383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
79483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
79583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
79683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
79783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
79883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->init == NULL) {
79983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_init",
80083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
80183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
80283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        } else {
80383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            csd->init(i2s_ext_modem);
80483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
80583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
80683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return csd;
80783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
80883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaerror:
80983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    free(csd);
81083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    csd = NULL;
81183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return csd;
81283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
81383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
81483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandavoid close_csd_client(struct csd_data *csd)
81583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
81683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (csd != NULL) {
81783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->deinit();
81883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        dlclose(csd->csd_client);
81983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        free(csd);
82083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd = NULL;
82183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
82283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
82383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
82483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic void platform_csd_init(struct platform_data *my_data)
82583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
82683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084
827ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    int32_t modems, (*count_modems)(void);
828ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    const char *name = "libdetectmodem.so";
829ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    const char *func = "count_modems";
830ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    const char *error;
831ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
832ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    my_data->csd = NULL;
833ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
834ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    void *lib = dlopen(name, RTLD_NOW);
835ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    error = dlerror();
836ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (!lib) {
837ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        ALOGE("%s: could not find %s: %s", __func__, name, error);
838ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        return;
839ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    }
840ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
841ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    count_modems = NULL;
842ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    *(void **)(&count_modems) = dlsym(lib, func);
843ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    error = dlerror();
844ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (!count_modems) {
845ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        ALOGE("%s: could not find symbol %s in %s: %s",
846ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev              __func__, func, name, error);
847ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        goto done;
84883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
84983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
850ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    modems = count_modems();
851ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (modems < 0) {
852ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        ALOGE("%s: count_modems failed\n", __func__);
853ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        goto done;
854ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    }
855ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
8562bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent    ALOGD("%s: num_modems %d\n", __func__, modems);
857ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (modems > 0)
85883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->csd = open_csd_client(false /*is_i2s_ext_modem*/);
859ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
860ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchevdone:
861ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    dlclose(lib);
86283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
86383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     my_data->csd = NULL;
86483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
86583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
86683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
867c633338c83da3760c4965d29af2afd80d3cce840Eric Laurentstatic void set_platform_defaults(struct platform_data * my_data)
86898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
86998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int32_t dev;
87098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
871b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        backend_tag_table[dev] = NULL;
872b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        hw_interface_table[dev] = NULL;
8732f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        operator_specific_device_table[dev] = NULL;
87498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
87598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
876b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    // To overwrite these go to the audio_platform_info.xml file.
877b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("bt-sco");
878e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco");
879b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco");
880b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
881b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi");
882b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
883b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb");
884e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb");
885b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy");
886b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_VOICE_RX] = strdup("afe-proxy");
88798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
888b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
889b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
890b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = strdup("SLIMBUS_0_RX");
891b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE] = strdup("SLIMBUS_0_RX");
892b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_HEADPHONES] = strdup("SLIMBUS_0_RX");
893b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_LINE] = strdup("SLIMBUS_0_RX");
894b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = strdup("SLIMBUS_0_RX");
8953b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = strdup("SLIMBUS_0_RX");
896b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX");
8973b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = strdup("SLIMBUS_0_RX");
898b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("SLIMBUS_0_RX");
899b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HAC_HANDSET] = strdup("SLIMBUS_0_RX");
900b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER] = strdup("SLIMBUS_0_RX");
901b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX");
902b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_LINE] = strdup("SLIMBUS_0_RX");
903b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_HDMI] = strdup("HDMI_RX");
904b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("SLIMBUS_0_RX-and-HDMI_RX");
905b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_BT_SCO] = strdup("SEC_AUX_PCM_RX");
906b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("SEC_AUX_PCM_RX");
907b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = strdup("SLIMBUS_0_RX");
908b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_0_RX");
909b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_0_RX");
910b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("SLIMBUS_0_RX");
911b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TX] = strdup("AFE_PCM_RX");
912b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
913b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
914c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent
915c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent    my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
91698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
91798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
9185c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandavoid get_cvd_version(char *cvd_version, struct audio_device *adev)
9195c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda{
9205c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    struct mixer_ctl *ctl;
9215c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    int count;
9225c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    int ret = 0;
9235c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
9245c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL);
9255c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    if (!ctl) {
9265c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        ALOGE("%s: Could not get ctl for mixer cmd - %s",  __func__, CVD_VERSION_MIXER_CTL);
9275c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        goto done;
9285c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    }
9295c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    mixer_ctl_update(ctl);
9305c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
9315c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    count = mixer_ctl_get_num_values(ctl);
9325c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    if (count > MAX_CVD_VERSION_STRING_SIZE)
9335c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        count = MAX_CVD_VERSION_STRING_SIZE - 1;
9345c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
9355c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    ret = mixer_ctl_get_array(ctl, cvd_version, count);
9365c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    if (ret != 0) {
9375c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__);
9385c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        goto done;
9395c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    }
9405c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
9415c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandadone:
9425c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    return;
9435c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda}
9445c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
945b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid *platform_init(struct audio_device *adev)
946b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
947b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char value[PROPERTY_VALUE_MAX];
94860ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    struct platform_data *my_data = NULL;
94960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    int retry_num = 0, snd_card_num = 0, key = 0, ret = 0;
95060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    bool dual_mic_config = false, use_default_mixer_path = true;
95183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    const char *snd_card_name;
9525c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    char *cvd_version = NULL;
95360ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    char *snd_internal_name = NULL;
95460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    char *tmp = NULL;
95560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0};
956de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    char platform_info_file[MIXER_PATH_MAX_LENGTH]= {0};
957de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    struct snd_card_split *snd_split_handle = NULL;
958c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    my_data = calloc(1, sizeof(struct platform_data));
959c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
960c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    my_data->adev = adev;
961c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
9622f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_init(&operator_info_list);
9632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
964c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    set_platform_defaults(my_data);
965c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
9664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    while (snd_card_num < MAX_SND_CARD) {
9674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        adev->mixer = mixer_open(snd_card_num);
9681b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo
9694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        while (!adev->mixer && retry_num < RETRY_NUMBER) {
9704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            usleep(RETRY_US);
9714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            adev->mixer = mixer_open(snd_card_num);
9724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            retry_num++;
9734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
97483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
9754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (!adev->mixer) {
9764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: Unable to open the mixer card: %d", __func__,
9774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                   snd_card_num);
9784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            retry_num = 0;
9794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            snd_card_num++;
9804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            continue;
9814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
982cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
9834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        snd_card_name = mixer_get_name(adev->mixer);
984de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        my_data->hw_info = hw_info_init(snd_card_name);
985c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
986de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        audio_extn_set_snd_card_split(snd_card_name);
987de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        snd_split_handle = audio_extn_get_snd_card_split();
988de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
989de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        /* Get the codec internal name from the sound card and/or form factor
990de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * name and form the mixer paths and platfor info file name dynamically.
991de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * This is generic way of picking any codec and forma factor name based
992de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * mixer and platform info files in future with no code change.
993c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
994de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * current code extends and looks for any of the exteneded mixer path and
995de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * platform info file present based on codec and form factor.
996de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
997de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * order of picking appropriate file is
998de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * <i>   mixer_paths_<codec_name>_<form_factor>.xml, if file not present
999de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * <ii>  mixer_paths_<codec_name>.xml, if file not present
1000de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * <iii> mixer_paths.xml
1001de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1002de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * same order is followed for audio_platform_info.xml as well
1003de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         */
1004de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1005de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        // need to carryforward old file name
1006de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        if (!strncmp(snd_card_name, TOMTOM_8226_SND_CARD_NAME,
1007f9583c366559860ec5f287816908216c50cb917eEric Laurent                     min(strlen(TOMTOM_8226_SND_CARD_NAME), strlen(snd_card_name)))) {
1008de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
100960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta                             MIXER_XML_BASE_STRING, TOMTOM_MIXER_FILE_SUFFIX );
1010de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        } else {
1011de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1012de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s_%s.xml",
1013de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             MIXER_XML_BASE_STRING, snd_split_handle->snd_card,
1014de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             snd_split_handle->form_factor);
1015de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1016de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            if (F_OK != access(mixer_xml_file, 0)) {
1017de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
1018de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
1019de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             MIXER_XML_BASE_STRING, snd_split_handle->snd_card);
1020de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1021de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                if (F_OK != access(mixer_xml_file, 0)) {
1022de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
1023de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH, MIXER_PATH_MAX_LENGTH);
102460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta                }
1025de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            }
1026de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1027de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s_%s.xml",
1028de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card,
1029de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             snd_split_handle->form_factor);
1030a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent
1031de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            if (F_OK != access(platform_info_file, 0)) {
1032de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                memset(platform_info_file, 0, sizeof(platform_info_file));
1033de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s.xml",
1034de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card);
1035de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1036de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                if (F_OK != access(platform_info_file, 0)) {
1037de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    memset(platform_info_file, 0, sizeof(platform_info_file));
1038de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    strlcpy(platform_info_file, PLATFORM_INFO_XML_PATH, MIXER_PATH_MAX_LENGTH);
103960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta                }
104060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta            }
104160ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta        }
104260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta
1043de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        /* Initialize platform specific ids and/or backends*/
1044de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        platform_info_init(platform_info_file, my_data);
1045de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1046de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        /* validate the sound card name
1047de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * my_data->snd_card_name can contain
1048de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *     <a> complete sound card name, i.e. <device>-<codec>-<form_factor>-snd-card
1049de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *         example: msm8994-tomtom-mtp-snd-card
1050de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *     <b> or sub string of the card name, i.e. <device>-<codec>
1051de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *         example: msm8994-tomtom
1052f9583c366559860ec5f287816908216c50cb917eEric Laurent         * snd_card_name is truncated to 32 charaters as per mixer_get_name() implementation
1053f9583c366559860ec5f287816908216c50cb917eEric Laurent         * so use min of my_data->snd_card_name and snd_card_name length for comparison
1054de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         */
1055de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1056de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        if (my_data->snd_card_name != NULL &&
1057f9583c366559860ec5f287816908216c50cb917eEric Laurent                strncmp(snd_card_name, my_data->snd_card_name,
1058f9583c366559860ec5f287816908216c50cb917eEric Laurent                        min(strlen(snd_card_name), strlen(my_data->snd_card_name))) != 0) {
1059de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            ALOGI("%s: found valid sound card %s, but not primary sound card %s",
1060de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                   __func__, snd_card_name, my_data->snd_card_name);
1061de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            retry_num = 0;
1062de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snd_card_num++;
1063de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            hw_info_deinit(my_data->hw_info);
1064de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            my_data->hw_info = NULL;
1065de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            continue;
106670b5c14093fda468f42591ef4a8bff33f5788563Ed Tam        }
1067de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        ALOGI("%s: found sound card %s, primary sound card expeted is %s",
1068de4849cee04a23ae84da96487e344f75f93e5585vivek mehta              __func__, snd_card_name, my_data->snd_card_name);
106911dd22384f2ae13ec4a7563ce5f0a113cf30a53cUday Kishore Pasupuleti
107060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta        ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file);
107160ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta        adev->audio_route = audio_route_init(snd_card_num, mixer_xml_file);
107260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta
10734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (!adev->audio_route) {
10744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: Failed to init audio route controls, aborting.", __func__);
1075c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda            goto init_failed;
10764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
10774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        adev->snd_card = snd_card_num;
10782bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent        ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
10794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        break;
10804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
10814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
10824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (snd_card_num >= MAX_SND_CARD) {
10834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
1084c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        goto init_failed;
10851b9f4b3708d1ed1204bdb1dec370ad2e9db7a779sangwoo    }
1086b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1087c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    //set max volume step for voice call
1088c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    property_get("ro.config.vc_call_vol_steps", value, TOSTRING(MAX_VOL_INDEX));
1089c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    my_data->max_vol_index = atoi(value);
1090c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park
109165ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    property_get("persist.audio.dualmic.config",value,"");
109265ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    if (!strcmp("endfire", value)) {
109365ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta        dual_mic_config = true;
109465ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    }
109565ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta
1096c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    my_data->source_mic_type = SOURCE_DUAL_MIC;
1097c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
1098b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_spkr_mode = false;
1099b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_voice_call = false;
11003ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    my_data->fluence_in_voice_comm = false;
1101b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_voice_rec = false;
1102b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
110365ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    property_get("ro.qc.sdk.audio.fluencetype", value, "none");
1104c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    if (!strcmp("fluencepro", value)) {
1105c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->fluence_type = FLUENCE_PRO_ENABLE;
110665ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    } else if (!strcmp("fluence", value) || (dual_mic_config)) {
1107c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->fluence_type = FLUENCE_ENABLE;
1108c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    } else if (!strcmp("none", value)) {
1109c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->fluence_type = FLUENCE_DISABLE;
1110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1112c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    if (my_data->fluence_type != FLUENCE_DISABLE) {
1113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.voicecall",value,"");
1114b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
1115b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_voice_call = true;
1116b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1117b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
11183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        property_get("persist.audio.fluence.voicecomm",value,"");
11193ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        if (!strcmp("true", value)) {
11203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            my_data->fluence_in_voice_comm = true;
11213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        }
11223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
1123b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.voicerec",value,"");
1124b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
1125b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_voice_rec = true;
1126b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1127b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1128b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.speaker",value,"");
1129b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
1130b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_spkr_mode = true;
1131b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1132b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1133b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1134c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    // support max to mono, example if max count is 3, usecase supports Three, dual and mono mic
1135c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    switch (my_data->max_mic_count) {
1136c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 4:
1137c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_QUAD_MIC;
1138c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 3:
1139c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_THREE_MIC;
1140c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 2:
1141c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_DUAL_MIC;
1142c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 1:
1143c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_MONO_MIC;
1144c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            break;
1145c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        default:
1146c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            ALOGE("%s: max_mic_count (%d), is not supported, setting to default",
1147c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   __func__, my_data->max_mic_count);
1148c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type = SOURCE_MONO_MIC|SOURCE_DUAL_MIC;
1149c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            break;
1150c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        }
1151c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
1152c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    ALOGV("%s: Fluence_Type(%d) max_mic_count(%d) mic_type(0x%x) fluence_in_voice_call(%d)"
1153c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          " fluence_in_voice_comm(%d) fluence_in_voice_rec(%d) fluence_in_spkr_mode(%d) ",
1154c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          __func__, my_data->fluence_type, my_data->max_mic_count, my_data->source_mic_type,
1155c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          my_data->fluence_in_voice_call, my_data->fluence_in_voice_comm,
1156c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          my_data->fluence_in_voice_rec, my_data->fluence_in_spkr_mode);
1157c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
1158b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
1159b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_handle == NULL) {
1160b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
1161b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
1162b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
1163b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
1164b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_deallocate_ACDB");
116583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_deallocate)
116683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
116783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
116883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
1169b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
1170b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_send_audio_cal");
1171b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!my_data->acdb_send_audio_cal)
117283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s",
1173b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                  __func__, LIB_ACDB_LOADER);
117483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
1175b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
1176b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_send_voice_cal");
117783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_send_voice_cal)
117883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
117983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
118083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
118183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
118283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    "acdb_loader_reload_vocvoltable");
118383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_reload_vocvoltable)
118483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
118583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
11861a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
11871a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle,
11881a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                                                    "acdb_loader_send_gain_dep_cal");
11891a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        if (!my_data->acdb_send_gain_dep_cal)
11901a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
11911a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                  __func__, LIB_ACDB_LOADER);
11921a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
1193c698f1313378541ec781a986fc68615ec35536c3vivek mehta#if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996)
11945c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init_v2_cvd_t acdb_init;
11955c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init = (acdb_init_v2_cvd_t)dlsym(my_data->acdb_handle,
11965c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda                                              "acdb_loader_init_v2");
11975c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        if (acdb_init == NULL) {
119883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror());
11995c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda            goto acdb_init_fail;
12005c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        }
12015c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
12025c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
12035c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        get_cvd_version(cvd_version, adev);
12045c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        if (!cvd_version)
12055c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda            ALOGE("failed to allocate cvd_version");
120683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        else
1207c698f1313378541ec781a986fc68615ec35536c3vivek mehta            acdb_init((char *)snd_card_name, cvd_version, 0);
12085c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        free(cvd_version);
12095c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#elif defined (PLATFORM_MSM8084)
12105c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init_v2_t acdb_init;
12115c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init = (acdb_init_v2_t)dlsym(my_data->acdb_handle,
12125c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda                                          "acdb_loader_init_v2");
12135c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        if (acdb_init == NULL) {
12145c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__, dlerror());
12155c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda            goto acdb_init_fail;
12165c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        }
12175c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init((char *)snd_card_name);
121883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
12195c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init_t acdb_init;
12205c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
1221b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_init_ACDB");
12225c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        if (acdb_init == NULL)
1223b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__, dlerror());
1224b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
12255c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda            acdb_init();
122683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
1227b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
12295c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandaacdb_init_fail:
12305c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
123163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    audio_extn_spkr_prot_init(adev);
123298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
12337631557cda5515b07b06dd0def53e5813f2442f3Ravi Kumar Alamanda    audio_extn_hwdep_cal_send(adev->snd_card, my_data->acdb_handle);
12347631557cda5515b07b06dd0def53e5813f2442f3Ravi Kumar Alamanda
123583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    /* load csd client */
123683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    platform_csd_init(my_data);
123783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
1238b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return my_data;
1239c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1240c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandainit_failed:
1241c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (my_data)
1242c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        free(my_data);
1243c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    return NULL;
1244b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1245b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1246b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid platform_deinit(void *platform)
1247b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1248c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    int32_t dev;
12492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_info *info_item;
12502f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device_item;
12512f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode *node;
1252c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
12534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
12544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    close_csd_client(my_data->csd);
1255c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1256de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    hw_info_deinit(my_data->hw_info);
1257de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1258c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
1259c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        if (backend_tag_table[dev])
1260c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda            free(backend_tag_table[dev]);
1261c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        if (hw_interface_table[dev])
1262c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda            free(hw_interface_table[dev]);
12632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (operator_specific_device_table[dev]) {
12642f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            while (!list_empty(operator_specific_device_table[dev])) {
12652f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                node = list_head(operator_specific_device_table[dev]);
12662f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                list_remove(node);
12672f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                device_item = node_to_item(node, struct operator_specific_device, list);
12682f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                free(device_item->operator);
12692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                free(device_item->mixer_path);
12702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                free(device_item);
12712f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            }
12722f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            free(operator_specific_device_table[dev]);
12732f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
1274c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    }
1275c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1276c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (my_data->snd_card_name)
1277c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        free(my_data->snd_card_name);
1278c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
12792f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    while (!list_empty(&operator_info_list)) {
12802f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        node = list_head(&operator_info_list);
12812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        list_remove(node);
12822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info_item = node_to_item(node, struct operator_info, list);
12832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        free(info_item->name);
12842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        free(info_item->mccmnc);
12852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        free(info_item);
12862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
12872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
1288b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    free(platform);
1289b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1290b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1291b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentconst char *platform_get_snd_device_name(snd_device_t snd_device)
1292b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
12932f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
12942f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (operator_specific_device_table[snd_device] != NULL) {
12952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            return get_operator_specific_device_mixer_path(snd_device);
12962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
1297b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return device_table[snd_device];
12982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    } else
12996402646dbd962f62c37abbb1d435907d54da77ddRavi Kumar Alamanda        return "none";
1300b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1301b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1302de4849cee04a23ae84da96487e344f75f93e5585vivek mehtaint platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
1303de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                                      char *device_name)
1304de4849cee04a23ae84da96487e344f75f93e5585vivek mehta{
1305de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    struct platform_data *my_data = (struct platform_data *)platform;
1306de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1307de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    if (platform == NULL || device_name == NULL) {
1308de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        ALOGW("%s: something wrong, use legacy get_snd_device name", __func__);
1309de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        device_name = platform_get_snd_device_name(snd_device);
1310de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    } else if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
1311de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        if (operator_specific_device_table[snd_device] != NULL) {
1312de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            strlcpy(device_name, get_operator_specific_device_mixer_path(snd_device),
1313de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    DEVICE_NAME_MAX_SIZE);
1314de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        } else {
1315de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
1316de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        }
1317de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
1318de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    } else {
1319de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        strlcpy(device_name, "none", DEVICE_NAME_MAX_SIZE);
1320de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    }
1321de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1322de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    return 0;
1323de4849cee04a23ae84da96487e344f75f93e5585vivek mehta}
1324de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1325299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamandavoid platform_add_backend_name(void *platform, char *mixer_path,
1326299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda                               snd_device_t snd_device)
1327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1328299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
1329299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda
133098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
133198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
133298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        return;
13331de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda    }
133498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
1335b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    const char * suffix = backend_tag_table[snd_device];
133698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
133798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if (suffix != NULL) {
133898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        strcat(mixer_path, " ");
133998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        strcat(mixer_path, suffix);
1340299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    }
1341b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1342b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1343b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandabool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2)
1344b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda{
1345b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    bool result = true;
1346b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1347b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: snd_device1 = %s, snd_device2 = %s", __func__,
1348b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device1),
1349b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device2));
1350b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1351b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if ((snd_device1 < SND_DEVICE_MIN) || (snd_device1 >= SND_DEVICE_MAX)) {
1352b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGE("%s: Invalid snd_device = %s", __func__,
1353b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device1));
1354b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        return false;
1355b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1356b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if ((snd_device2 < SND_DEVICE_MIN) || (snd_device2 >= SND_DEVICE_MAX)) {
1357b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGE("%s: Invalid snd_device = %s", __func__,
1358b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device2));
1359b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        return false;
1360b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1361b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    const char * be_itf1 = hw_interface_table[snd_device1];
1362b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    const char * be_itf2 = hw_interface_table[snd_device2];
1363b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1364b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (NULL != be_itf1 && NULL != be_itf2) {
1365e63e61d40e171b60b8345f2a47022d066aa589f2Eric Laurent        if ((NULL == strstr(be_itf2, be_itf1)) && (NULL == strstr(be_itf1, be_itf2)))
1366b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda            result = false;
1367b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1368b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1369b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: be_itf1 = %s, be_itf2 = %s, match %d", __func__, be_itf1, be_itf2, result);
1370b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    return result;
1371b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda}
1372b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1373b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
1374b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1375b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int device_id;
1376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (device_type == PCM_PLAYBACK)
1377b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        device_id = pcm_device_table[usecase][0];
1378b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else
1379b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        device_id = pcm_device_table[usecase][1];
1380b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return device_id;
1381b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1382b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
138398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic int find_index(const struct name_to_index * table, int32_t len,
138498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George                      const char * name)
13855bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{
13865bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    int ret = 0;
138798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int32_t i;
13885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
138998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if (table == NULL) {
139098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: table is NULL", __func__);
13915bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        ret = -ENODEV;
13925bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        goto done;
13935bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    }
13945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
139598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if (name == NULL) {
139698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("null key");
139798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -ENODEV;
139898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        goto done;
139998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
140098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
140198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    for (i=0; i < len; i++) {
140298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        if (!strcmp(table[i].name, name)) {
140398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George            ret = table[i].index;
14045bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George            goto done;
14055bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        }
14065bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    }
140798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    ALOGE("%s: Could not find index for name = %s",
140898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George            __func__, name);
14095bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    ret = -ENODEV;
14105bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone:
14115bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    return ret;
14125bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George}
14135bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
141498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_get_snd_device_index(char *device_name)
141598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
141698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return find_index(snd_device_name_index, SND_DEVICE_MAX, device_name);
141798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
141898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
141998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_get_usecase_index(const char *usecase_name)
142098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
142198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return find_index(usecase_name_index, AUDIO_USECASE_MAX, usecase_name);
142298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
142398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
14242f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkvoid platform_add_operator_specific_device(snd_device_t snd_device,
14252f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                                           const char *operator,
14262f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                                           const char *mixer_path,
14272f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                                           unsigned int acdb_id)
14282f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
14292f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device;
14302f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14312f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (operator_specific_device_table[snd_device] == NULL) {
14322f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        operator_specific_device_table[snd_device] =
14332f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            (struct listnode *)calloc(1, sizeof(struct listnode));
14342f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        list_init(operator_specific_device_table[snd_device]);
14352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
14362f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device = (struct operator_specific_device *)calloc(1, sizeof(struct operator_specific_device));
14382f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device->operator = strdup(operator);
14402f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device->mixer_path = strdup(mixer_path);
14412f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device->acdb_id = acdb_id;
14422f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_add_tail(operator_specific_device_table[snd_device], &device->list);
14442f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14452bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent    ALOGD("%s: device[%s] -> operator[%s] mixer_path[%s] acdb_id[%d]", __func__,
14462f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            platform_get_snd_device_name(snd_device), operator, mixer_path, acdb_id);
14472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14482f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
14492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14505bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgeint platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id)
14515bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{
14525bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    int ret = 0;
14535bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
14545bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
14555bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        ALOGE("%s: Invalid snd_device = %d",
14565bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George            __func__, snd_device);
14575bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        ret = -EINVAL;
14585bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        goto done;
14595bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    }
14605bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
1461b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: acdb_device_table[%s]: old = %d new = %d", __func__,
1462b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda          platform_get_snd_device_name(snd_device), acdb_device_table[snd_device], acdb_id);
14635bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    acdb_device_table[snd_device] = acdb_id;
14645bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone:
14655bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    return ret;
14665bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George}
14675bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
146863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamandaint platform_get_snd_device_acdb_id(snd_device_t snd_device)
146963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda{
147063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
147163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
147263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        return -EINVAL;
147363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    }
14742f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
14752f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (operator_specific_device_table[snd_device] != NULL)
14762f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        return get_operator_specific_device_acdb_id(snd_device);
14772f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    else
14782f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        return acdb_device_table[snd_device];
147963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda}
148063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
1481b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_send_audio_calibration(void *platform, snd_device_t snd_device)
1482b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1483b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1484b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int acdb_dev_id, acdb_dev_type;
1485b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1486adf0f3b3b518e98fc1056e2788dd936e87331fb1Ravi Kumar Alamanda    acdb_dev_id = acdb_device_table[audio_extn_get_spkr_prot_snd_device(snd_device)];
1487b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (acdb_dev_id < 0) {
1488b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not find acdb id for device(%d)",
1489b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, snd_device);
1490b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
1491b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1492b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_send_audio_cal) {
1493188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato        ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
1494b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, snd_device, acdb_dev_id);
1495b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device >= SND_DEVICE_OUT_BEGIN &&
1496b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device < SND_DEVICE_OUT_END)
1497b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            acdb_dev_type = ACDB_DEV_TYPE_OUT;
1498b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
1499b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            acdb_dev_type = ACDB_DEV_TYPE_IN;
1500b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type);
1501b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1502b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
1503b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1504b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1505b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_pre(void *platform)
1506b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
150783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
150883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
150983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
151083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL &&
1511b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda        voice_is_in_call(my_data->adev)) {
151283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        /* This must be called before disabling mixer controls on APQ side */
151383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->disable_device();
151483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
151583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_client_disable_device, failed, error %d",
151683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, ret);
151783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
151883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
151983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
152083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
152183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
152283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_enable_device_config(void *platform,
152383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    snd_device_t out_snd_device,
152483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    snd_device_t in_snd_device)
152583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
152683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
152783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int acdb_rx_id, acdb_tx_id;
152883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
152983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
153083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd == NULL)
153183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        return ret;
153283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
153363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
153463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        audio_extn_spkr_prot_is_enabled())
15352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED);
153663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    else
15372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device);
153883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
15392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device);
154083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
154183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (acdb_rx_id > 0 && acdb_tx_id > 0) {
154283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
154383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
154483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_enable_device_config, failed, error %d",
154583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, ret);
154683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
154783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
154883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
154983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda              acdb_rx_id, acdb_tx_id);
155083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
155183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
155283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1553b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1554b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1555b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_post(void *platform,
1556b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                           snd_device_t out_snd_device,
1557b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                           snd_device_t in_snd_device)
1558b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1559b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1560b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int acdb_rx_id, acdb_tx_id;
1561b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1562b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_send_voice_cal == NULL) {
1563b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
1564b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
156563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
156663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda            audio_extn_spkr_prot_is_enabled())
156763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda            out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
156863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
15692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device);
15702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device);
1571b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1572b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (acdb_rx_id > 0 && acdb_tx_id > 0)
1573b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
1574b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
1575b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
1576b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                  acdb_rx_id, acdb_tx_id);
1577b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1578b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1579b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
1580b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1581b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
158283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_usecase_route_post(void *platform,
158383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                  snd_device_t out_snd_device,
158483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                  snd_device_t in_snd_device)
158583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
158683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
158783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int acdb_rx_id, acdb_tx_id;
158883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
158983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
159083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd == NULL)
159183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        return ret;
159283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
159363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
159463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        audio_extn_spkr_prot_is_enabled())
15952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
159663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    else
15972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device);
159883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
15992f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device);
160083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
160183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (acdb_rx_id > 0 && acdb_tx_id > 0) {
160283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
160383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                          my_data->adev->acdb_settings);
160483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
160583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret);
160683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
160783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
160883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
160983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda              acdb_rx_id, acdb_tx_id);
161083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
161183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
161283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
161383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
161483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
16154b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_start_voice_call(void *platform, uint32_t vsid)
1616b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
161783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
161883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
161983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
162083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
16214b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->start_voice(vsid);
162283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
162383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
162483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
162583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
162683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1627b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1628b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
16294b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_voice_call(void *platform, uint32_t vsid)
1630b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
163183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
163283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
163383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
163483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
16354b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->stop_voice(vsid);
163683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
163783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
163883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
163983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
164083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1641b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1642b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
16434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_get_sample_rate(void *platform, uint32_t *rate)
16444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
16454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
16464b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
16474b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
16484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
16494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->get_sample_rate(rate);
16504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
16514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_get_sample_rate error %d\n", __func__, ret);
16524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
16534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
16544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
16554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
16564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
1657b65064161c19b4c688f8a436ed002264d9f49055vivek mehtavoid platform_set_speaker_gain_in_combo(struct audio_device *adev,
1658b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                                        snd_device_t snd_device,
1659b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                                        bool enable)
1660b65064161c19b4c688f8a436ed002264d9f49055vivek mehta{
1661b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    const char* name;
1662b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    switch (snd_device) {
1663b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES:
1664b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1665b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-gain-in-headphone-combo";
1666b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1667b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-gain-default";
1668b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1669b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_AND_LINE:
1670b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1671b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-gain-in-line-combo";
1672b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1673b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-gain-default";
1674b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1675b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES:
1676b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1677b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-safe-gain-in-headphone-combo";
1678b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1679b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-safe-gain-default";
1680b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1681b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE:
1682b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1683b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-safe-gain-in-line-combo";
1684b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1685b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-safe-gain-default";
1686b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1687b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        default:
1688b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            return;
1689b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    }
1690b65064161c19b4c688f8a436ed002264d9f49055vivek mehta
1691b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    audio_route_apply_and_update_path(adev->audio_route, name);
1692b65064161c19b4c688f8a436ed002264d9f49055vivek mehta}
1693b65064161c19b4c688f8a436ed002264d9f49055vivek mehta
1694b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_voice_volume(void *platform, int volume)
1695b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1696b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1697b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1698b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
169953b2cf0c72aa18a5848919e2309731af652e84f9sangwoo    const char *mixer_ctl_name = "Voice Rx Gain";
17004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int vol_index = 0, ret = 0;
17014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    uint32_t set_values[ ] = {0,
17024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              ALL_SESSION_VSID,
17034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              DEFAULT_VOLUME_RAMP_DURATION_MS};
1704b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1705b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // Voice volume levels are mapped to adsp volume levels as follows.
1706b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1  0 -> 0
1707b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // But this values don't changed in kernel. So, below change is need.
1708c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, my_data->max_vol_index);
17094b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    set_values[0] = vol_index;
1710b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1711b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1712b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
1713b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
1714b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
1715b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
1716b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
17174b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ALOGV("Setting voice volume index: %d", set_values[0]);
17184b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
17194b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
172083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
172183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->volume(ALL_SESSION_VSID, volume,
172283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                   DEFAULT_VOLUME_RAMP_DURATION_MS);
172383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
172483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_volume error %d", __func__, ret);
172583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
172683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
172783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1728b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1729b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1730b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_mic_mute(void *platform, bool state)
1731b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1732b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1733b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1734b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
1735b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "Voice Tx Mute";
173653b2cf0c72aa18a5848919e2309731af652e84f9sangwoo    int ret = 0;
17374b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    uint32_t set_values[ ] = {0,
17384b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              ALL_SESSION_VSID,
17394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              DEFAULT_MUTE_RAMP_DURATION_MS};
1740cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
1741a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti    if (adev->mode != AUDIO_MODE_IN_CALL &&
1742a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti        adev->mode != AUDIO_MODE_IN_COMMUNICATION)
17434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return 0;
17444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
1745a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti    if (adev->enable_hfp)
1746a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti        mixer_ctl_name = "HFP Tx Mute";
1747a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti
17484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    set_values[0] = state;
17494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
17504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!ctl) {
17514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Could not get ctl for mixer cmd - %s",
17524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava              __func__, mixer_ctl_name);
17534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
17544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
17554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ALOGV("Setting voice mute state: %d", state);
17564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
17574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
17584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
17594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state,
17604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                     DEFAULT_MUTE_RAMP_DURATION_MS);
1761a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        if (ret < 0) {
17624b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_mic_mute error %d", __func__, ret);
176353b2cf0c72aa18a5848919e2309731af652e84f9sangwoo        }
1764cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George    }
17654b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
17664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
1767cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
17684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_set_device_mute(void *platform, bool state, char *dir)
17694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
17704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
17714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct audio_device *adev = my_data->adev;
17724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct mixer_ctl *ctl;
17734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    char *mixer_ctl_name = NULL;
17744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
17754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    uint32_t set_values[ ] = {0,
17764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              ALL_SESSION_VSID,
17774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              0};
17784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if(dir == NULL) {
17794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Invalid direction:%s", __func__, dir);
17804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
17814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
17824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
17834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!strncmp("rx", dir, sizeof("rx"))) {
17844b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        mixer_ctl_name = "Voice Rx Device Mute";
17854b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    } else if (!strncmp("tx", dir, sizeof("tx"))) {
17864b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        mixer_ctl_name = "Voice Tx Device Mute";
17874b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    } else {
17884b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
17894b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
17904b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
17914b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    set_values[0] = state;
17924b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
17934b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!ctl) {
17944b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Could not get ctl for mixer cmd - %s",
17954b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava              __func__, mixer_ctl_name);
17964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
17974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
17984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
17994b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s",
18004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava          __func__,state, mixer_ctl_name);
18014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
18024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
18034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
1804b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1805b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1806b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandabool platform_can_split_snd_device(snd_device_t snd_device,
1807b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                                   int *num_devices,
1808b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                                   snd_device_t *new_snd_devices)
1809b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda{
1810b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    bool status = false;
1811b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1812b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (NULL == num_devices || NULL == new_snd_devices) {
1813b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGE("%s: NULL pointer ..", __func__);
1814b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        return false;
1815b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1816b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1817b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    /*
1818b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda     * If wired headset/headphones/line devices share the same backend
1819b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda     * with speaker/earpiece this routine returns false.
1820b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda     */
1821b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES &&
1822b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES)) {
1823b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        *num_devices = 2;
1824b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
1825b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
1826b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        status = true;
1827b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_LINE &&
1828b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_LINE)) {
1829b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        *num_devices = 2;
1830b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
1831b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_LINE;
1832b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        status = true;
18333b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES &&
18343b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE, SND_DEVICE_OUT_HEADPHONES)) {
18353b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        *num_devices = 2;
18363b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE;
18373b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
18383b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        status = true;
18393b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE &&
18403b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE, SND_DEVICE_OUT_LINE)) {
18413b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        *num_devices = 2;
18423b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE;
18433b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_LINE;
18443b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        status = true;
1845b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1846b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    return status;
1847b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda}
1848b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1849b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices)
1850b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1851b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1852b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1853b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_mode_t mode = adev->mode;
1854b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
1855b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1856b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: enter: output devices(%#x)", __func__, devices);
1857b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (devices == AUDIO_DEVICE_NONE ||
1858b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        devices & AUDIO_DEVICE_BIT_IN) {
1859b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
1860b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
1861b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1862b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
18631b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    if (popcount(devices) == 2) {
18641b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
18651b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                        AUDIO_DEVICE_OUT_SPEAKER) ||
18661b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
18671b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                            AUDIO_DEVICE_OUT_SPEAKER)) {
18681b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
18691b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_LINE |
18701b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER)) {
18711b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_LINE;
18721b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
18731b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER_SAFE) ||
18741b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                   devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
18751b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
18761b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES;
18771b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_LINE |
18781b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
18791b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE;
18801b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
18811b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER)) {
18821b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
18831b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else {
18841b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
18851b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            goto exit;
18861b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        }
18871b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        if (snd_device != SND_DEVICE_NONE) {
18881b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            goto exit;
18891b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        }
18901b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    }
18911b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent
18921b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    if (popcount(devices) != 1) {
18931b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
18941b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        goto exit;
18951b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    }
18961b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent
1897b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda    if (voice_is_in_call(adev) || adev->enable_voicerx) {
1898b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
189909f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent            devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
190009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent            devices & AUDIO_DEVICE_OUT_LINE) {
1901b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda            if (voice_is_in_call(adev) &&
1902cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                (adev->voice.tty_mode == TTY_MODE_FULL))
1903b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
1904b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda            else if (voice_is_in_call(adev) &&
1905cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                (adev->voice.tty_mode == TTY_MODE_VCO))
1906b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
1907b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda            else if (voice_is_in_call(adev) &&
1908cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                (adev->voice.tty_mode == TTY_MODE_HCO))
1909b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
191009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent            else {
191109f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                if (devices & AUDIO_DEVICE_OUT_LINE)
191209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                    snd_device = SND_DEVICE_OUT_VOICE_LINE;
191309f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                else
191409f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                    snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
191509f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                }
1916b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
19179f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
19189f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_OUT_BT_SCO_WB;
19199f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
19209f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_OUT_BT_SCO;
19219f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
19221b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent        } else if (devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
19237629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti            if (!adev->enable_hfp) {
19247629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
19257629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti            } else {
19267629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_HFP;
19277629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti            }
1928b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
19299d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            if(adev->voice.hac)
19309d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET;
19319d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            else if (is_operator_tmus())
1932b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HANDSET_TMUS;
1933b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            else
1934b4d368e0fe6006657ebc4e1f9ba01a072c4ca2c7Eric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
193599c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda        } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX)
193699c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_VOICE_TX;
193799c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
1938b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device != SND_DEVICE_NONE) {
1939b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            goto exit;
1940b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1941b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1942b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1943b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
1944b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
1945b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HEADPHONES;
194609f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_LINE) {
194709f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent        snd_device = SND_DEVICE_OUT_LINE;
19481b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    } else if (devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) {
19491b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent        snd_device = SND_DEVICE_OUT_SPEAKER_SAFE;
1950b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
19511f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        if (my_data->speaker_lr_swap)
1952b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
1953b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
1954b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER;
1955b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
19569f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        if (adev->bt_wb_speech_enabled) {
19579f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_BT_SCO_WB;
19589f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        } else {
19599f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_BT_SCO;
19609f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        }
1961b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
1962b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HDMI ;
1963b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
19649d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent        /*HAC support for voice-ish audio (eg visual voicemail)*/
19659d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent        if(adev->voice.hac)
19669d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET;
19679d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent        else
19689d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            snd_device = SND_DEVICE_OUT_HANDSET;
1969b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
1970b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Unknown device(s) %#x", __func__, devices);
1971b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1972b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit:
1973b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
1974b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return snd_device;
1975b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1976b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1977b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
1978b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1979b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1980b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1981b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_source_t  source = (adev->active_input == NULL) ?
1982b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                AUDIO_SOURCE_DEFAULT : adev->active_input->source;
1983b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1984b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_mode_t    mode   = adev->mode;
1985b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_devices_t in_device = ((adev->active_input == NULL) ?
1986b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                    AUDIO_DEVICE_NONE : adev->active_input->device)
1987b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                & ~AUDIO_DEVICE_BIT_IN;
1988b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
1989b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
1990b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
19913ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    int channel_count = popcount(channel_mask);
1992b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1993c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
1994c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          __func__, out_device, in_device, channel_count, channel_mask);
1995b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda    if ((out_device != AUDIO_DEVICE_NONE) && voice_is_in_call(adev)) {
19964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (adev->voice.tty_mode != TTY_MODE_OFF) {
1997b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
199809f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
199909f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                out_device & AUDIO_DEVICE_OUT_LINE) {
20004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                switch (adev->voice.tty_mode) {
2001b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                case TTY_MODE_FULL:
2002b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
2003b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    break;
2004b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                case TTY_MODE_VCO:
2005b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
2006b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    break;
2007b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                case TTY_MODE_HCO:
2008b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
2009b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                    break;
2010b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                default:
20114b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                    ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
2012b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                }
2013b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                goto exit;
2014b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2015b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2016b991fb007d870cbd682273e5fc7413b9d238a6d9Eric Laurent        if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
2017b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (my_data->fluence_in_voice_call == false) {
2018b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_HANDSET_MIC;
2019b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else {
20203ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (is_operator_tmus())
20213ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_DMIC_TMUS;
2022b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                else
20233ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_DMIC;
2024b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2025b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
2026b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
2027b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
20289f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
2029e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2030e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2031e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2032e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
20339f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
2034e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2035e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2036e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2037e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC;
20389f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
2039b991fb007d870cbd682273e5fc7413b9d238a6d9Eric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER ||
2040c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE ||
2041c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
2042c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   out_device & AUDIO_DEVICE_OUT_LINE) {
2043c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode) {
2044c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                if (my_data->source_mic_type & SOURCE_DUAL_MIC) {
2045c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
2046c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                } else {
2047c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
2048c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                }
2049b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2050fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta
2051fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta            //select default
2052fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta            if (snd_device == SND_DEVICE_NONE) {
20537629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                if (!adev->enable_hfp) {
20547629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
20557629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                } else {
20567629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
20577629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                    platform_set_echo_reference(adev, true, out_device);
20587629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                }
2059fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta            }
2060c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX) {
206199c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda            snd_device = SND_DEVICE_IN_VOICE_RX;
2062c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        }
2063b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_CAMCORDER) {
2064b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
2065b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            in_device & AUDIO_DEVICE_IN_BACK_MIC) {
2066b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
2067b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2068b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
2069b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
2070c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if (my_data->fluence_in_voice_rec && channel_count == 1) {
2071c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) &&
2072c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
2073733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    if (adev->active_input->enable_aec)
2074733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_QMIC_AEC;
2075733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    else
2076733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_QMIC;
2077c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                } else if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) &&
2078c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->source_mic_type & SOURCE_THREE_MIC)) {
2079733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    if (adev->active_input->enable_aec)
2080733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC;
2081733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    else
2082733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_TMIC;
2083c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                } else if (((my_data->fluence_type == FLUENCE_PRO_ENABLE) ||
2084c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->fluence_type == FLUENCE_ENABLE)) &&
2085c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
2086733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    if (adev->active_input->enable_aec)
2087733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
2088733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    else
2089733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
2090c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                }
2091c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                platform_set_echo_reference(adev, true, out_device);
2092c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) &&
2093c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
2094c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
2095c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) &&
2096c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (my_data->source_mic_type & SOURCE_THREE_MIC)) {
2097c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_THREE_MIC;
2098c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) &&
2099c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
2100c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_QUAD_MIC;
2101b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2102b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (snd_device == SND_DEVICE_NONE) {
21033ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (adev->active_input->enable_ns)
21043ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
2105733c1df5828d63f547553b4a441668905306a4e2vivek mehta                else if (adev->active_input->enable_aec) {
2106733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    snd_device = SND_DEVICE_IN_VOICE_REC_MIC_AEC;
2107733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    platform_set_echo_reference(adev, true, out_device);
2108733c1df5828d63f547553b4a441668905306a4e2vivek mehta               } else
21093ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
2110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
21118c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
21128c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi            snd_device = SND_DEVICE_IN_VOICE_REC_HEADSET_MIC;
2113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
211490fb96106e9e2db75e214722c797d013e10e5328rago    } else if (source == AUDIO_SOURCE_UNPROCESSED) {
211590fb96106e9e2db75e214722c797d013e10e5328rago        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
21164ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
21174ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
21184ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                       (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21194ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
21204ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) &&
21214ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                       (my_data->source_mic_type & SOURCE_THREE_MIC)) {
21224ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
21234ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            } else if (((int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) &&
21244ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                       (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
21254ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
21264ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            } else {
21274ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
21284ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            }
212990fb96106e9e2db75e214722c797d013e10e5328rago        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
213090fb96106e9e2db75e214722c797d013e10e5328rago            snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
213190fb96106e9e2db75e214722c797d013e10e5328rago        }
213250a38ed90672924763c4cb18773fca64588faeccEric Laurent    } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
213390fb96106e9e2db75e214722c797d013e10e5328rago               mode == AUDIO_MODE_IN_COMMUNICATION) {
21341b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent        if (out_device & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE))
2135b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            in_device = AUDIO_DEVICE_IN_BACK_MIC;
2136b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (adev->active_input) {
21373ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            if (adev->active_input->enable_aec &&
21383ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    adev->active_input->enable_ns) {
21393ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
21403ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_spkr_mode &&
21413ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                            my_data->fluence_in_voice_comm &&
2142c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21433ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
2144c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
21453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
2146c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
21473ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
21483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_voice_comm &&
2149c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
2151c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
21523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
2153c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
2154cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2155cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                    snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC;
21563ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                }
2157cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                platform_set_echo_reference(adev, true, out_device);
21583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            } else if (adev->active_input->enable_aec) {
2159b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
21603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_spkr_mode &&
21613ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                            my_data->fluence_in_voice_comm &&
2162c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21633ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
2164c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
21653ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
2166c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
2167b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
21683ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_voice_comm &&
2169c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21703ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
2171c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
21723ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
2173c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
2174cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent               } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2175cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                   snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC;
2176cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent               }
2177f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda               platform_set_echo_reference(adev, true, out_device);
21783ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            } else if (adev->active_input->enable_ns) {
21793ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
21803ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_spkr_mode &&
21813ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                            my_data->fluence_in_voice_comm &&
2182c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21833ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
2184c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
21853ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
2186c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
21873ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
21883ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_voice_comm &&
2189c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
21903ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
2191c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
21923ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
2193c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
21943ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                }
2195cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent            }
2196b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2197b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_DEFAULT) {
2198b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
2199b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2200b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2201b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (snd_device != SND_DEVICE_NONE) {
2203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
2204b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2205b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (in_device != AUDIO_DEVICE_NONE &&
2207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
2208b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
2209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
2210c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if ((my_data->source_mic_type & SOURCE_QUAD_MIC) &&
2211c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                (int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) {
2212c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_QUAD_MIC;
2213c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_THREE_MIC) &&
2214c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (int)channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) {
2215c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_THREE_MIC;
2216c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
2217c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       channel_count == 2) {
22183ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_HANDSET_DMIC_STEREO;
2219c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
2220c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       channel_count == 1) {
2221dae4471837fcdbd9356e3745b66f23f921fb531bvivek mehta                snd_device = SND_DEVICE_IN_HANDSET_MIC;
2222c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else {
2223c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                ALOGE("%s: something wrong (1): source type (%d) channel_count (%d) .."
2224c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                      " channel mask (0x%x) no combination found .. setting to mono", __func__,
2225c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       my_data->source_mic_type, channel_count, channel_mask);
2226c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_HANDSET_MIC;
2227c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            }
2228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
2229c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
2230c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    channel_count == 2) {
22313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_DMIC_STEREO;
2232c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
2233c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    channel_count == 1) {
2234c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2235c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else {
2236c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                ALOGE("%s: something wrong (2): source type (%d) channel_count (%d) .."
2237c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                      " no combination found .. setting to mono", __func__,
2238c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       my_data->source_mic_type, channel_count);
22393ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2240c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            }
2241b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2242b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HEADSET_MIC;
2243b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
22449f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
2245e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2246e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2247e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2248e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
22499f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
2250e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2251e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2252e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2253e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC;
22549f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
2255b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
2256b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HDMI_MIC;
2257b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
2258b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
2259b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGW("%s: Using default handset-mic", __func__);
2260b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
2261b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2262b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
2263b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
2264b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
2265b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
2266b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HEADSET_MIC;
22673ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER ||
22681b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent                   out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE ||
22693ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                   out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
227009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                   out_device & AUDIO_DEVICE_OUT_LINE) {
2271c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
2272c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    channel_count == 2) {
22733ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_DMIC_STEREO;
2274c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
2275c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                          channel_count == 1) {
2276c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2277c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else {
2278c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                ALOGE("%s: something wrong (3): source type (%d) channel_count (%d) .."
2279c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                      " no combination found .. setting to mono", __func__,
2280c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       my_data->source_mic_type, channel_count);
22813ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2282c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            }
2283b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
22849f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
2285e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2286e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2287e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2288e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
22899f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
2290e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2291e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2292e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2293e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC;
22949f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
2295b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2296b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HDMI_MIC;
2297b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
2298b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
2299b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGW("%s: Using default handset-mic", __func__);
2300b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
2301b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2302b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2303b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit:
2304b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
2305b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return snd_device;
2306b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
2307b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2308b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_hdmi_channels(void *platform,  int channel_count)
2309b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
2310b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
2311b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
2312b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
2313b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *channel_cnt_str = NULL;
2314b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "HDMI_RX Channels";
2315b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    switch (channel_count) {
2316b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 8:
2317b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Eight"; break;
2318b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 7:
2319b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Seven"; break;
2320b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 6:
2321b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Six"; break;
2322b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 5:
2323b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Five"; break;
2324b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 4:
2325b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Four"; break;
2326b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 3:
2327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Three"; break;
2328b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    default:
2329b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Two"; break;
2330b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2331b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2332b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
2333b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
2334b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
2335b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
2336b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2337b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("HDMI channel count: %s", channel_cnt_str);
2338b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
2339b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
2340b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
2341b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
234247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew Georgeint platform_edid_get_max_channels(void *platform)
2343b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
234447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct platform_data *my_data = (struct platform_data *)platform;
234547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct audio_device *adev = my_data->adev;
2346b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
2347b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char *sad = block;
2348b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int num_audio_blocks;
2349b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int channel_count;
2350b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int max_channels = 0;
235147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    int i, ret, count;
2352b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
235347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct mixer_ctl *ctl;
235447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George
235547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL);
235647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (!ctl) {
235747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        ALOGE("%s: Could not get ctl for mixer cmd - %s",
235847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George              __func__, AUDIO_DATA_BLOCK_MIXER_CTL);
2359b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return 0;
2360b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2361b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
236247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    mixer_ctl_update(ctl);
236347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George
236447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    count = mixer_ctl_get_num_values(ctl);
2365b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2366b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Read SAD blocks, clamping the maximum size for safety */
236747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (count > (int)sizeof(block))
236847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        count = (int)sizeof(block);
2369b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
237047cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    ret = mixer_ctl_get_array(ctl, block, count);
237147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (ret != 0) {
237247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
237347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        return 0;
237447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    }
2375b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Calculate the number of SAD blocks */
237747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    num_audio_blocks = count / SAD_BLOCK_SIZE;
2378b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2379b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    for (i = 0; i < num_audio_blocks; i++) {
2380b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        /* Only consider LPCM blocks */
238147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        if ((sad[0] >> 3) != EDID_FORMAT_LPCM) {
238247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George            sad += 3;
2383b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            continue;
238447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        }
2385b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2386b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_count = (sad[0] & 0x7) + 1;
2387b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (channel_count > max_channels)
2388b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            max_channels = channel_count;
2389b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2390b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        /* Advance to next block */
2391b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        sad += 3;
2392b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2393b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2394b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return max_channels;
2395b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
23967ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George
23974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_set_incall_recording_session_id(void *platform,
23984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                             uint32_t session_id, int rec_mode)
23994b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
24004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
24014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
24024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct audio_device *adev = my_data->adev;
24034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct mixer_ctl *ctl;
24044b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    const char *mixer_ctl_name = "Voc VSID";
24054b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int num_ctl_values;
24064b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int i;
24074b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24084b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
24094b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!ctl) {
24104b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Could not get ctl for mixer cmd - %s",
24114b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava              __func__, mixer_ctl_name);
24124b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = -EINVAL;
24134b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    } else {
24144b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        num_ctl_values = mixer_ctl_get_num_values(ctl);
24154b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        for (i = 0; i < num_ctl_values; i++) {
24164b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            if (mixer_ctl_set_value(ctl, i, session_id)) {
24174b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                ALOGV("Error: invalid session_id: %x", session_id);
24184b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                ret = -EINVAL;
24194b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                break;
24204b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            }
24214b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
24224b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
24234b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24244b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
24254b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
24264b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
24274b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_start_record failed, error %d",
24284b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
24294b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
24304b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
24314b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24324b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
24334b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
24344b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24354b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_incall_recording_usecase(void *platform)
24364b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
24374b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
24384b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
24394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24404b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
24414b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->stop_record(ALL_SESSION_VSID);
24424b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
24434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_stop_record failed, error %d",
24444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
24454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
24464b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
24474b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
24494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
24504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_start_incall_music_usecase(void *platform)
24524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
24534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
24544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
24554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
24574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->start_playback(ALL_SESSION_VSID);
24584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
24594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_start_playback failed, error %d",
24604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
24614b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
24624b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
24634b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24644b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
24654b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
24664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_incall_music_usecase(void *platform)
24684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
24694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
24704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
24714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
24734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
24744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
24754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_stop_playback failed, error %d",
24764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
24774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
24784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
24794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
24804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
24814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
24824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2483c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandaint platform_set_parameters(void *platform, struct str_parms *parms)
2484c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda{
2485c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
24862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char value[128];
2487c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    char *kv_pairs = str_parms_to_str(parms);
2488c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    int ret = 0, err;
2489c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2490c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (kv_pairs == NULL) {
2491c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        ret = -EINVAL;
2492c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        ALOGE("%s: key-value pair is NULL",__func__);
2493c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        goto done;
2494c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    }
2495c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2496c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    ALOGV("%s: enter: %s", __func__, kv_pairs);
2497c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2498c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_SOUNDCARD_NAME,
2499c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda                            value, sizeof(value));
2500c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (err >= 0) {
2501c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        str_parms_del(parms, PLATFORM_CONFIG_KEY_SOUNDCARD_NAME);
2502c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        my_data->snd_card_name = strdup(value);
2503c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        ALOGV("%s: sound card name %s", __func__, my_data->snd_card_name);
2504c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    }
2505c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
25062f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_OPERATOR_INFO,
25072f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                            value, sizeof(value));
25082f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (err >= 0) {
25092f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        struct operator_info *info;
25102f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        char *str = value;
25112f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        char *name;
25122f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
25132f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        str_parms_del(parms, PLATFORM_CONFIG_KEY_OPERATOR_INFO);
25142f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info = (struct operator_info *)calloc(1, sizeof(struct operator_info));
25152f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        name = strtok(str, ";");
25162f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info->name = strdup(name);
25172f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info->mccmnc = strdup(str + strlen(name) + 1);
25182f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
25192f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        list_add_tail(&operator_info_list, &info->list);
2520188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato        ALOGV("%s: add operator[%s] mccmnc[%s]", __func__, info->name, info->mccmnc);
25212f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
2522c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
2523c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    memset(value, 0, sizeof(value));
2524c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent    err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_MAX_MIC_COUNT,
2525c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            value, sizeof(value));
2526c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    if (err >= 0) {
2527c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent        str_parms_del(parms, PLATFORM_CONFIG_KEY_MAX_MIC_COUNT);
2528c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->max_mic_count = atoi(value);
2529c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        ALOGV("%s: max_mic_count %s/%d", __func__, value, my_data->max_mic_count);
2530c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    }
2531c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
2532c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandadone:
2533c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    ALOGV("%s: exit with code(%d)", __func__, ret);
2534c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (kv_pairs != NULL)
2535c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        free(kv_pairs);
2536c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2537c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    return ret;
2538c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda}
2539c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
25407ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George/* Delay in Us */
25417ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew Georgeint64_t platform_render_latency(audio_usecase_t usecase)
25427ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George{
25437ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George    switch (usecase) {
25447ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
25457ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return DEEP_BUFFER_PLATFORM_DELAY;
25467ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
25477ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return LOW_LATENCY_PLATFORM_DELAY;
25487ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        default:
25497ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return 0;
25507ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George    }
25517ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George}
255298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
25534ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehtabool platform_check_and_set_capture_backend_cfg(struct audio_device* adev,
25544ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta         struct audio_usecase *usecase, snd_device_t snd_device)
25554ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta{
25564ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    enum pcm_format  in_pcm_format = PCM_FORMAT_S16_LE;
25574ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta
25584ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    if (adev && adev->active_input)
25594ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta        in_pcm_format = adev->active_input->config.format;
25604ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta
25614ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    // allow 24 bit recording only if voice call is not active
25624ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    if (!voice_is_in_call(adev) &&
25634ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta        adev->mode != AUDIO_MODE_IN_COMMUNICATION &&
25644ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta        in_pcm_format == PCM_FORMAT_S24_LE) {
25654ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta        audio_route_apply_and_update_path(adev->audio_route, "set-capture-format-24le");
25664ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    } else {
25674ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta        audio_route_apply_and_update_path(adev->audio_route, "set-capture-format-default");
25684ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    }
25694ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta
25704ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    return true;
25714ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta}
25724ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta
2573b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandaint platform_set_snd_device_backend(snd_device_t device, const char *backend_tag,
2574b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                                    const char * hw_interface)
257598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
257698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int ret = 0;
257798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
257898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
257998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: Invalid snd_device = %d",
258098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George            __func__, device);
258198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -EINVAL;
258298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        goto done;
258398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
258498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
2585b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: backend_tag_table[%s]: old = %s new = %s", __func__,
2586b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda          platform_get_snd_device_name(device),
2587b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda          backend_tag_table[device] != NULL ? backend_tag_table[device]: "null", backend_tag);
2588b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (backend_tag_table[device]) {
2589b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        free(backend_tag_table[device]);
2590b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
2591b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[device] = strdup(backend_tag);
2592b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
2593b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (hw_interface != NULL) {
2594b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        if (hw_interface_table[device])
2595b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda            free(hw_interface_table[device]);
2596b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGV("%s: hw_interface_table[%d] = %s", __func__, device, hw_interface);
2597b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        hw_interface_table[device] = strdup(hw_interface);
259898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
259998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone:
260098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return ret;
260198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
260298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
260398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id)
260498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
260598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int ret = 0;
260698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((usecase <= USECASE_INVALID) || (usecase >= AUDIO_USECASE_MAX)) {
260798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: invalid usecase case idx %d", __func__, usecase);
260898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -EINVAL;
260998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        goto done;
261098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
261198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
261298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((type != 0) && (type != 1)) {
261398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: invalid usecase type", __func__);
261498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -EINVAL;
261598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
2616b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: pcm_device_table[%d][%d] = %d", __func__, usecase, type, pcm_id);
261798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    pcm_device_table[usecase][type] = pcm_id;
261898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone:
261998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return ret;
262098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
26211f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
262288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi#define DEFAULT_NOMINAL_SPEAKER_GAIN 20
262388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Triviint ramp_speaker_gain(struct audio_device *adev, bool ramp_up, int target_ramp_up_gain) {
262488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    // backup_gain: gain to try to set in case of an error during ramp
262588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    int start_gain, end_gain, step, backup_gain, i;
262688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    bool error = false;
262788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    const struct mixer_ctl *ctl;
262888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    const char *mixer_ctl_name_gain_left = "Left Speaker Gain";
262988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    const char *mixer_ctl_name_gain_right = "Right Speaker Gain";
263088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    struct mixer_ctl *ctl_left = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_left);
263188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    struct mixer_ctl *ctl_right = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_right);
263288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    if (!ctl_left || !ctl_right) {
263388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        ALOGE("%s: Could not get ctl for mixer cmd - %s or %s, not applying speaker gain ramp",
263488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                      __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
263588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        return -EINVAL;
263688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    } else if ((mixer_ctl_get_num_values(ctl_left) != 1)
263788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            || (mixer_ctl_get_num_values(ctl_right) != 1)) {
263888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        ALOGE("%s: Unexpected num values for mixer cmd - %s or %s, not applying speaker gain ramp",
263988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                              __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
264088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        return -EINVAL;
264188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
264288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    if (ramp_up) {
264388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        start_gain = 0;
264488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        end_gain = target_ramp_up_gain > 0 ? target_ramp_up_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
264588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        step = +1;
264688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        backup_gain = end_gain;
264788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    } else {
264888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        // using same gain on left and right
264988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        const int left_gain = mixer_ctl_get_value(ctl_left, 0);
265088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        start_gain = left_gain > 0 ? left_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
265188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        end_gain = 0;
265288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        step = -1;
265388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        backup_gain = start_gain;
265488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
265588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    for (i = start_gain ; i != (end_gain + step) ; i += step) {
265688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        //ALOGV("setting speaker gain to %d", i);
265788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_left, 0, i)) {
265888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error setting %s to %d during gain ramp",
265988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    __func__, mixer_ctl_name_gain_left, i);
266088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            error = true;
266188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            break;
266288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
266388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_right, 0, i)) {
266488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error setting %s to %d during gain ramp",
266588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    __func__, mixer_ctl_name_gain_right, i);
266688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            error = true;
266788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            break;
266888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
266988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        usleep(1000);
267088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
267188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    if (error) {
267288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        // an error occured during the ramp, let's still try to go back to a safe volume
267388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_left, 0, backup_gain)) {
267488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error restoring left gain to %d", __func__, backup_gain);
267588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
267688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_right, 0, backup_gain)) {
267788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error restoring right gain to %d", __func__, backup_gain);
267888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
267988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
268088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    return start_gain;
268188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi}
268288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi
26831f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamandaint platform_swap_lr_channels(struct audio_device *adev, bool swap_channels)
26841f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda{
26851f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    // only update if there is active pcm playback on speaker
26861f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    struct audio_usecase *usecase;
26871f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    struct listnode *node;
26881f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)adev->platform;
26891f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
26901f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    if (my_data->speaker_lr_swap != swap_channels) {
26911f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        my_data->speaker_lr_swap = swap_channels;
26921f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
26931f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        list_for_each(node, &adev->usecase_list) {
26941f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda            usecase = node_to_item(node, struct audio_usecase, list);
26951f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda            if (usecase->type == PCM_PLAYBACK &&
2696425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
2697425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                /*
2698425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 * If acdb tuning is different for SPEAKER_REVERSE, it is must
2699425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 * to perform device switch to disable the current backend to
2700425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 * enable it with new acdb data.
2701425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 */
2702425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                if (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
2703425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE]) {
270488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1);
2705425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    select_devices(adev, usecase->id);
270688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    if (initial_skpr_gain != -EINVAL) {
270788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                        ramp_speaker_gain(adev, true /*ramp_up*/, initial_skpr_gain);
270888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    }
27091f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda                } else {
2710425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    const char *mixer_path;
2711425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    if (swap_channels) {
2712425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER_REVERSE);
2713425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        audio_route_apply_and_update_path(adev->audio_route, mixer_path);
2714425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    } else {
2715425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER);
2716425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        audio_route_apply_and_update_path(adev->audio_route, mixer_path);
2717425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    }
27181f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda                }
27191f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda                break;
27201f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda            }
27211f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        }
27221f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    }
27231f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    return 0;
27241f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda}
2725