1b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/*
2a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta * Copyright (C) 2013-2017 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
31f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok#define MIXER_XML_DEFAULT_PATH "mixer_paths.xml"
32f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok#define MIXER_XML_BASE_STRING "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);
108c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew Georgetypedef int (*acdb_send_custom_top_t) (void);
109b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Audio calibration related functions */
111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstruct platform_data {
112b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev;
113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_spkr_mode;
114b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_voice_call;
1153ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    bool fluence_in_voice_comm;
116b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    bool fluence_in_voice_rec;
117c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    /* 0 = no fluence, 1 = fluence, 2 = fluence pro */
118c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    int  fluence_type;
119c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    int  source_mic_type;
1201f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    bool speaker_lr_swap;
1211f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
122b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    void *acdb_handle;
12392232b4965de9911bfc2e573b5ecb2cd07be0d74Thierry Strudel#if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996) || (PLATFORM_MSM8998)
124c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    acdb_init_v2_cvd_t acdb_init;
125c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George#elif defined (PLATFORM_MSM8084)
126c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    acdb_init_v2_t acdb_init;
127c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George#else
128c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    acdb_init_t acdb_init;
129c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George#endif
1303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    acdb_deallocate_t          acdb_deallocate;
1313ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    acdb_send_audio_cal_t      acdb_send_audio_cal;
1323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    acdb_send_voice_cal_t      acdb_send_voice_cal;
13383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    acdb_reload_vocvoltable_t  acdb_reload_vocvoltable;
1341a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    acdb_send_gain_dep_cal_t   acdb_send_gain_dep_cal;
135c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    acdb_send_custom_top_t     acdb_send_custom_top;
136c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    bool acdb_initialized;
137c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
13883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct csd_data *csd;
139f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    char ec_ref_mixer_path[64];
140c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
141ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    codec_backend_cfg_t current_backend_cfg[MAX_CODEC_BACKENDS];
142c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    char *snd_card_name;
143c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    int max_vol_index;
144c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    int max_mic_count;
145de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
146de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    void *hw_info;
147b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
148b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
14998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic int pcm_device_table[AUDIO_USECASE_MAX][2] = {
15083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_DEEP_BUFFER] = {DEEP_BUFFER_PCM_DEVICE,
15183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                            DEEP_BUFFER_PCM_DEVICE},
15283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
15383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                            LOWLATENCY_PCM_DEVICE},
15483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_MULTI_CH] = {MULTIMEDIA2_PCM_DEVICE,
15583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                         MULTIMEDIA2_PCM_DEVICE},
15683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_OFFLOAD] = {PLAYBACK_OFFLOAD_DEVICE,
15783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                        PLAYBACK_OFFLOAD_DEVICE},
1582bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_TTS] = {MULTIMEDIA2_PCM_DEVICE,
1592bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda                                        MULTIMEDIA2_PCM_DEVICE},
1602bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_ULL] = {MULTIMEDIA3_PCM_DEVICE,
1612bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda                                    MULTIMEDIA3_PCM_DEVICE},
1620e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent    [USECASE_AUDIO_PLAYBACK_MMAP] = {MMAP_PLAYBACK_PCM_DEVICE,
1630e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent            MMAP_PLAYBACK_PCM_DEVICE},
1642bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda
16583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD] = {AUDIO_RECORD_PCM_DEVICE,
16683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                              AUDIO_RECORD_PCM_DEVICE},
16783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD_LOW_LATENCY] = {LOWLATENCY_PCM_DEVICE,
16883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                          LOWLATENCY_PCM_DEVICE},
1692bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda
1700e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent    [USECASE_AUDIO_RECORD_MMAP] = {MMAP_RECORD_PCM_DEVICE,
1710e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent            MMAP_RECORD_PCM_DEVICE},
1720e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent
17383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [USECASE_VOICE_CALL] = {VOICE_CALL_PCM_DEVICE,
17483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                            VOICE_CALL_PCM_DEVICE},
1754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_VOICE2_CALL] = {VOICE2_CALL_PCM_DEVICE, VOICE2_CALL_PCM_DEVICE},
1764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_VOLTE_CALL] = {VOLTE_CALL_PCM_DEVICE, VOLTE_CALL_PCM_DEVICE},
1774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_QCHAT_CALL] = {QCHAT_CALL_PCM_DEVICE, QCHAT_CALL_PCM_DEVICE},
1784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_VOWLAN_CALL] = {VOWLAN_CALL_PCM_DEVICE, VOWLAN_CALL_PCM_DEVICE},
179a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta    [USECASE_VOICEMMODE1_CALL] = {VOICEMMODE1_CALL_PCM_DEVICE,
180a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta                                  VOICEMMODE1_CALL_PCM_DEVICE},
181a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta    [USECASE_VOICEMMODE2_CALL] = {VOICEMMODE2_CALL_PCM_DEVICE,
182a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta                                  VOICEMMODE2_CALL_PCM_DEVICE},
183a51fd4083112343fddcc294f850f2d5456f24fd4vivek mehta
1844b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_INCALL_REC_UPLINK] = {AUDIO_RECORD_PCM_DEVICE,
1854b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                   AUDIO_RECORD_PCM_DEVICE},
1864b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_INCALL_REC_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
1874b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                     AUDIO_RECORD_PCM_DEVICE},
1884b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    [USECASE_INCALL_REC_UPLINK_AND_DOWNLINK] = {AUDIO_RECORD_PCM_DEVICE,
1894b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                                AUDIO_RECORD_PCM_DEVICE},
1908e6e98fc5af6d6f79bc71eb37df470380ae82fadRavi Kumar Alamanda    [USECASE_AUDIO_HFP_SCO] = {HFP_PCM_RX, HFP_SCO_RX},
19199c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
19263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [USECASE_AUDIO_SPKR_CALIB_RX] = {SPKR_PROT_CALIB_RX_PCM_DEVICE, -1},
19363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [USECASE_AUDIO_SPKR_CALIB_TX] = {-1, SPKR_PROT_CALIB_TX_PCM_DEVICE},
19463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
19599c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [USECASE_AUDIO_PLAYBACK_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
19699c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda                                          AFE_PROXY_RECORD_PCM_DEVICE},
19799c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [USECASE_AUDIO_RECORD_AFE_PROXY] = {AFE_PROXY_PLAYBACK_PCM_DEVICE,
19899c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda                                        AFE_PROXY_RECORD_PCM_DEVICE},
1994211fad32ff21574a3935dbe28397c55a1895649zhaoyang yin    [USECASE_AUDIO_DSM_FEEDBACK] = {QUAT_MI2S_PCM_DEVICE, QUAT_MI2S_PCM_DEVICE},
20099c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
201b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
202b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* Array to store sound devices */
204b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic const char * const device_table[SND_DEVICE_MAX] = {
205b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_NONE] = "none",
206b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Playback sound devices */
207b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HANDSET] = "handset",
208b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER] = "speaker",
209b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_REVERSE] = "speaker-reverse",
2101b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    [SND_DEVICE_OUT_SPEAKER_SAFE] = "speaker-safe",
211b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HEADPHONES] = "headphones",
21209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    [SND_DEVICE_OUT_LINE] = "line",
213b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = "speaker-and-headphones",
2143b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = "speaker-safe-and-headphones",
215744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_LINE] = "speaker-and-line",
2163b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = "speaker-safe-and-line",
217b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET] = "voice-handset",
2189d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent    [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = "voice-hac-handset",
219b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_SPEAKER] = "voice-speaker",
220b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HEADPHONES] = "voice-headphones",
22109f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    [SND_DEVICE_OUT_VOICE_LINE] = "voice-line",
222b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HDMI] = "hdmi",
223b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = "speaker-and-hdmi",
224b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_BT_SCO] = "bt-sco-headset",
2259f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_OUT_BT_SCO_WB] = "bt-sco-headset-wb",
226b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = "voice-handset-tmus",
227b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = "voice-tty-full-headphones",
228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = "voice-tty-vco-headphones",
229b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = "voice-tty-hco-handset",
230a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = "voice-tty-full-usb",
231a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = "voice-tty-vco-usb",
23299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_TX] = "voice-tx",
233ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_OUT_USB_HEADSET] = "usb-headset",
234ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_OUT_USB_HEADPHONES] = "usb-headphones",
235ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = "speaker-and-usb-headphones",
23663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_PROTECTED] = "speaker-protected",
23763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = "voice-speaker-protected",
2387629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti    [SND_DEVICE_OUT_VOICE_SPEAKER_HFP] = "voice-speaker-hfp",
2396dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George    [SND_DEVICE_OUT_SPEAKER_AND_BT_SCO] = "speaker-and-bt-sco",
2406dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George    [SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB] = "speaker-and-bt-sco-wb",
241b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
242b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Capture sound devices */
243b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC] = "handset-mic",
2443ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC] = "handset-mic",
2453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_NS] = "handset-mic",
2463ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = "handset-mic",
2473ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC] = "dmic-endfire",
2483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC] = "dmic-endfire",
2493ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_NS] = "dmic-endfire",
2503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = "dmic-endfire",
2513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_STEREO] = "dmic-endfire",
2523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
253b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_SPEAKER_MIC] = "speaker-mic",
2543ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC] = "speaker-mic",
2553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_NS] = "speaker-mic",
2563ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = "speaker-mic",
2573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC] = "speaker-dmic-endfire",
2583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = "speaker-dmic-endfire",
2593ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_NS] = "speaker-dmic-endfire",
2603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = "speaker-dmic-endfire",
2613ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = "speaker-dmic-endfire",
2623ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
263b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HEADSET_MIC] = "headset-mic",
264cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    [SND_DEVICE_IN_HEADSET_MIC_AEC] = "headset-mic",
2653ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
266b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
267b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
268e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
2699f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
270e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = "bt-sco-mic-wb",
271b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_CAMCORDER_MIC] = "camcorder-mic",
2723ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
2733ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC] = "voice-dmic-ef",
2743ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC_TMUS] = "voice-dmic-ef-tmus",
2753ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
2763ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = "voice-speaker-dmic-ef",
2777629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti    [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = "voice-speaker-mic-hfp",
2783ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
279b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = "voice-tty-full-headset-mic",
280b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = "voice-tty-vco-handset-mic",
281b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = "voice-tty-hco-headset-mic",
282a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = "voice-tty-full-usb-mic",
283a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = "voice-tty-hco-usb-mic",
2843ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
285b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_REC_MIC] = "voice-rec-mic",
2863ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_MIC_NS] = "voice-rec-mic",
287733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = "voice-rec-mic",
288f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta    [SND_DEVICE_IN_VOICE_REC_MIC_AEC_NS] = "voice-rec-mic",
2893ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = "voice-rec-dmic-ef",
2903ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = "voice-rec-dmic-ef-fluence",
291ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_IN_USB_HEADSET_MIC] = "usb-headset-mic",
2928c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi    [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = "headset-mic",
29399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
2949034bc45854d86d45f44e23ac705aeff9a6e6e51Ricardo Garcia    [SND_DEVICE_IN_UNPROCESSED_MIC] = "unprocessed-mic",
2950125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = "unprocessed-stereo-mic",
2960125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = "unprocessed-three-mic",
2970125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = "unprocessed-quad-mic",
2980125e7851ac6e2fc8de3d77ea0d55996db46ef08vivek mehta    [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = "unprocessed-headset-mic",
29990fb96106e9e2db75e214722c797d013e10e5328rago
30099c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_IN_VOICE_RX] = "voice-rx",
30163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
302c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_THREE_MIC] = "three-mic",
303c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_QUAD_MIC] = "quad-mic",
30463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = "vi-feedback",
305c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_TMIC] = "three-mic",
306c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_QMIC] = "quad-mic",
307733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_TMIC_AEC] = "three-mic",
308733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_QMIC_AEC] = "quad-mic",
309b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
310b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
311b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent/* ACDB IDs (audio DSP path configuration IDs) for each sound device */
3125bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgestatic int acdb_device_table[SND_DEVICE_MAX] = {
313b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_NONE] = -1,
314b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HANDSET] = 7,
315b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER] = 15,
316b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_REVERSE] = 15,
3171b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    [SND_DEVICE_OUT_SPEAKER_SAFE] = 15,
318b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HEADPHONES] = 10,
319744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_LINE] = 77,
320b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = 10,
3213b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = 10,
322744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_LINE] = 77,
3233b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = 77,
324235c34827f7b3b8977fe76dea1fb8d818fd74312Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_HANDSET] = ACDB_ID_VOICE_HANDSET,
325235c34827f7b3b8977fe76dea1fb8d818fd74312Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER] = ACDB_ID_VOICE_SPEAKER,
3269d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent    [SND_DEVICE_OUT_VOICE_HAC_HANDSET] = 53,
327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_HEADPHONES] = 10,
328744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    [SND_DEVICE_OUT_VOICE_LINE] = 77,
329b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_HDMI] = 18,
330b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_SPEAKER_AND_HDMI] = 15,
331b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_BT_SCO] = 22,
3329f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_OUT_BT_SCO_WB] = 39,
33383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = ACDB_ID_VOICE_HANDSET_TMUS,
334b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = 17,
335b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = 17,
336b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = 37,
337a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_OUT_VOICE_TTY_FULL_USB] = 17,
338a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_OUT_VOICE_TTY_VCO_USB] = 17,
33999c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_TX] = 45,
340ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_OUT_USB_HEADSET] = 45,
341ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_OUT_USB_HEADPHONES] = 45,
342ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = 14,
34363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_SPEAKER_PROTECTED] = 124,
34463863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = 101,
345e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    [SND_DEVICE_OUT_VOICE_SPEAKER_HFP] = ACDB_ID_VOICE_SPEAKER,
346b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
347b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HANDSET_MIC] = 4,
3483ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC] = 106,
3493ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_NS] = 107,
3503ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_MIC_AEC_NS] = 108,
3513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC] = 41,
3523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC] = 109,
3533ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_NS] = 110,
3543ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_AEC_NS] = 111,
3553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_HANDSET_DMIC_STEREO] = 34,
3563ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
3573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC] = 11,
3583ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC] = 112,
3593ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_NS] = 113,
3603ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_MIC_AEC_NS] = 114,
3613ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC] = 43,
3623ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC] = 115,
3633ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_NS] = 116,
3643ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS] = 117,
3653ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_SPEAKER_DMIC_STEREO] = 35,
3663ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
36790fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
368cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    [SND_DEVICE_IN_HEADSET_MIC_AEC] = ACDB_ID_HEADSET_MIC_AEC,
3693ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
370b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_HDMI_MIC] = 4,
371b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_BT_SCO_MIC] = 21,
372e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_NREC] = 21,
3739f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
374e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    [SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = 38,
375b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_CAMCORDER_MIC] = 61,
3763ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
3773ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC] = 41,
3783ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_DMIC_TMUS] = ACDB_ID_VOICE_DMIC_EF_TMUS,
3793ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
380e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    [SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP] = 11,
3813ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_SPEAKER_DMIC] = 43,
38290fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_VOICE_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
383b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC] = 16,
384b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC] = 36,
385b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    [SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC] = 16,
386a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC] = 16,
387a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    [SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC] = 16,
3883ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
38990fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_VOICE_REC_MIC] = ACDB_ID_VOICE_REC_MIC,
3903ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_MIC_NS] = 113,
391733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_VOICE_REC_MIC_AEC] = 112,
392f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta    [SND_DEVICE_IN_VOICE_REC_MIC_AEC_NS] = 114,
3933ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_STEREO] = 35,
3943ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    [SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE] = 43,
39590fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_VOICE_REC_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
39690fb96106e9e2db75e214722c797d013e10e5328rago
39790fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_UNPROCESSED_MIC] = ACDB_ID_VOICE_REC_MIC,
39890fb96106e9e2db75e214722c797d013e10e5328rago    [SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC] = ACDB_ID_HEADSET_MIC_AEC,
3994ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    [SND_DEVICE_IN_UNPROCESSED_STEREO_MIC] = 35,
4004ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    [SND_DEVICE_IN_UNPROCESSED_THREE_MIC] = 125,
4014ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    [SND_DEVICE_IN_UNPROCESSED_QUAD_MIC] = 125,
40299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
40399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda    [SND_DEVICE_IN_VOICE_RX] = 44,
404ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    [SND_DEVICE_IN_USB_HEADSET_MIC] = 44,
405c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_THREE_MIC] = 46,
406c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_QUAD_MIC] = 46,
40763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    [SND_DEVICE_IN_CAPTURE_VI_FEEDBACK] = 102,
408c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_TMIC] = 125,
409c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    [SND_DEVICE_IN_HANDSET_QMIC] = 125,
410733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_TMIC_AEC] = 125, /* override this for new target to 140 */
411733c1df5828d63f547553b4a441668905306a4e2vivek mehta    [SND_DEVICE_IN_HANDSET_QMIC_AEC] = 125, /* override this for new target to 140 */
412b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent};
413b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
414ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin// Platform specific backend bit width table
415ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic int backend_bit_width_table[SND_DEVICE_MAX] = {0};
416ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
41798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestruct name_to_index {
4185bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    char name[100];
4195bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    unsigned int index;
4205bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George};
4215bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
4225bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George#define TO_NAME_INDEX(X)   #X, X
4235bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
42498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George/* Used to get index from parsed string */
42598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic const struct name_to_index snd_device_name_index[SND_DEVICE_MAX] = {
42698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    /* out */
4275bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_HANDSET)},
4285bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER)},
4295bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_REVERSE)},
4301b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE)},
4315bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_HEADPHONES)},
43209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_LINE)},
4335bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES)},
4343b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES)},
435744996b561b92473cc8ba23275811eb1a6b44d5eEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_LINE)},
4363b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE)},
4375bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET)},
4385bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER)},
439e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_HFP)},
4405bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HEADPHONES)},
44109f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_LINE)},
4425bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_HDMI)},
4435bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_HDMI)},
4445bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO)},
4455bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_BT_SCO_WB)},
44698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HANDSET_TMUS)},
4479d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_HAC_HANDSET)},
4485bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES)},
4495bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES)},
4505bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET)},
4516dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_SCO)},
4526dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB)},
453a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_FULL_USB)},
454a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_TTY_VCO_USB)},
455ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADSET)},
456ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    {TO_NAME_INDEX(SND_DEVICE_OUT_USB_HEADPHONES)},
457ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET)},
45863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_SPEAKER_PROTECTED)},
45963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED)},
460a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta
461a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    /* in */
4625bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC)},
46398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC)},
4643ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_NS)},
4653ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_MIC_AEC_NS)},
4663ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC)},
4673ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC)},
4683ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_NS)},
4693ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_AEC_NS)},
4703ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_DMIC_STEREO)},
4713ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4723ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC)},
47398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC)},
4743ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_NS)},
4753ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_MIC_AEC_NS)},
4763ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC)},
4773ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC)},
4783ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_NS)},
4793ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS)},
4803ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_SPEAKER_DMIC_STEREO)},
4813ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4823ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC)},
483b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_AEC)},
4843ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4855bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
4865bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
487e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
4885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
489e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB_NREC)},
4905bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_CAMCORDER_MIC)},
4913ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
4923ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC)},
4933ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_DMIC_TMUS)},
4943ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
495e9ef478adc4690c9d074c2dc063f9dc40ef81451Uday Kishore Pasupuleti    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP)},
4963ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_DMIC)},
4973ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
4985bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC)},
4995bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC)},
5005bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC)},
501a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC)},
502a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC)},
503a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta
5043ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
5055bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC)},
5063ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_NS)},
507733c1df5828d63f547553b4a441668905306a4e2vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_AEC)},
508f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_MIC_AEC_NS)},
5093ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_STEREO)},
5103ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE)},
5118c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi    {TO_NAME_INDEX(SND_DEVICE_IN_VOICE_REC_HEADSET_MIC)},
512ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    {TO_NAME_INDEX(SND_DEVICE_IN_USB_HEADSET_MIC)},
51363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
51490fb96106e9e2db75e214722c797d013e10e5328rago    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_MIC)},
51590fb96106e9e2db75e214722c797d013e10e5328rago    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC)},
5164ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_STEREO_MIC)},
5174ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_THREE_MIC)},
5184ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_UNPROCESSED_QUAD_MIC)},
51990fb96106e9e2db75e214722c797d013e10e5328rago
520c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_THREE_MIC)},
521c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_QUAD_MIC)},
52263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    {TO_NAME_INDEX(SND_DEVICE_IN_CAPTURE_VI_FEEDBACK)},
523c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC)},
524c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC)},
525733c1df5828d63f547553b4a441668905306a4e2vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_TMIC_AEC)},
526733c1df5828d63f547553b4a441668905306a4e2vivek mehta    {TO_NAME_INDEX(SND_DEVICE_IN_HANDSET_QMIC_AEC)},
52798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George};
52898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
529b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandastatic char * backend_tag_table[SND_DEVICE_MAX] = {0};
530b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandastatic char * hw_interface_table[SND_DEVICE_MAX] = {0};
53198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
53298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic const struct name_to_index usecase_name_index[AUDIO_USECASE_MAX] = {
53398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_DEEP_BUFFER)},
53498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_LOW_LATENCY)},
53598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MULTI_CH)},
53698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_OFFLOAD)},
5372bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_TTS)},
5382bc7b02259e0edf38432b258594da29571f29713Ravi Kumar Alamanda    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_ULL)},
5390e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_MMAP)},
54098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_RECORD)},
54198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_RECORD_LOW_LATENCY)},
5420e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent    {TO_NAME_INDEX(USECASE_AUDIO_RECORD_MMAP)},
54398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOICE_CALL)},
54498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOICE2_CALL)},
54598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOLTE_CALL)},
54698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_QCHAT_CALL)},
54798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_VOWLAN_CALL)},
548f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_VOICEMMODE1_CALL)},
549f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_VOICEMMODE2_CALL)},
55098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK)},
55198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_INCALL_REC_DOWNLINK)},
55298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_INCALL_REC_UPLINK_AND_DOWNLINK)},
55398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    {TO_NAME_INDEX(USECASE_AUDIO_HFP_SCO)},
554f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_RX)},
555f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_AUDIO_SPKR_CALIB_TX)},
556f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_AUDIO_PLAYBACK_AFE_PROXY)},
557f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_AUDIO_RECORD_AFE_PROXY)},
558f1346ce3f446e6a89f39748bf319949fb54036a3John Muir    {TO_NAME_INDEX(USECASE_AUDIO_DSM_FEEDBACK)},
5595bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George};
5605bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
5617ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define DEEP_BUFFER_PLATFORM_DELAY (29*1000LL)
5627ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George#define LOW_LATENCY_PLATFORM_DELAY (13*1000LL)
5630e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent#define ULL_PLATFORM_DELAY         (3*1000LL)
5640e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent#define MMAP_PLATFORM_DELAY        (3*1000LL)
5657ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George
566b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic pthread_once_t check_op_once_ctl = PTHREAD_ONCE_INIT;
567b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic bool is_tmus = false;
568b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
569b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentstatic void check_operator()
570b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
571b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char value[PROPERTY_VALUE_MAX];
572b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int mccmnc;
573b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    property_get("gsm.sim.operator.numeric",value,"0");
574b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mccmnc = atoi(value);
5752bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent    ALOGD("%s: tmus mccmnc %d", __func__, mccmnc);
576b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    switch(mccmnc) {
577b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* TMUS MCC(310), MNC(490, 260, 026) */
578b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310490:
579b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310260:
580b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 310026:
581b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    /* Add new TMUS MNC(800, 660, 580, 310, 270, 250, 240, 230, 220, 210, 200, 160) */
582b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310800:
583b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310660:
584b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310580:
585b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310310:
586b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310270:
587b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310250:
588b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310240:
589b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310230:
590b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310220:
591b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310210:
592b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310200:
593b891db5473ab23a0cbc52d566a97c3d3529f8dddsangwon.jeon    case 310160:
594b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        is_tmus = true;
595b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        break;
596b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
597b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
598b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
599b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentbool is_operator_tmus()
600b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
601b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    pthread_once(&check_op_once_ctl, check_operator);
602b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return is_tmus;
603b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
604b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
6052f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic char *get_current_operator()
6062f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
6072f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode *node;
6082f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_info *info_item;
6092f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char mccmnc[PROPERTY_VALUE_MAX];
6102f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *ret = NULL;
6112f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6127fea2049eeb6550e5f3382671f4ec5103cfac3d3Tom Cherry    property_get("gsm.sim.operator.numeric",mccmnc,"00000");
6132f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6142f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_for_each(node, &operator_info_list) {
6152f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info_item = node_to_item(node, struct operator_info, list);
6162f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (strstr(info_item->mccmnc, mccmnc) != NULL) {
6172f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            ret = info_item->name;
6182f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
6192f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
6202f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6212f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
6222f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
6232f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6242f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic struct operator_specific_device *get_operator_specific_device(snd_device_t snd_device)
6252f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
6262f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode *node;
6272f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *ret = NULL;
6282f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device_item;
6292f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char *operator_name;
6302f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6312f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    operator_name = get_current_operator();
6322f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (operator_name == NULL)
6332f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        return ret;
6342f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_for_each(node, operator_specific_device_table[snd_device]) {
6362f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        device_item = node_to_item(node, struct operator_specific_device, list);
6372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (strcmp(operator_name, device_item->operator) == 0) {
6382f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            ret = device_item;
6392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
6402f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
6412f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6422f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
6432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
6442f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6452f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6462f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic int get_operator_specific_device_acdb_id(snd_device_t snd_device)
6472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
6482f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device;
6492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    int ret = acdb_device_table[snd_device];
6502f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6512f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device = get_operator_specific_device(snd_device);
6522f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (device != NULL)
6532f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        ret = device->acdb_id;
6542f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6552f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
6562f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
6572f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6582f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkstatic const char *get_operator_specific_device_mixer_path(snd_device_t snd_device)
6592f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
6602f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device;
6612f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    const char *ret = device_table[snd_device];
6622f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device = get_operator_specific_device(snd_device);
6642f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (device != NULL)
6652f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        ret = device->mixer_path;
6662f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6672f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    return ret;
6682f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
6692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
6701a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehtabool platform_send_gain_dep_cal(void *platform, int level)
6711a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta{
6721a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    bool ret_val = false;
6731a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct platform_data *my_data = (struct platform_data *)platform;
6741a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct audio_device *adev = my_data->adev;
6751a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    int acdb_dev_id, app_type;
6761a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    int acdb_dev_type = MSM_SNDDEV_CAP_RX;
6771a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    int mode = CAL_MODE_RTAC;
6781a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct listnode *node;
6791a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    struct audio_usecase *usecase;
6801a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6811a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    if (my_data->acdb_send_gain_dep_cal == NULL) {
6821a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        ALOGE("%s: dlsym error for acdb_send_gain_dep_cal", __func__);
6831a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        return ret_val;
6841a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    }
6851a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6861a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    if (!voice_is_in_call(adev)) {
6871a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        ALOGV("%s: Not Voice call usecase, apply new cal for level %d",
6881a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta               __func__, level);
6891a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        app_type = DEFAULT_APP_TYPE_RX_PATH;
6901a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6911a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        // find the current active sound device
6921a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        list_for_each(node, &adev->usecase_list) {
6931a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            usecase = node_to_item(node, struct audio_usecase, list);
6941a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6951a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            if (usecase != NULL &&
6961a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                usecase->type == PCM_PLAYBACK &&
6971a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                (usecase->stream.out->devices == AUDIO_DEVICE_OUT_SPEAKER)) {
6981a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
6991a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                ALOGV("%s: out device is %d", __func__,  usecase->out_snd_device);
7004cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                if (audio_extn_spkr_prot_is_enabled()) {
7014cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                    acdb_dev_id = audio_extn_spkr_prot_get_acdb_id(usecase->out_snd_device);
7024cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                } else {
7034cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                    acdb_dev_id = acdb_device_table[usecase->out_snd_device];
7044cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta                }
7054cb8298a322ef5be6f8db002e50c764fdecc2c55vivek mehta
7061a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                if (!my_data->acdb_send_gain_dep_cal(acdb_dev_id, app_type,
7071a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                                                     acdb_dev_type, mode, level)) {
7081a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                    // set ret_val true if at least one calibration is set successfully
7091a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                    ret_val = true;
7101a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                } else {
7111a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                    ALOGE("%s: my_data->acdb_send_gain_dep_cal failed ", __func__);
7121a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                }
7131a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            } else {
7141a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                ALOGW("%s: Usecase list is empty", __func__);
7151a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            }
7161a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        }
7171a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    } else {
7181a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        ALOGW("%s: Voice call in progress .. ignore setting new cal",
7191a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta              __func__);
7201a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    }
7211a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta    return ret_val;
7221a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta}
7231a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
724cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurentvoid platform_set_echo_reference(struct audio_device *adev, bool enable, audio_devices_t out_device)
725b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
726f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)adev->platform;
727cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
728cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent
729f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    if (strcmp(my_data->ec_ref_mixer_path, "")) {
730f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        ALOGV("%s: diabling %s", __func__, my_data->ec_ref_mixer_path);
731f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        audio_route_reset_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
732cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent    }
733cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent
734f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    if (enable) {
735f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        strcpy(my_data->ec_ref_mixer_path, "echo-reference");
736f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        if (out_device != AUDIO_DEVICE_NONE) {
737f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda            snd_device = platform_get_output_snd_device(adev->platform, out_device);
738f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda            platform_add_backend_name(adev->platform, my_data->ec_ref_mixer_path, snd_device);
739f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        }
740b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
741188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato        ALOGV("%s: enabling %s", __func__, my_data->ec_ref_mixer_path);
742f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda        audio_route_apply_and_update_path(adev->audio_route, my_data->ec_ref_mixer_path);
743f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda    }
744b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
745b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
74683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic struct csd_data *open_csd_client(bool i2s_ext_modem)
74783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
74883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct csd_data *csd = calloc(1, sizeof(struct csd_data));
74983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
75083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    csd->csd_client = dlopen(LIB_CSD_CLIENT, RTLD_NOW);
75183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (csd->csd_client == NULL) {
75283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: DLOPEN failed for %s", __func__, LIB_CSD_CLIENT);
75383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        goto error;
75483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
75583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGV("%s: DLOPEN successful for %s", __func__, LIB_CSD_CLIENT);
75683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
75783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->deinit = (deinit_t)dlsym(csd->csd_client,
75883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_deinit");
75983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->deinit == NULL) {
76083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_deinit", __func__,
76183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  dlerror());
76283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
76383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
76483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->disable_device = (disable_device_t)dlsym(csd->csd_client,
76583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_disable_device");
76683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->disable_device == NULL) {
76783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_disable_device",
76883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
76983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
77083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
77183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->enable_device_config = (enable_device_config_t)dlsym(csd->csd_client,
77283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                               "csd_client_enable_device_config");
77383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->enable_device_config == NULL) {
77483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_enable_device_config",
77583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
77683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
77783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
77883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->enable_device = (enable_device_t)dlsym(csd->csd_client,
77983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_enable_device");
78083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->enable_device == NULL) {
78183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_enable_device",
78283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
78383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
78483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
78583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_voice = (start_voice_t)dlsym(csd->csd_client,
78683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_voice");
78783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_voice == NULL) {
78883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_voice",
78983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
79083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
79183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
79283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_voice = (stop_voice_t)dlsym(csd->csd_client,
79383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_voice");
79483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_voice == NULL) {
79583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_voice",
79683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
79783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
79883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
79983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->volume = (volume_t)dlsym(csd->csd_client,
80083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_volume");
80183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->volume == NULL) {
80283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_volume",
80383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
80483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
80583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
80683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->mic_mute = (mic_mute_t)dlsym(csd->csd_client,
80783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_mic_mute");
80883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->mic_mute == NULL) {
80983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_mic_mute",
81083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
81183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
81283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
81383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->slow_talk = (slow_talk_t)dlsym(csd->csd_client,
81483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_slow_talk");
81583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->slow_talk == NULL) {
81683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_slow_talk",
81783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
81883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
81983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
82083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_playback = (start_playback_t)dlsym(csd->csd_client,
82183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_playback");
82283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_playback == NULL) {
82383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_playback",
82483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
82583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
82683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
82783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_playback = (stop_playback_t)dlsym(csd->csd_client,
82883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_playback");
82983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_playback == NULL) {
83083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_playback",
83183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
83283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
83383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
83483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->start_record = (start_record_t)dlsym(csd->csd_client,
83583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_start_record");
83683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->start_record == NULL) {
83783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_start_record",
83883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
83983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
84083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
84183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->stop_record = (stop_record_t)dlsym(csd->csd_client,
84283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_stop_record");
84383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->stop_record == NULL) {
84483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_stop_record",
84583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
84683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
84783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
84883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
84983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->get_sample_rate = (get_sample_rate_t)dlsym(csd->csd_client,
85083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                             "csd_client_get_sample_rate");
85183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->get_sample_rate == NULL) {
85283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_get_sample_rate",
85383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
85483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
85583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
85683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
85783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
85883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->init = (init_t)dlsym(csd->csd_client, "csd_client_init");
85983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
86083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (csd->init == NULL) {
86183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: dlsym error %s for csd_client_init",
86283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, dlerror());
86383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            goto error;
86483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        } else {
86583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            csd->init(i2s_ext_modem);
86683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
86783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
86883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return csd;
86983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
87083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaerror:
87183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    free(csd);
87283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    csd = NULL;
87383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return csd;
87483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
87583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
87683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandavoid close_csd_client(struct csd_data *csd)
87783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
87883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (csd != NULL) {
87983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd->deinit();
88083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        dlclose(csd->csd_client);
88183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        free(csd);
88283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        csd = NULL;
88383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
88483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
88583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
88683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandastatic void platform_csd_init(struct platform_data *my_data)
88783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
88883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#ifdef PLATFORM_MSM8084
889ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    int32_t modems, (*count_modems)(void);
890ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    const char *name = "libdetectmodem.so";
891ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    const char *func = "count_modems";
892ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    const char *error;
893ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
894ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    my_data->csd = NULL;
895ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
896ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    void *lib = dlopen(name, RTLD_NOW);
897ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    error = dlerror();
898ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (!lib) {
899ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        ALOGE("%s: could not find %s: %s", __func__, name, error);
900ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        return;
901ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    }
902ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
903ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    count_modems = NULL;
904ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    *(void **)(&count_modems) = dlsym(lib, func);
905ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    error = dlerror();
906ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (!count_modems) {
907ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        ALOGE("%s: could not find symbol %s in %s: %s",
908ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev              __func__, func, name, error);
909ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        goto done;
91083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
91183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
912ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    modems = count_modems();
913ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (modems < 0) {
914ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        ALOGE("%s: count_modems failed\n", __func__);
915ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev        goto done;
916ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    }
917ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
9182bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent    ALOGD("%s: num_modems %d\n", __func__, modems);
919ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    if (modems > 0)
92083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->csd = open_csd_client(false /*is_i2s_ext_modem*/);
921ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev
922ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchevdone:
923ae9a10c15cf960e9b2b1159ade6414f80689db5fIliyan Malchev    dlclose(lib);
92483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
92583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda     my_data->csd = NULL;
92683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
92783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
92883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
929c633338c83da3760c4965d29af2afd80d3cce840Eric Laurentstatic void set_platform_defaults(struct platform_data * my_data)
93098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
93198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int32_t dev;
93298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
933b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        backend_tag_table[dev] = NULL;
934b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        hw_interface_table[dev] = NULL;
9352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        operator_specific_device_table[dev] = NULL;
93698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
93798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
938ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
939ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_bit_width_table[dev] = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
940ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
941ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
942b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    // To overwrite these go to the audio_platform_info.xml file.
943b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("bt-sco");
944e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco");
945b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco");
946b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
947b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("speaker-and-hdmi");
948b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
949b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb");
950e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb");
951b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_OUT_VOICE_TX] = strdup("afe-proxy");
952b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[SND_DEVICE_IN_VOICE_RX] = strdup("afe-proxy");
95398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
954ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_tag_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("usb-headset");
955ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_tag_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("usb-headphones");
956ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_tag_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] =
957ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        strdup("speaker-and-usb-headphones");
958ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_tag_table[SND_DEVICE_IN_USB_HEADSET_MIC] = strdup("usb-headset-mic");
959b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_HANDSET] = strdup("SLIMBUS_0_RX");
960b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER] = strdup("SLIMBUS_0_RX");
961b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_REVERSE] = strdup("SLIMBUS_0_RX");
962b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE] = strdup("SLIMBUS_0_RX");
963b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_HEADPHONES] = strdup("SLIMBUS_0_RX");
964b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_LINE] = strdup("SLIMBUS_0_RX");
965b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES] = strdup("SLIMBUS_0_RX");
9663b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES] = strdup("SLIMBUS_0_RX");
967b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_LINE] = strdup("SLIMBUS_0_RX");
9683b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE] = strdup("SLIMBUS_0_RX");
969b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET] = strdup("SLIMBUS_0_RX");
970b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HAC_HANDSET] = strdup("SLIMBUS_0_RX");
971b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER] = strdup("SLIMBUS_0_RX");
972b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HEADPHONES] = strdup("SLIMBUS_0_RX");
973b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_LINE] = strdup("SLIMBUS_0_RX");
974b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_HDMI] = strdup("HDMI_RX");
975b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_HDMI] = strdup("SLIMBUS_0_RX-and-HDMI_RX");
976b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_BT_SCO] = strdup("SEC_AUX_PCM_RX");
977b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("SEC_AUX_PCM_RX");
978b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_HANDSET_TMUS] = strdup("SLIMBUS_0_RX");
979b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES] = strdup("SLIMBUS_0_RX");
980b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES] = strdup("SLIMBUS_0_RX");
981b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET] = strdup("SLIMBUS_0_RX");
982ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    hw_interface_table[SND_DEVICE_OUT_USB_HEADSET] = strdup("USB_AUDIO_RX");
983ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    hw_interface_table[SND_DEVICE_OUT_USB_HEADPHONES] = strdup("USB_AUDIO_RX");
984ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    hw_interface_table[SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET] = strdup("SLIMBUS_0_RX-and-USB_AUDIO_RX");
985b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_TX] = strdup("AFE_PCM_RX");
986b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
987b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    hw_interface_table[SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED] = strdup("SLIMBUS_0_RX");
988c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent
989c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent    my_data->max_mic_count = PLATFORM_DEFAULT_MIC_COUNT;
99098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
99198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
9925c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandavoid get_cvd_version(char *cvd_version, struct audio_device *adev)
9935c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda{
9945c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    struct mixer_ctl *ctl;
9955c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    int count;
9965c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    int ret = 0;
9975c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
9985c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    ctl = mixer_get_ctl_by_name(adev->mixer, CVD_VERSION_MIXER_CTL);
9995c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    if (!ctl) {
10005c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        ALOGE("%s: Could not get ctl for mixer cmd - %s",  __func__, CVD_VERSION_MIXER_CTL);
10015c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        goto done;
10025c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    }
10035c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    mixer_ctl_update(ctl);
10045c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
10055c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    count = mixer_ctl_get_num_values(ctl);
10065c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    if (count > MAX_CVD_VERSION_STRING_SIZE)
10075c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        count = MAX_CVD_VERSION_STRING_SIZE - 1;
10085c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
10095c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    ret = mixer_ctl_get_array(ctl, cvd_version, count);
10105c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    if (ret != 0) {
10115c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        ALOGE("%s: ERROR! mixer_ctl_get_array() failed to get CVD Version", __func__);
10125c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        goto done;
10135c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    }
10145c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
10155c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamandadone:
10165c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    return;
10175c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda}
10185c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
1019c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew Georgestatic int platform_acdb_init(void *platform)
1020c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George{
1021c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    struct platform_data *my_data = (struct platform_data *)platform;
1022c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    struct audio_device *adev = my_data->adev;
1023c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
1024c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    if (!my_data->acdb_init) {
1025c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        ALOGE("%s: no acdb_init fn provided", __func__);
1026c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        return -1;
1027c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    }
1028c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
1029c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    if (my_data->acdb_initialized) {
1030c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        ALOGW("acdb is already initialized");
1031c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        return 0;
1032c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    }
1033c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
103492232b4965de9911bfc2e573b5ecb2cd07be0d74Thierry Strudel#if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996) || (PLATFORM_MSM8998)
1035c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    char *cvd_version = calloc(1, MAX_CVD_VERSION_STRING_SIZE);
1036c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    if (!cvd_version)
1037c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        ALOGE("failed to allocate cvd_version");
1038c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    else {
1039c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        get_cvd_version(cvd_version, adev);
1040c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        my_data->acdb_init((char *)my_data->snd_card_name, cvd_version, 0);
1041c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        free(cvd_version);
1042c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    }
1043c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George#elif defined (PLATFORM_MSM8084)
1044c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    my_data->acdb_init((char *)my_data->snd_card_name);
1045c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George#else
1046c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    my_data->acdb_init();
1047c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George#endif
1048c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    my_data->acdb_initialized = true;
1049c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    return 0;
1050c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George}
1051c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
1052ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic void
1053ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linplatform_backend_config_init(struct platform_data *pdata)
1054ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
1055ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int i;
1056ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1057ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    /* initialize backend config */
1058ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    for (i = 0; i < MAX_CODEC_BACKENDS; i++) {
1059ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        pdata->current_backend_cfg[i].sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
1060ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        pdata->current_backend_cfg[i].bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
1061ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        pdata->current_backend_cfg[i].channels = CODEC_BACKEND_DEFAULT_CHANNELS;
1062ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1063ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (i > MAX_RX_CODEC_BACKENDS)
1064ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            pdata->current_backend_cfg[i].channels = CODEC_BACKEND_DEFAULT_TX_CHANNELS;
1065ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1066ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        pdata->current_backend_cfg[i].bitwidth_mixer_ctl = NULL;
1067ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        pdata->current_backend_cfg[i].samplerate_mixer_ctl = NULL;
1068ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        pdata->current_backend_cfg[i].channels_mixer_ctl = NULL;
1069ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
1070ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1071ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[DEFAULT_CODEC_BACKEND].bitwidth_mixer_ctl =
1072ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("SLIM_0_RX Format");
1073ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[DEFAULT_CODEC_BACKEND].samplerate_mixer_ctl =
1074ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("SLIM_0_RX SampleRate");
1075ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1076ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].bitwidth_mixer_ctl =
1077ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("SLIM_0_TX Format");
1078ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[DEFAULT_CODEC_TX_BACKEND].samplerate_mixer_ctl =
1079ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("SLIM_0_TX SampleRate");
1080ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1081ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_TX_BACKEND].bitwidth_mixer_ctl =
1082ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("USB_AUDIO_TX Format");
1083ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_TX_BACKEND].samplerate_mixer_ctl =
1084ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("USB_AUDIO_TX SampleRate");
1085ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
1086ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("USB_AUDIO_TX Channels");
1087ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1088ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[HEADPHONE_BACKEND].bitwidth_mixer_ctl =
1089ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("SLIM_6_RX Format");
1090ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[HEADPHONE_BACKEND].samplerate_mixer_ctl =
1091ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("SLIM_6_RX SampleRate");
1092ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1093ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_RX_BACKEND].bitwidth_mixer_ctl =
1094ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("USB_AUDIO_RX Format");
1095ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_RX_BACKEND].samplerate_mixer_ctl =
1096ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("USB_AUDIO_RX SampleRate");
1097ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1098ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_RX_BACKEND].channels = 1;
1099ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    pdata->current_backend_cfg[USB_AUDIO_RX_BACKEND].channels_mixer_ctl =
1100ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            strdup("USB_AUDIO_RX Channels");
1101ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
1102ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1103f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok// Treblized config files will be located in /odm/etc or /vendor/etc.
1104f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seokstatic const char *kConfigLocationList[] =
1105f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok        {"/odm/etc", "/vendor/etc", "/system/etc"};
1106f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seokstatic const int kConfigLocationListSize =
1107f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok        (sizeof(kConfigLocationList) / sizeof(kConfigLocationList[0]));
1108f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok
1109f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seokbool resolveConfigFile(char file_name[MIXER_PATH_MAX_LENGTH]) {
1110f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok    char full_config_path[MIXER_PATH_MAX_LENGTH];
1111f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok    for (int i = 0; i < kConfigLocationListSize; i++) {
1112f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok        snprintf(full_config_path,
1113f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                 MIXER_PATH_MAX_LENGTH,
1114f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                 "%s/%s",
1115f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                 kConfigLocationList[i],
1116f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                 file_name);
1117f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok        if (F_OK == access(full_config_path, 0)) {
1118f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok            strcpy(file_name, full_config_path);
1119f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok            return true;
1120f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok        }
1121f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok    }
1122f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok    return false;
1123f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok}
1124f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok
1125b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid *platform_init(struct audio_device *adev)
1126b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1127b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char value[PROPERTY_VALUE_MAX];
112860ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    struct platform_data *my_data = NULL;
112960ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    int retry_num = 0, snd_card_num = 0, key = 0, ret = 0;
113060ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    bool dual_mic_config = false, use_default_mixer_path = true;
113183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    const char *snd_card_name;
11325c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda    char *cvd_version = NULL;
113360ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    char *snd_internal_name = NULL;
113460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    char *tmp = NULL;
113560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta    char mixer_xml_file[MIXER_PATH_MAX_LENGTH]= {0};
1136de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    char platform_info_file[MIXER_PATH_MAX_LENGTH]= {0};
1137de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    struct snd_card_split *snd_split_handle = NULL;
1138c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    my_data = calloc(1, sizeof(struct platform_data));
1139c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1140c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    my_data->adev = adev;
1141c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
11422f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_init(&operator_info_list);
11432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
1144c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    set_platform_defaults(my_data);
11452b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta    bool card_verifed[MAX_SND_CARD] = {0};
11462b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta    const int retry_limit = property_get_int32("audio.snd_card.open.retries", RETRY_NUMBER);
11472b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta
11482b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta    for (;;) {
11492b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta        if (snd_card_num >= MAX_SND_CARD) {
11502b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            if (retry_num++ >= retry_limit) {
11512b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta                ALOGE("%s: Unable to find correct sound card, aborting.", __func__);
11522b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta                goto init_failed;
11532b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            }
1154c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
11552b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            snd_card_num = 0;
11564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            usleep(RETRY_US);
11572b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            continue;
11582b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta        }
11592b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta
11602b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta        if (card_verifed[snd_card_num]) {
11612b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            ++snd_card_num;
11622b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            continue;
11634b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
116483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
11652b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta        adev->mixer = mixer_open(snd_card_num);
11662b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta
11674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (!adev->mixer) {
11684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: Unable to open the mixer card: %d", __func__,
11692b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta               snd_card_num);
11702b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            ++snd_card_num;
11714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            continue;
11724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
1173cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
11742b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta        card_verifed[snd_card_num] = true;
11752b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta
11764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        snd_card_name = mixer_get_name(adev->mixer);
1177de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        my_data->hw_info = hw_info_init(snd_card_name);
1178c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1179de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        audio_extn_set_snd_card_split(snd_card_name);
1180de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        snd_split_handle = audio_extn_get_snd_card_split();
1181de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1182de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        /* Get the codec internal name from the sound card and/or form factor
1183de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * name and form the mixer paths and platfor info file name dynamically.
1184de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * This is generic way of picking any codec and forma factor name based
1185de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * mixer and platform info files in future with no code change.
1186c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1187de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * current code extends and looks for any of the exteneded mixer path and
1188de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * platform info file present based on codec and form factor.
1189de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1190de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * order of picking appropriate file is
1191de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * <i>   mixer_paths_<codec_name>_<form_factor>.xml, if file not present
1192de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * <ii>  mixer_paths_<codec_name>.xml, if file not present
1193de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * <iii> mixer_paths.xml
1194de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1195de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * same order is followed for audio_platform_info.xml as well
1196de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         */
1197de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1198de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        // need to carryforward old file name
1199de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        if (!strncmp(snd_card_name, TOMTOM_8226_SND_CARD_NAME,
1200f9583c366559860ec5f287816908216c50cb917eEric Laurent                     min(strlen(TOMTOM_8226_SND_CARD_NAME), strlen(snd_card_name)))) {
1201de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
120260ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta                             MIXER_XML_BASE_STRING, TOMTOM_MIXER_FILE_SUFFIX );
1203de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        } else {
1204de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1205de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s_%s.xml",
1206de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             MIXER_XML_BASE_STRING, snd_split_handle->snd_card,
1207de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             snd_split_handle->form_factor);
1208f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok            if (!resolveConfigFile(mixer_xml_file)) {
1209de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
1210de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                snprintf(mixer_xml_file, sizeof(mixer_xml_file), "%s_%s.xml",
1211de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             MIXER_XML_BASE_STRING, snd_split_handle->snd_card);
1212de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1213f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                if (!resolveConfigFile(mixer_xml_file)) {
1214de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    memset(mixer_xml_file, 0, sizeof(mixer_xml_file));
1215de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    strlcpy(mixer_xml_file, MIXER_XML_DEFAULT_PATH, MIXER_PATH_MAX_LENGTH);
1216f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                    resolveConfigFile(mixer_xml_file);
121760ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta                }
1218de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            }
1219de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1220de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s_%s.xml",
1221de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card,
1222de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             snd_split_handle->form_factor);
1223a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent
1224f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok            if (!resolveConfigFile(platform_info_file)) {
1225de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                memset(platform_info_file, 0, sizeof(platform_info_file));
1226de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                snprintf(platform_info_file, sizeof(platform_info_file), "%s_%s.xml",
1227de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                             PLATFORM_INFO_XML_BASE_STRING, snd_split_handle->snd_card);
1228de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1229f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                if (!resolveConfigFile(platform_info_file)) {
1230de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    memset(platform_info_file, 0, sizeof(platform_info_file));
1231de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    strlcpy(platform_info_file, PLATFORM_INFO_XML_PATH, MIXER_PATH_MAX_LENGTH);
1232f62e17dbf9e88eae1371b42c59a8f48b736abb8aJaekyun Seok                    resolveConfigFile(platform_info_file);
123360ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta                }
123460ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta            }
123560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta        }
123660ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta
1237de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        /* Initialize platform specific ids and/or backends*/
1238de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        platform_info_init(platform_info_file, my_data);
1239de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1240de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        /* validate the sound card name
1241de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         * my_data->snd_card_name can contain
1242de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *     <a> complete sound card name, i.e. <device>-<codec>-<form_factor>-snd-card
1243de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *         example: msm8994-tomtom-mtp-snd-card
1244de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *     <b> or sub string of the card name, i.e. <device>-<codec>
1245de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         *         example: msm8994-tomtom
1246f9583c366559860ec5f287816908216c50cb917eEric Laurent         * snd_card_name is truncated to 32 charaters as per mixer_get_name() implementation
1247f9583c366559860ec5f287816908216c50cb917eEric Laurent         * so use min of my_data->snd_card_name and snd_card_name length for comparison
1248de4849cee04a23ae84da96487e344f75f93e5585vivek mehta         */
1249de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1250de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        if (my_data->snd_card_name != NULL &&
1251f9583c366559860ec5f287816908216c50cb917eEric Laurent                strncmp(snd_card_name, my_data->snd_card_name,
1252f9583c366559860ec5f287816908216c50cb917eEric Laurent                        min(strlen(snd_card_name), strlen(my_data->snd_card_name))) != 0) {
1253de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            ALOGI("%s: found valid sound card %s, but not primary sound card %s",
1254de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                   __func__, snd_card_name, my_data->snd_card_name);
12552b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            ++snd_card_num;
12562b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            mixer_close(adev->mixer);
12572b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            adev->mixer = NULL;
1258de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            hw_info_deinit(my_data->hw_info);
1259de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            my_data->hw_info = NULL;
1260de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            continue;
126170b5c14093fda468f42591ef4a8bff33f5788563Ed Tam        }
1262de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        ALOGI("%s: found sound card %s, primary sound card expeted is %s",
1263de4849cee04a23ae84da96487e344f75f93e5585vivek mehta              __func__, snd_card_name, my_data->snd_card_name);
126411dd22384f2ae13ec4a7563ce5f0a113cf30a53cUday Kishore Pasupuleti
126560ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta        ALOGD("%s: Loading mixer file: %s", __func__, mixer_xml_file);
126660ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta        adev->audio_route = audio_route_init(snd_card_num, mixer_xml_file);
126760ea415afda76d5b23ff2f24ac7e4a68938d94b4vivek mehta
12684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (!adev->audio_route) {
12694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: Failed to init audio route controls, aborting.", __func__);
12702b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            mixer_close(adev->mixer);
12712b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            adev->mixer = NULL;
12722b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            hw_info_deinit(my_data->hw_info);
12732b0e5a6f88a4499d598a03394505244beb1a41a7vivek mehta            my_data->hw_info = NULL;
1274c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda            goto init_failed;
12754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
12764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        adev->snd_card = snd_card_num;
12772bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent        ALOGD("%s: Opened sound card:%d", __func__, snd_card_num);
12784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        break;
12794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
12804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
1281c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    //set max volume step for voice call
1282c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    property_get("ro.config.vc_call_vol_steps", value, TOSTRING(MAX_VOL_INDEX));
1283c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    my_data->max_vol_index = atoi(value);
1284c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park
128565ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    property_get("persist.audio.dualmic.config",value,"");
128665ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    if (!strcmp("endfire", value)) {
128765ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta        dual_mic_config = true;
128865ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    }
128965ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta
1290c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    my_data->source_mic_type = SOURCE_DUAL_MIC;
1291c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
1292b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_spkr_mode = false;
1293b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_voice_call = false;
12943ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    my_data->fluence_in_voice_comm = false;
1295b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->fluence_in_voice_rec = false;
1296b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
129765ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    property_get("ro.qc.sdk.audio.fluencetype", value, "none");
1298c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    if (!strcmp("fluencepro", value)) {
1299c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->fluence_type = FLUENCE_PRO_ENABLE;
130065ad12de29cc94d65b2efc76588ae69ba941ba98vivek mehta    } else if (!strcmp("fluence", value) || (dual_mic_config)) {
1301c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->fluence_type = FLUENCE_ENABLE;
1302c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    } else if (!strcmp("none", value)) {
1303c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->fluence_type = FLUENCE_DISABLE;
1304b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1305b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1306c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    if (my_data->fluence_type != FLUENCE_DISABLE) {
1307b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.voicecall",value,"");
1308b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
1309b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_voice_call = true;
1310b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1311b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
13123ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        property_get("persist.audio.fluence.voicecomm",value,"");
13133ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        if (!strcmp("true", value)) {
13143ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            my_data->fluence_in_voice_comm = true;
13153ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        }
13163ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda
1317b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.voicerec",value,"");
1318b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
1319b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_voice_rec = true;
1320b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1321b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1322b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        property_get("persist.audio.fluence.speaker",value,"");
1323b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!strcmp("true", value)) {
1324b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->fluence_in_spkr_mode = true;
1325b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
1326b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1328c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    // support max to mono, example if max count is 3, usecase supports Three, dual and mono mic
1329c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    switch (my_data->max_mic_count) {
1330c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 4:
1331c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_QUAD_MIC;
1332c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 3:
1333c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_THREE_MIC;
1334c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 2:
1335c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_DUAL_MIC;
1336c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        case 1:
1337c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type |= SOURCE_MONO_MIC;
1338c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            break;
1339c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        default:
1340c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            ALOGE("%s: max_mic_count (%d), is not supported, setting to default",
1341c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   __func__, my_data->max_mic_count);
1342c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            my_data->source_mic_type = SOURCE_MONO_MIC|SOURCE_DUAL_MIC;
1343c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            break;
1344c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        }
1345c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
1346c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    ALOGV("%s: Fluence_Type(%d) max_mic_count(%d) mic_type(0x%x) fluence_in_voice_call(%d)"
1347c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          " fluence_in_voice_comm(%d) fluence_in_voice_rec(%d) fluence_in_spkr_mode(%d) ",
1348c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          __func__, my_data->fluence_type, my_data->max_mic_count, my_data->source_mic_type,
1349c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          my_data->fluence_in_voice_call, my_data->fluence_in_voice_comm,
1350c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          my_data->fluence_in_voice_rec, my_data->fluence_in_spkr_mode);
1351c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
1352b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    my_data->acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
1353b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_handle == NULL) {
1354b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: DLOPEN failed for %s", __func__, LIB_ACDB_LOADER);
1355b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
1356b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGV("%s: DLOPEN successful for %s", __func__, LIB_ACDB_LOADER);
1357b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_deallocate = (acdb_deallocate_t)dlsym(my_data->acdb_handle,
1358b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_deallocate_ACDB");
135983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_deallocate)
136083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_deallocate_ACDB from %s",
136183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
136283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
1363b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_audio_cal = (acdb_send_audio_cal_t)dlsym(my_data->acdb_handle,
1364b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_send_audio_cal");
1365b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (!my_data->acdb_send_audio_cal)
136683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_send_audio_cal from %s",
1367b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                  __func__, LIB_ACDB_LOADER);
136883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
1369b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_voice_cal = (acdb_send_voice_cal_t)dlsym(my_data->acdb_handle,
1370b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_send_voice_cal");
137183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_send_voice_cal)
137283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_send_voice_cal from %s",
137383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
137483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
137583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        my_data->acdb_reload_vocvoltable = (acdb_reload_vocvoltable_t)dlsym(my_data->acdb_handle,
137683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    "acdb_loader_reload_vocvoltable");
137783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (!my_data->acdb_reload_vocvoltable)
137883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: Could not find the symbol acdb_loader_reload_vocvoltable from %s",
137983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, LIB_ACDB_LOADER);
13801a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
13811a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        my_data->acdb_send_gain_dep_cal = (acdb_send_gain_dep_cal_t)dlsym(my_data->acdb_handle,
13821a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                                                    "acdb_loader_send_gain_dep_cal");
13831a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta        if (!my_data->acdb_send_gain_dep_cal)
13841a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta            ALOGV("%s: Could not find the symbol acdb_loader_send_gain_dep_cal from %s",
13851a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta                  __func__, LIB_ACDB_LOADER);
13861a9b7c0f180df7fe390f2839e8214667727aaa49vivek mehta
138792232b4965de9911bfc2e573b5ecb2cd07be0d74Thierry Strudel#if defined (PLATFORM_MSM8994) || (PLATFORM_MSM8996) || (PLATFORM_MSM8998)
13885c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init_v2_cvd_t acdb_init;
13895c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init = (acdb_init_v2_cvd_t)dlsym(my_data->acdb_handle,
13905c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda                                              "acdb_loader_init_v2");
1391c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        if (acdb_init == NULL)
1392c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George            ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__,
1393c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George                  dlerror());
13945c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
13955c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda#elif defined (PLATFORM_MSM8084)
13965c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init_v2_t acdb_init;
13975c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init = (acdb_init_v2_t)dlsym(my_data->acdb_handle,
13985c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda                                          "acdb_loader_init_v2");
1399c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        if (acdb_init == NULL)
1400c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George            ALOGE("%s: dlsym error %s for acdb_loader_init_v2", __func__,
1401c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George                  dlerror());
1402c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
140383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#else
14045c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init_t acdb_init;
14055c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        acdb_init = (acdb_init_t)dlsym(my_data->acdb_handle,
1406b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                                    "acdb_loader_init_ACDB");
14075c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda        if (acdb_init == NULL)
1408c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George            ALOGE("%s: dlsym error %s for acdb_loader_init_ACDB", __func__,
1409c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George                  dlerror());
141083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda#endif
1411c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        my_data->acdb_init = acdb_init;
1412b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1413c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        my_data->acdb_send_custom_top = (acdb_send_custom_top_t)
1414c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George                                        dlsym(my_data->acdb_handle,
1415c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George                                              "acdb_loader_send_common_custom_topology");
1416c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
1417c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        if (!my_data->acdb_send_custom_top)
1418c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George            ALOGE("%s: Could not find the symbol acdb_get_default_app_type from %s",
1419c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George                  __func__, LIB_ACDB_LOADER);
1420c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
1421c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        platform_acdb_init(my_data);
1422c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    }
14235c049df87e3fad47fb1a6975e41c68eda9a8b594Ravi Kumar Alamanda
1424ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    /* init usb */
1425ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    audio_extn_usb_init(adev);
1426ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
142763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    audio_extn_spkr_prot_init(adev);
142898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
14297631557cda5515b07b06dd0def53e5813f2442f3Ravi Kumar Alamanda    audio_extn_hwdep_cal_send(adev->snd_card, my_data->acdb_handle);
14307631557cda5515b07b06dd0def53e5813f2442f3Ravi Kumar Alamanda
143183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    /* load csd client */
143283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    platform_csd_init(my_data);
143383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
1434ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    platform_backend_config_init(my_data);
1435ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1436b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return my_data;
1437c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1438c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandainit_failed:
1439c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (my_data)
1440c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        free(my_data);
1441c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    return NULL;
1442b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1443b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1444b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentvoid platform_deinit(void *platform)
1445b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1446c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    int32_t dev;
14472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_info *info_item;
14482f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device_item;
14492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct listnode *node;
1450c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
14514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
14524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    close_csd_client(my_data->csd);
1453c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1454de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    hw_info_deinit(my_data->hw_info);
1455de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1456c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    for (dev = 0; dev < SND_DEVICE_MAX; dev++) {
1457c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        if (backend_tag_table[dev])
1458c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda            free(backend_tag_table[dev]);
1459c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        if (hw_interface_table[dev])
1460c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda            free(hw_interface_table[dev]);
14612f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (operator_specific_device_table[dev]) {
14622f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            while (!list_empty(operator_specific_device_table[dev])) {
14632f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                node = list_head(operator_specific_device_table[dev]);
14642f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                list_remove(node);
14652f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                device_item = node_to_item(node, struct operator_specific_device, list);
14662f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                free(device_item->operator);
14672f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                free(device_item->mixer_path);
14682f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                free(device_item);
14692f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            }
14702f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            free(operator_specific_device_table[dev]);
14712f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
1472c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    }
1473c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
1474c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (my_data->snd_card_name)
1475c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        free(my_data->snd_card_name);
1476c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
14772f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    while (!list_empty(&operator_info_list)) {
14782f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        node = list_head(&operator_info_list);
14792f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        list_remove(node);
14802f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info_item = node_to_item(node, struct operator_info, list);
14812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        free(info_item->name);
14822f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        free(info_item->mccmnc);
14832f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        free(info_item);
14842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
14852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
1486e35d4aff6554719ac78a6d2c3daf0f4c28481897Kevin Rocard    mixer_close(my_data->adev->mixer);
1487b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    free(platform);
1488ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1489ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    /* deinit usb */
1490ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    audio_extn_usb_deinit();
1491b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1492b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1493b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentconst char *platform_get_snd_device_name(snd_device_t snd_device)
1494b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
14952f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
14962f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        if (operator_specific_device_table[snd_device] != NULL) {
14972f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            return get_operator_specific_device_mixer_path(snd_device);
14982f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        }
1499b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return device_table[snd_device];
15002f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    } else
15016402646dbd962f62c37abbb1d435907d54da77ddRavi Kumar Alamanda        return "none";
1502b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1503b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1504de4849cee04a23ae84da96487e344f75f93e5585vivek mehtaint platform_get_snd_device_name_extn(void *platform, snd_device_t snd_device,
1505de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                                      char *device_name)
1506de4849cee04a23ae84da96487e344f75f93e5585vivek mehta{
1507de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    struct platform_data *my_data = (struct platform_data *)platform;
1508de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
15091565f9944df8446785ffd8c956ee9f3dd596172bDavid Benjamin    if (platform == NULL) {
1510de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        ALOGW("%s: something wrong, use legacy get_snd_device name", __func__);
15111565f9944df8446785ffd8c956ee9f3dd596172bDavid Benjamin        strlcpy(device_name, platform_get_snd_device_name(snd_device),
15121565f9944df8446785ffd8c956ee9f3dd596172bDavid Benjamin                DEVICE_NAME_MAX_SIZE);
1513de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    } else if (snd_device >= SND_DEVICE_MIN && snd_device < SND_DEVICE_MAX) {
1514de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        if (operator_specific_device_table[snd_device] != NULL) {
1515de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            strlcpy(device_name, get_operator_specific_device_mixer_path(snd_device),
1516de4849cee04a23ae84da96487e344f75f93e5585vivek mehta                    DEVICE_NAME_MAX_SIZE);
1517de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        } else {
1518de4849cee04a23ae84da96487e344f75f93e5585vivek mehta            strlcpy(device_name, device_table[snd_device], DEVICE_NAME_MAX_SIZE);
1519de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        }
1520de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        hw_info_append_hw_type(my_data->hw_info, snd_device, device_name);
1521de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    } else {
1522de4849cee04a23ae84da96487e344f75f93e5585vivek mehta        strlcpy(device_name, "none", DEVICE_NAME_MAX_SIZE);
1523de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    }
1524de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1525de4849cee04a23ae84da96487e344f75f93e5585vivek mehta    return 0;
1526de4849cee04a23ae84da96487e344f75f93e5585vivek mehta}
1527de4849cee04a23ae84da96487e344f75f93e5585vivek mehta
1528299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamandavoid platform_add_backend_name(void *platform, char *mixer_path,
1529299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda                               snd_device_t snd_device)
1530b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1531299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
1532299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda
153398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
153498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
153598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        return;
15361de6e5aac3120408a003dc8b5f7fdd68c40f436dRavi Kumar Alamanda    }
153798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
1538b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    const char * suffix = backend_tag_table[snd_device];
153998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
154098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if (suffix != NULL) {
154198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        strcat(mixer_path, " ");
154298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        strcat(mixer_path, suffix);
1543299760a41231bd0f6d9991fb189977347365c72bRavi Kumar Alamanda    }
1544b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1545b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1546b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandabool platform_check_backends_match(snd_device_t snd_device1, snd_device_t snd_device2)
1547b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda{
1548b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    bool result = true;
1549b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1550b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: snd_device1 = %s, snd_device2 = %s", __func__,
1551b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device1),
1552b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device2));
1553b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1554b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if ((snd_device1 < SND_DEVICE_MIN) || (snd_device1 >= SND_DEVICE_MAX)) {
1555b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGE("%s: Invalid snd_device = %s", __func__,
1556b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device1));
1557b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        return false;
1558b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1559b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if ((snd_device2 < SND_DEVICE_MIN) || (snd_device2 >= SND_DEVICE_MAX)) {
1560b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGE("%s: Invalid snd_device = %s", __func__,
1561b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                platform_get_snd_device_name(snd_device2));
1562b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        return false;
1563b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1564b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    const char * be_itf1 = hw_interface_table[snd_device1];
1565b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    const char * be_itf2 = hw_interface_table[snd_device2];
1566b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1567b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (NULL != be_itf1 && NULL != be_itf2) {
1568e63e61d40e171b60b8345f2a47022d066aa589f2Eric Laurent        if ((NULL == strstr(be_itf2, be_itf1)) && (NULL == strstr(be_itf1, be_itf2)))
1569b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda            result = false;
1570b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
1571b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1572b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: be_itf1 = %s, be_itf2 = %s, match %d", __func__, be_itf1, be_itf2, result);
1573b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    return result;
1574b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda}
1575b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
1576b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_get_pcm_device_id(audio_usecase_t usecase, int device_type)
1577b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1578b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int device_id;
1579b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (device_type == PCM_PLAYBACK)
1580b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        device_id = pcm_device_table[usecase][0];
1581b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    else
1582b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        device_id = pcm_device_table[usecase][1];
1583b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return device_id;
1584b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1585b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
158698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgestatic int find_index(const struct name_to_index * table, int32_t len,
158798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George                      const char * name)
15885bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{
15895bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    int ret = 0;
159098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int32_t i;
15915bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
159298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if (table == NULL) {
159398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: table is NULL", __func__);
15945bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        ret = -ENODEV;
15955bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        goto done;
15965bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    }
15975bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
159898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if (name == NULL) {
159998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("null key");
160098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -ENODEV;
160198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        goto done;
160298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
160398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
160498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    for (i=0; i < len; i++) {
160598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        if (!strcmp(table[i].name, name)) {
160698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George            ret = table[i].index;
16075bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George            goto done;
16085bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        }
16095bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    }
161098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    ALOGE("%s: Could not find index for name = %s",
161198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George            __func__, name);
16125bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    ret = -ENODEV;
16135bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone:
16145bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    return ret;
16155bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George}
16165bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
161798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_get_snd_device_index(char *device_name)
161898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
161998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return find_index(snd_device_name_index, SND_DEVICE_MAX, device_name);
162098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
162198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
162298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_get_usecase_index(const char *usecase_name)
162398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
162498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return find_index(usecase_name_index, AUDIO_USECASE_MAX, usecase_name);
162598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
162698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
16272f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.parkvoid platform_add_operator_specific_device(snd_device_t snd_device,
16282f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                                           const char *operator,
16292f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                                           const char *mixer_path,
16302f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                                           unsigned int acdb_id)
16312f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park{
16322f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    struct operator_specific_device *device;
16332f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16342f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (operator_specific_device_table[snd_device] == NULL) {
16352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        operator_specific_device_table[snd_device] =
16362f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            (struct listnode *)calloc(1, sizeof(struct listnode));
16372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        list_init(operator_specific_device_table[snd_device]);
16382f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
16392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16402f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device = (struct operator_specific_device *)calloc(1, sizeof(struct operator_specific_device));
16412f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16422f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device->operator = strdup(operator);
16432f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device->mixer_path = strdup(mixer_path);
16442f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    device->acdb_id = acdb_id;
16452f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16462f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    list_add_tail(operator_specific_device_table[snd_device], &device->list);
16472f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16482bafff1dddf04fa120f30b443e9a9e86a52923fcEric Laurent    ALOGD("%s: device[%s] -> operator[%s] mixer_path[%s] acdb_id[%d]", __func__,
16492f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park            platform_get_snd_device_name(snd_device), operator, mixer_path, acdb_id);
16502f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16512f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park}
16522f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16535bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgeint platform_set_snd_device_acdb_id(snd_device_t snd_device, unsigned int acdb_id)
16545bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George{
16555bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    int ret = 0;
16565bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
16575bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
16585bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        ALOGE("%s: Invalid snd_device = %d",
16595bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George            __func__, snd_device);
16605bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        ret = -EINVAL;
16615bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George        goto done;
16625bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    }
16635bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
1664b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: acdb_device_table[%s]: old = %d new = %d", __func__,
1665b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda          platform_get_snd_device_name(snd_device), acdb_device_table[snd_device], acdb_id);
16665bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    acdb_device_table[snd_device] = acdb_id;
16675bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew Georgedone:
16685bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George    return ret;
16695bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George}
16705bc188456348ebdfc5d3c86414952503ec41bd44Haynes Mathew George
1671cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kastenint platform_get_default_app_type_v2(void *platform __unused, usecase_type_t type __unused,
1672cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten                                     int *app_type __unused)
1673e3b9956373beb54b67957675b6e6d99fd3280edaYamit Mehta{
1674e3b9956373beb54b67957675b6e6d99fd3280edaYamit Mehta    ALOGE("%s: Not implemented", __func__);
1675e3b9956373beb54b67957675b6e6d99fd3280edaYamit Mehta    return -ENOSYS;
1676e3b9956373beb54b67957675b6e6d99fd3280edaYamit Mehta}
1677e3b9956373beb54b67957675b6e6d99fd3280edaYamit Mehta
167863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamandaint platform_get_snd_device_acdb_id(snd_device_t snd_device)
167963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda{
168063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
168163863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
168263863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        return -EINVAL;
168363863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    }
16842f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
16852f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (operator_specific_device_table[snd_device] != NULL)
16862f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        return get_operator_specific_device_acdb_id(snd_device);
16872f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    else
16882f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        return acdb_device_table[snd_device];
168963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda}
169063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
1691ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic int platform_get_backend_index(snd_device_t snd_device)
1692ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
1693ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int32_t port = DEFAULT_CODEC_BACKEND;
1694ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1695ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (snd_device >= SND_DEVICE_OUT_BEGIN && snd_device < SND_DEVICE_OUT_END) {
1696ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (backend_tag_table[snd_device] != NULL) {
1697ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                if (strncmp(backend_tag_table[snd_device], "headphones",
1698ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                            sizeof("headphones")) == 0)
1699ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                        port = HEADPHONE_BACKEND;
1700ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                else if (strcmp(backend_tag_table[snd_device], "hdmi") == 0)
1701ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                        port = HDMI_RX_BACKEND;
1702ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                else if ((strcmp(backend_tag_table[snd_device], "usb-headphones") == 0) ||
1703ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                           (strcmp(backend_tag_table[snd_device], "usb-headset") == 0))
1704ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                        port = USB_AUDIO_RX_BACKEND;
1705ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
1706ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    } else if (snd_device >= SND_DEVICE_IN_BEGIN && snd_device < SND_DEVICE_IN_END) {
1707ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        port = DEFAULT_CODEC_TX_BACKEND;
1708ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (backend_tag_table[snd_device] != NULL) {
1709ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                if (strcmp(backend_tag_table[snd_device], "usb-headset-mic") == 0)
1710ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                        port = USB_AUDIO_TX_BACKEND;
1711ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                else if (strstr(backend_tag_table[snd_device], "bt-sco") != NULL)
1712ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                        port = BT_SCO_TX_BACKEND;
1713ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
1714ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    } else {
1715ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
1716ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
1717ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1718ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:napb: backend port - %d device - %d ", __func__, port, snd_device);
1719ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1720ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return port;
1721ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
1722ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
1723b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_send_audio_calibration(void *platform, snd_device_t snd_device)
1724b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1725b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1726b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int acdb_dev_id, acdb_dev_type;
1727b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1728adf0f3b3b518e98fc1056e2788dd936e87331fb1Ravi Kumar Alamanda    acdb_dev_id = acdb_device_table[audio_extn_get_spkr_prot_snd_device(snd_device)];
1729b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (acdb_dev_id < 0) {
1730b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not find acdb id for device(%d)",
1731b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, snd_device);
1732b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
1733b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1734b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_send_audio_cal) {
1735188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato        ALOGV("%s: sending audio calibration for snd_device(%d) acdb_id(%d)",
1736b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, snd_device, acdb_dev_id);
1737b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device >= SND_DEVICE_OUT_BEGIN &&
1738b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device < SND_DEVICE_OUT_END)
1739b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            acdb_dev_type = ACDB_DEV_TYPE_OUT;
1740b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
1741b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            acdb_dev_type = ACDB_DEV_TYPE_IN;
1742b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        my_data->acdb_send_audio_cal(acdb_dev_id, acdb_dev_type);
1743b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1744b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
1745b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1746b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1747b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_pre(void *platform)
1748b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
174983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
175083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
175183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
175283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL &&
1753b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda        voice_is_in_call(my_data->adev)) {
175483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        /* This must be called before disabling mixer controls on APQ side */
175583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->disable_device();
175683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
175783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_client_disable_device, failed, error %d",
175883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, ret);
175983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
176083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
176183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
176283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
176383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
176483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_enable_device_config(void *platform,
176583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    snd_device_t out_snd_device,
176683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                    snd_device_t in_snd_device)
176783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
176883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
176983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int acdb_rx_id, acdb_tx_id;
177083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
177183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
177283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd == NULL)
177383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        return ret;
177483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
177563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
177663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        audio_extn_spkr_prot_is_enabled())
17772f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_SPEAKER_PROTECTED);
177863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    else
17792f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device);
178083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
17812f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device);
178283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
178383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (acdb_rx_id > 0 && acdb_tx_id > 0) {
178483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->enable_device_config(acdb_rx_id, acdb_tx_id);
178583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
178683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_enable_device_config, failed, error %d",
178783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                  __func__, ret);
178883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
178983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
179083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
179183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda              acdb_rx_id, acdb_tx_id);
179283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
179383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
179483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1795b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1796b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1797b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_switch_voice_call_device_post(void *platform,
1798b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                           snd_device_t out_snd_device,
1799b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                           snd_device_t in_snd_device)
1800b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1801b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1802b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int acdb_rx_id, acdb_tx_id;
1803b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1804b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (my_data->acdb_send_voice_cal == NULL) {
1805b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: dlsym error for acdb_send_voice_call", __func__);
1806b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
180763863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
180863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda            audio_extn_spkr_prot_is_enabled())
180963863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda            out_snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED;
181063863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda
18112f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device);
18122f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device);
1813b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1814b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (acdb_rx_id > 0 && acdb_tx_id > 0)
1815b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            my_data->acdb_send_voice_cal(acdb_rx_id, acdb_tx_id);
1816b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
1817b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
1818b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                  acdb_rx_id, acdb_tx_id);
1819b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
1820b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1821b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
1822b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1823b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
182483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamandaint platform_switch_voice_call_usecase_route_post(void *platform,
182583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                  snd_device_t out_snd_device,
182683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                                  snd_device_t in_snd_device)
182783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda{
182883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
182983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int acdb_rx_id, acdb_tx_id;
183083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
183183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
183283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd == NULL)
183383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        return ret;
183483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
183563863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    if (out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER &&
183663863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda        audio_extn_spkr_prot_is_enabled())
18372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(SND_DEVICE_OUT_VOICE_SPEAKER_PROTECTED);
183863863001b659b66a367800c39f4a016ec5d544d7Ravi Kumar Alamanda    else
18392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        acdb_rx_id = platform_get_snd_device_acdb_id(out_snd_device);
184083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
18412f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    acdb_tx_id = platform_get_snd_device_acdb_id(in_snd_device);
184283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
184383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (acdb_rx_id > 0 && acdb_tx_id > 0) {
184483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->enable_device(acdb_rx_id, acdb_tx_id,
184583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                          my_data->adev->acdb_settings);
184683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
184783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_enable_device, failed, error %d", __func__, ret);
184883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
184983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    } else {
185083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ALOGE("%s: Incorrect ACDB IDs (rx: %d tx: %d)", __func__,
185183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda              acdb_rx_id, acdb_tx_id);
185283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
185383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
185483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
185583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda}
185683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
18574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_start_voice_call(void *platform, uint32_t vsid)
1858b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
185983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
186083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
186183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
186283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
18634b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->start_voice(vsid);
186483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
186583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_start_voice error %d\n", __func__, ret);
186683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
186783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
186883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1869b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1870b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
18714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_voice_call(void *platform, uint32_t vsid)
1872b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
187383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
187483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    int ret = 0;
187583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda
187683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
18774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->stop_voice(vsid);
187883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
187983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_stop_voice error %d\n", __func__, ret);
188083281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
188183281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
188283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1883b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1884b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
18854b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_get_sample_rate(void *platform, uint32_t *rate)
18864b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
18874b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
18884b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
18894b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
18904b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
18914b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->get_sample_rate(rate);
18924b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
18934b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_get_sample_rate error %d\n", __func__, ret);
18944b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
18954b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
18964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
18974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
18984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
1899b65064161c19b4c688f8a436ed002264d9f49055vivek mehtavoid platform_set_speaker_gain_in_combo(struct audio_device *adev,
1900b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                                        snd_device_t snd_device,
1901b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                                        bool enable)
1902b65064161c19b4c688f8a436ed002264d9f49055vivek mehta{
1903b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    const char* name;
1904b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    switch (snd_device) {
1905b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES:
1906b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1907b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-gain-in-headphone-combo";
1908b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1909b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-gain-default";
1910b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1911b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_AND_LINE:
1912b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1913b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-gain-in-line-combo";
1914b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1915b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-gain-default";
1916b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1917b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES:
1918b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1919b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-safe-gain-in-headphone-combo";
1920b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1921b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-safe-gain-default";
1922b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1923b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        case SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE:
1924b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            if (enable)
1925b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "spkr-safe-gain-in-line-combo";
1926b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            else
1927b65064161c19b4c688f8a436ed002264d9f49055vivek mehta                name = "speaker-safe-gain-default";
1928b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            break;
1929b65064161c19b4c688f8a436ed002264d9f49055vivek mehta        default:
1930b65064161c19b4c688f8a436ed002264d9f49055vivek mehta            return;
1931b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    }
1932b65064161c19b4c688f8a436ed002264d9f49055vivek mehta
1933b65064161c19b4c688f8a436ed002264d9f49055vivek mehta    audio_route_apply_and_update_path(adev->audio_route, name);
1934b65064161c19b4c688f8a436ed002264d9f49055vivek mehta}
1935b65064161c19b4c688f8a436ed002264d9f49055vivek mehta
1936b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_voice_volume(void *platform, int volume)
1937b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1938b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1939b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1940b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
194153b2cf0c72aa18a5848919e2309731af652e84f9sangwoo    const char *mixer_ctl_name = "Voice Rx Gain";
19424b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int vol_index = 0, ret = 0;
19434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    uint32_t set_values[ ] = {0,
19444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              ALL_SESSION_VSID,
19454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              DEFAULT_VOLUME_RAMP_DURATION_MS};
1946b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1947b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // Voice volume levels are mapped to adsp volume levels as follows.
1948b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // 100 -> 5, 80 -> 4, 60 -> 3, 40 -> 2, 20 -> 1  0 -> 0
1949b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    // But this values don't changed in kernel. So, below change is need.
1950c5aaa0e767b83fa8299861a739a4a1cb8e9bee0fkeunhui.park    vol_index = (int)percent_to_index(volume, MIN_VOL_INDEX, my_data->max_vol_index);
19514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    set_values[0] = vol_index;
1952b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1953b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
1954b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
1955b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
1956b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
1957b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
1958b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
19594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ALOGV("Setting voice volume index: %d", set_values[0]);
19604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
19614b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
196283281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    if (my_data->csd != NULL) {
196383281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        ret = my_data->csd->volume(ALL_SESSION_VSID, volume,
196483281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda                                   DEFAULT_VOLUME_RAMP_DURATION_MS);
196583281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        if (ret < 0) {
196683281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda            ALOGE("%s: csd_volume error %d", __func__, ret);
196783281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda        }
196883281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    }
196983281a951af159ca00517f6132fab39727b293f5Ravi Kumar Alamanda    return ret;
1970b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
1971b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
1972b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_mic_mute(void *platform, bool state)
1973b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
1974b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
1975b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
1976b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
1977b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "Voice Tx Mute";
197853b2cf0c72aa18a5848919e2309731af652e84f9sangwoo    int ret = 0;
19794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    uint32_t set_values[ ] = {0,
19804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              ALL_SESSION_VSID,
19814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              DEFAULT_MUTE_RAMP_DURATION_MS};
1982cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
1983a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti    if (adev->mode != AUDIO_MODE_IN_CALL &&
1984a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti        adev->mode != AUDIO_MODE_IN_COMMUNICATION)
19854b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return 0;
19864b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
1987a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti    if (adev->enable_hfp)
1988a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti        mixer_ctl_name = "HFP Tx Mute";
1989a1f480505a2e11b65e8fe6590239bd87b3a33f11Uday Kishore Pasupuleti
19904b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    set_values[0] = state;
19914b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
19924b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!ctl) {
19934b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Could not get ctl for mixer cmd - %s",
19944b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava              __func__, mixer_ctl_name);
19954b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
19964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
19974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ALOGV("Setting voice mute state: %d", state);
19984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
19994b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
20004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
20014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->mic_mute(ALL_SESSION_VSID, state,
20024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                     DEFAULT_MUTE_RAMP_DURATION_MS);
2003a609e8ebdfeca875b6d35ccfb3fb8b87710f3499Eric Laurent        if (ret < 0) {
20044b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_mic_mute error %d", __func__, ret);
200553b2cf0c72aa18a5848919e2309731af652e84f9sangwoo        }
2006cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George    }
20074b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
20084b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
2009cedf1ac3c00e331b5f51b077f26c1367544ddd65Haynes Mathew George
20104b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_set_device_mute(void *platform, bool state, char *dir)
20114b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
20124b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
20134b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct audio_device *adev = my_data->adev;
20144b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct mixer_ctl *ctl;
20154b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    char *mixer_ctl_name = NULL;
20164b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
20174b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    uint32_t set_values[ ] = {0,
20184b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              ALL_SESSION_VSID,
20194b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                              0};
20204b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if(dir == NULL) {
20214b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Invalid direction:%s", __func__, dir);
20224b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
20234b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
20244b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
20254b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!strncmp("rx", dir, sizeof("rx"))) {
20264b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        mixer_ctl_name = "Voice Rx Device Mute";
20274b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    } else if (!strncmp("tx", dir, sizeof("tx"))) {
20284b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        mixer_ctl_name = "Voice Tx Device Mute";
20294b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    } else {
20304b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
20314b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
20324b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
20334b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    set_values[0] = state;
20344b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
20354b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!ctl) {
20364b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Could not get ctl for mixer cmd - %s",
20374b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava              __func__, mixer_ctl_name);
20384b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        return -EINVAL;
20394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
20404b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
20414b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ALOGV("%s: Setting device mute state: %d, mixer ctrl:%s",
20424b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava          __func__,state, mixer_ctl_name);
20434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    mixer_ctl_set_array(ctl, set_values, ARRAY_SIZE(set_values));
20444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
20454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
2046b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
2047b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
20482d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew Georgeint platform_can_split_snd_device(snd_device_t snd_device,
20492d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George                                  int *num_devices,
20502d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George                                  snd_device_t *new_snd_devices)
2051b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda{
20522d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George    int ret = -EINVAL;
2053b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (NULL == num_devices || NULL == new_snd_devices) {
2054b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGE("%s: NULL pointer ..", __func__);
20552d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George        return -EINVAL;
2056b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
2057b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
2058b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    /*
2059b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda     * If wired headset/headphones/line devices share the same backend
20602d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George     * with speaker/earpiece this routine returns -EINVAL.
2061b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda     */
2062b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES &&
2063b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_HEADPHONES)) {
2064b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        *num_devices = 2;
2065b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
2066b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
20672d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George        ret = 0;
2068b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_LINE &&
2069b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_LINE)) {
2070b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        *num_devices = 2;
2071b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
2072b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_LINE;
20732d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George        ret = 0;
20743b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES &&
20753b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE, SND_DEVICE_OUT_HEADPHONES)) {
20763b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        *num_devices = 2;
20773b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE;
20783b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_HEADPHONES;
20792d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George        ret = 0;
20803b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE &&
20813b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER_SAFE, SND_DEVICE_OUT_LINE)) {
20823b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        *num_devices = 2;
20833b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER_SAFE;
20843b86d472a707dd29cd692909fc80cf45a8fec481Ravi Kumar Alamanda        new_snd_devices[1] = SND_DEVICE_OUT_LINE;
20852d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George        ret = 0;
20866dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO &&
20876dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER,
20886dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George                                              SND_DEVICE_OUT_BT_SCO)) {
20896dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        *num_devices = 2;
20906dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
20916dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        new_snd_devices[1] = SND_DEVICE_OUT_BT_SCO;
20926dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        ret = 0;
20936dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB &&
20946dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER,
20956dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George                                              SND_DEVICE_OUT_BT_SCO_WB)) {
20966dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        *num_devices = 2;
20976dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
20986dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        new_snd_devices[1] = SND_DEVICE_OUT_BT_SCO_WB;
20996dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        ret = 0;
2100ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    } else if (snd_device == SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET &&
2101ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin               !platform_check_backends_match(SND_DEVICE_OUT_SPEAKER, SND_DEVICE_OUT_USB_HEADSET)) {
2102ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        *num_devices = 2;
2103ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        new_snd_devices[0] = SND_DEVICE_OUT_SPEAKER;
2104ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        new_snd_devices[1] = SND_DEVICE_OUT_USB_HEADSET;
2105ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ret = 0;
2106b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
21072d809e0d104497ca6b7a1e1be4efdf7856070aa5Haynes Mathew George    return ret;
2108b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda}
2109b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
2110b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_output_snd_device(void *platform, audio_devices_t devices)
2111b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
2112b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
2113b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
2114b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_mode_t mode = adev->mode;
2115b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
2116b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2117b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: enter: output devices(%#x)", __func__, devices);
2118b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (devices == AUDIO_DEVICE_NONE ||
2119b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        devices & AUDIO_DEVICE_BIT_IN) {
2120b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGV("%s: Invalid output devices (%#x)", __func__, devices);
2121b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
2122b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2123b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
21241b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    if (popcount(devices) == 2) {
21251b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
21261b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                        AUDIO_DEVICE_OUT_SPEAKER) ||
21271b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
21281b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                            AUDIO_DEVICE_OUT_SPEAKER)) {
21291b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HEADPHONES;
21301b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_LINE |
21311b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER)) {
21321b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_LINE;
21331b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_WIRED_HEADPHONE |
21341b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER_SAFE) ||
21351b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                   devices == (AUDIO_DEVICE_OUT_WIRED_HEADSET |
21361b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
21371b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_HEADPHONES;
21381b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_LINE |
21391b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
21401b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_SAFE_AND_LINE;
21411b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else if (devices == (AUDIO_DEVICE_OUT_AUX_DIGITAL |
21421b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent                               AUDIO_DEVICE_OUT_SPEAKER)) {
21431b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_AND_HDMI;
21446dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George        } else if ((devices & AUDIO_DEVICE_OUT_ALL_SCO) &&
21456dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George                   ((devices & ~AUDIO_DEVICE_OUT_ALL_SCO) == AUDIO_DEVICE_OUT_SPEAKER)) {
21466dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George            snd_device = adev->bt_wb_speech_enabled ?
21476dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George                    SND_DEVICE_OUT_SPEAKER_AND_BT_SCO_WB :
21486dcb1a8afb533aea509fd7ffbe7a442c9e15fdb7Haynes Mathew George                    SND_DEVICE_OUT_SPEAKER_AND_BT_SCO;
2149ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        } else if (devices == (AUDIO_DEVICE_OUT_USB_DEVICE |
2150ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                               AUDIO_DEVICE_OUT_SPEAKER)) {
2151ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            snd_device = SND_DEVICE_OUT_SPEAKER_AND_USB_HEADSET;
21521b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        } else {
21531b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            ALOGE("%s: Invalid combo device(%#x)", __func__, devices);
21541b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            goto exit;
21551b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        }
21561b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        if (snd_device != SND_DEVICE_NONE) {
21571b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent            goto exit;
21581b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        }
21591b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    }
21601b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent
21611b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    if (popcount(devices) != 1) {
21621b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        ALOGE("%s: Invalid output devices(%#x)", __func__, devices);
21631b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent        goto exit;
21641b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent    }
21651b49155ca2a0b056d09f159861ad0d251a36116dEric Laurent
21663f6051b52e65adc33988afc17df5d2c2b9a8d01bMadhuri Athota    if (voice_is_in_call(adev) || adev->enable_voicerx || audio_extn_hfp_is_active(adev)) {
2167b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
216809f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent            devices & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
216909f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent            devices & AUDIO_DEVICE_OUT_LINE) {
2170b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda            if (voice_is_in_call(adev) &&
2171cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                (adev->voice.tty_mode == TTY_MODE_FULL))
2172b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_HEADPHONES;
2173b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda            else if (voice_is_in_call(adev) &&
2174cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                (adev->voice.tty_mode == TTY_MODE_VCO))
2175b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_HEADPHONES;
2176b09e4a04c7a8ca770affbf48f154222ccd083f4bRavi Kumar Alamanda            else if (voice_is_in_call(adev) &&
2177cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                (adev->voice.tty_mode == TTY_MODE_HCO))
2178b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
217909f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent            else {
218009f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                if (devices & AUDIO_DEVICE_OUT_LINE)
218109f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                    snd_device = SND_DEVICE_OUT_VOICE_LINE;
218209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                else
218309f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                    snd_device = SND_DEVICE_OUT_VOICE_HEADPHONES;
218409f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                }
2185a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta        } else if (devices & AUDIO_DEVICE_OUT_USB_DEVICE) {
2186a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta            if (voice_is_in_call(adev)) {
2187a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                switch (adev->voice.tty_mode) {
2188a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_FULL:
2189a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_OUT_VOICE_TTY_FULL_USB;
2190a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2191a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_VCO:
2192a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_OUT_VOICE_TTY_VCO_USB;
2193a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2194a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_HCO:
2195a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        // since Hearing will be on handset\speaker, use existing device
2196a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_OUT_VOICE_TTY_HCO_HANDSET;
2197a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2198a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    default:
2199a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        ALOGE("%s: Invalid TTY mode (%#x)",
2200a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                              __func__, adev->voice.tty_mode);
2201a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                }
2202a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta            }
2203b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
22049f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
22059f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_OUT_BT_SCO_WB;
22069f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
22079f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda                snd_device = SND_DEVICE_OUT_BT_SCO;
22089f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
22091b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent        } else if (devices & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE)) {
22107629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti            if (!adev->enable_hfp) {
22117629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                snd_device = SND_DEVICE_OUT_VOICE_SPEAKER;
22127629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti            } else {
22137629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_HFP;
22147629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti            }
2215b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
22169d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            if(adev->voice.hac)
22179d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET;
22189d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            else if (is_operator_tmus())
2219b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HANDSET_TMUS;
2220b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            else
2221b4d368e0fe6006657ebc4e1f9ba01a072c4ca2c7Eric Laurent                snd_device = SND_DEVICE_OUT_VOICE_HANDSET;
222299c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda        } else if (devices & AUDIO_DEVICE_OUT_TELEPHONY_TX)
222399c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_VOICE_TX;
222499c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda
2225b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (snd_device != SND_DEVICE_NONE) {
2226b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            goto exit;
2227b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2228b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2229b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2230b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (devices & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
2231b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        devices & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
2232b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HEADPHONES;
223309f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_LINE) {
223409f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent        snd_device = SND_DEVICE_OUT_LINE;
22351b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent    } else if (devices & AUDIO_DEVICE_OUT_SPEAKER_SAFE) {
22361b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent        snd_device = SND_DEVICE_OUT_SPEAKER_SAFE;
2237b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
22381f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        if (my_data->speaker_lr_swap)
2239b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
2240b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        else
2241b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_OUT_SPEAKER;
2242b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_ALL_SCO) {
22439f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        if (adev->bt_wb_speech_enabled) {
22449f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_BT_SCO_WB;
22459f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        } else {
22469f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            snd_device = SND_DEVICE_OUT_BT_SCO;
22479f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda        }
2248b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (devices & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2249b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        snd_device = SND_DEVICE_OUT_HDMI ;
2250ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    } else if (devices & AUDIO_DEVICE_OUT_USB_DEVICE) {
2251ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (audio_extn_usb_is_capture_supported())
2252ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            snd_device = SND_DEVICE_OUT_USB_HEADSET;
2253ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        else
2254ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            snd_device = SND_DEVICE_OUT_USB_HEADPHONES;
2255ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }else if (devices & AUDIO_DEVICE_OUT_EARPIECE) {
22569d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent        /*HAC support for voice-ish audio (eg visual voicemail)*/
22579d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent        if(adev->voice.hac)
22589d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            snd_device = SND_DEVICE_OUT_VOICE_HAC_HANDSET;
22599d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent        else
22609d0d3f1537b5d157a2c31e0744303524b846446eEric Laurent            snd_device = SND_DEVICE_OUT_HANDSET;
2261b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
2262b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Unknown device(s) %#x", __func__, devices);
2263b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2264b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit:
2265b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: exit: snd_device(%s)", __func__, device_table[snd_device]);
2266b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return snd_device;
2267b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
2268b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2269b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentsnd_device_t platform_get_input_snd_device(void *platform, audio_devices_t out_device)
2270b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
2271b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
2272b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
2273b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_source_t  source = (adev->active_input == NULL) ?
2274b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                AUDIO_SOURCE_DEFAULT : adev->active_input->source;
2275b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2276b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_mode_t    mode   = adev->mode;
2277b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_devices_t in_device = ((adev->active_input == NULL) ?
2278b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                    AUDIO_DEVICE_NONE : adev->active_input->device)
2279b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                & ~AUDIO_DEVICE_BIT_IN;
2280b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    audio_channel_mask_t channel_mask = (adev->active_input == NULL) ?
2281b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                                AUDIO_CHANNEL_IN_MONO : adev->active_input->channel_mask;
2282b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    snd_device_t snd_device = SND_DEVICE_NONE;
22833ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda    int channel_count = popcount(channel_mask);
2284b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2285c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    ALOGV("%s: enter: out_device(%#x) in_device(%#x) channel_count (%d) channel_mask (0x%x)",
2286c92c59683257878fb8dc08d827313b4a865898daPrashant Malani          __func__, out_device, in_device, channel_count, channel_mask);
2287d789e43c8aa51c38b799adad246c47a205e305e9Devin Kim    if ((out_device != AUDIO_DEVICE_NONE) && (voice_is_in_call(adev) ||
2288d789e43c8aa51c38b799adad246c47a205e305e9Devin Kim        audio_extn_hfp_is_active(adev))) {
22894b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (adev->voice.tty_mode != TTY_MODE_OFF) {
2290b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
229109f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET ||
229209f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                out_device & AUDIO_DEVICE_OUT_LINE) {
22934b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                switch (adev->voice.tty_mode) {
2294a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_FULL:
2295a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_HEADSET_MIC;
2296a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2297a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_VCO:
2298a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
2299a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2300a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_HCO:
2301a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_HEADSET_MIC;
2302a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2303a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    default:
2304a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
2305a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                }
2306a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                goto exit;
2307a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta            } else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE) {
2308a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                switch (adev->voice.tty_mode) {
2309a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_FULL:
2310a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_TTY_FULL_USB_MIC;
2311a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2312a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_VCO:
2313a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        // since voice will be captured from handset mic, use existing device
2314a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_TTY_VCO_HANDSET_MIC;
2315a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2316a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    case TTY_MODE_HCO:
2317a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_TTY_HCO_USB_MIC;
2318a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        break;
2319a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                    default:
2320a6b7974fefa1181621a776554028d3ad11011fd9vivek mehta                        ALOGE("%s: Invalid TTY mode (%#x)", __func__, adev->voice.tty_mode);
2321b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                }
2322b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                goto exit;
2323b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2324b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2325b991fb007d870cbd682273e5fc7413b9d238a6d9Eric Laurent        if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
2326b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (my_data->fluence_in_voice_call == false) {
2327b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                snd_device = SND_DEVICE_IN_HANDSET_MIC;
2328b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            } else {
23293ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (is_operator_tmus())
23303ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_DMIC_TMUS;
2331b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                else
23323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_DMIC;
2333b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2334b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
2335b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_VOICE_HEADSET_MIC;
2336b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_ALL_SCO) {
23379f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
2338e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2339e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2340e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2341e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
23429f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
2343e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2344e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2345e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2346e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC;
23479f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
2348b991fb007d870cbd682273e5fc7413b9d238a6d9Eric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER ||
2349c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE ||
2350c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
2351c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                   out_device & AUDIO_DEVICE_OUT_LINE) {
2352c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if (my_data->fluence_in_voice_call && my_data->fluence_in_spkr_mode) {
2353c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                if (my_data->source_mic_type & SOURCE_DUAL_MIC) {
2354c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_DMIC;
2355c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                } else {
2356c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
2357c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                }
2358b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2359fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta
2360fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta            //select default
2361fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta            if (snd_device == SND_DEVICE_NONE) {
23627629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                if (!adev->enable_hfp) {
23637629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC;
23647629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                } else {
23657629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                    snd_device = SND_DEVICE_IN_VOICE_SPEAKER_MIC_HFP;
23667629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                    platform_set_echo_reference(adev, true, out_device);
23677629719778eab7ca3729f26f2e5ad5120faa9c71Uday Kishore Pasupuleti                }
2368fe121d53e92525681e6cd922874c75be6d2efe7avivek mehta            }
2369c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        } else if (out_device & AUDIO_DEVICE_OUT_TELEPHONY_TX) {
237099c752d87eb818fc3cfb2e5c6790b1ea0bc88da5Ravi Kumar Alamanda            snd_device = SND_DEVICE_IN_VOICE_RX;
2371c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        }
2372b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_CAMCORDER) {
2373b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC ||
2374b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            in_device & AUDIO_DEVICE_IN_BACK_MIC) {
2375b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_CAMCORDER_MIC;
2376b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2377b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_VOICE_RECOGNITION) {
2378b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
2379c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if (my_data->fluence_in_voice_rec && channel_count == 1) {
2380c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) &&
2381c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
2382733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    if (adev->active_input->enable_aec)
2383733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_QMIC_AEC;
2384733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    else
2385733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_QMIC;
2386c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                } else if ((my_data->fluence_type == FLUENCE_PRO_ENABLE) &&
2387c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->source_mic_type & SOURCE_THREE_MIC)) {
2388733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    if (adev->active_input->enable_aec)
2389733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_TMIC_AEC;
2390733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    else
2391733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_TMIC;
2392c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                } else if (((my_data->fluence_type == FLUENCE_PRO_ENABLE) ||
2393c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->fluence_type == FLUENCE_ENABLE)) &&
2394c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
2395733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    if (adev->active_input->enable_aec)
2396733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
2397733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    else
2398733c1df5828d63f547553b4a441668905306a4e2vivek mehta                        snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_FLUENCE;
2399c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                }
2400c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                platform_set_echo_reference(adev, true, out_device);
2401c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) &&
2402c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
2403c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_VOICE_REC_DMIC_STEREO;
2404cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten            } else if ((channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) &&
2405c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (my_data->source_mic_type & SOURCE_THREE_MIC)) {
2406c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_THREE_MIC;
2407cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten            } else if ((channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) &&
2408c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
2409c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_QUAD_MIC;
2410b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
2411b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            if (snd_device == SND_DEVICE_NONE) {
2412f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                if (adev->active_input->enable_aec) {
2413f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                    if (adev->active_input->enable_ns) {
2414f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                        snd_device = SND_DEVICE_IN_VOICE_REC_MIC_AEC_NS;
2415f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                    } else {
2416f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                        snd_device = SND_DEVICE_IN_VOICE_REC_MIC_AEC;
2417f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                    }
2418733c1df5828d63f547553b4a441668905306a4e2vivek mehta                    platform_set_echo_reference(adev, true, out_device);
2419f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                } else if (adev->active_input->enable_ns) {
2420f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                    snd_device = SND_DEVICE_IN_VOICE_REC_MIC_NS;
2421f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                } else {
24223ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    snd_device = SND_DEVICE_IN_VOICE_REC_MIC;
2423f344068f97c2b5102bcd8540b42ac6c5f87c305evivek mehta                }
2424b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            }
24258c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
24268c83fe85b6d1257298208de043acece927787c3fJean-Michel Trivi            snd_device = SND_DEVICE_IN_VOICE_REC_HEADSET_MIC;
2427b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
242890fb96106e9e2db75e214722c797d013e10e5328rago    } else if (source == AUDIO_SOURCE_UNPROCESSED) {
242990fb96106e9e2db75e214722c797d013e10e5328rago        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
24304ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            if (((channel_mask == AUDIO_CHANNEL_IN_FRONT_BACK) ||
24314ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                 (channel_mask == AUDIO_CHANNEL_IN_STEREO)) &&
24324ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                       (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
24334ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_STEREO_MIC;
2434cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten            } else if ((channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) &&
24354ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                       (my_data->source_mic_type & SOURCE_THREE_MIC)) {
24364ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_THREE_MIC;
2437cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten            } else if ((channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) &&
24384ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                       (my_data->source_mic_type & SOURCE_QUAD_MIC)) {
24394ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_QUAD_MIC;
24404ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            } else {
24414ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta                snd_device = SND_DEVICE_IN_UNPROCESSED_MIC;
24424ed66e62279001cd62e5acec53f3e1cf5d64e77dvivek mehta            }
244390fb96106e9e2db75e214722c797d013e10e5328rago        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
244490fb96106e9e2db75e214722c797d013e10e5328rago            snd_device = SND_DEVICE_IN_UNPROCESSED_HEADSET_MIC;
244590fb96106e9e2db75e214722c797d013e10e5328rago        }
244650a38ed90672924763c4cb18773fca64588faeccEric Laurent    } else if (source == AUDIO_SOURCE_VOICE_COMMUNICATION ||
244790fb96106e9e2db75e214722c797d013e10e5328rago               mode == AUDIO_MODE_IN_COMMUNICATION) {
24481b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent        if (out_device & (AUDIO_DEVICE_OUT_SPEAKER | AUDIO_DEVICE_OUT_SPEAKER_SAFE))
2449b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            in_device = AUDIO_DEVICE_IN_BACK_MIC;
2450b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (adev->active_input) {
24513ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            if (adev->active_input->enable_aec &&
24523ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    adev->active_input->enable_ns) {
24533ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
24543ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_spkr_mode &&
24553ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                            my_data->fluence_in_voice_comm &&
2456c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
24573ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC_NS;
2458c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
24593ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC_NS;
2460c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
24613ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
24623ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_voice_comm &&
2463c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
24643ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC_NS;
2465c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
24663ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC_NS;
2467c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
2468cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2469cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                    snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC;
24703ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                }
2471cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                platform_set_echo_reference(adev, true, out_device);
24723ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            } else if (adev->active_input->enable_aec) {
2473b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
24743ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_spkr_mode &&
24753ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                            my_data->fluence_in_voice_comm &&
2476c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
24773ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_DMIC_AEC;
2478c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
24793ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_MIC_AEC;
2480c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
2481b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
24823ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_voice_comm &&
2483c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
24843ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_AEC;
2485c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
24863ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_MIC_AEC;
2487c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
2488cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent               } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2489cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent                   snd_device = SND_DEVICE_IN_HEADSET_MIC_AEC;
2490cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent               }
2491f28290178598c01d29f152a46483e5e8bd67b0e0Ravi Kumar Alamanda               platform_set_echo_reference(adev, true, out_device);
24923ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda            } else if (adev->active_input->enable_ns) {
24933ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
24943ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_spkr_mode &&
24953ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                            my_data->fluence_in_voice_comm &&
2496c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
24973ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_DMIC_NS;
2498c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
24993ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_SPEAKER_MIC_NS;
2500c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
25013ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                } else if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
25023ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                    if (my_data->fluence_in_voice_comm &&
2503c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            (my_data->source_mic_type & SOURCE_DUAL_MIC)) {
25043ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_DMIC_NS;
2505c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    } else {
25063ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                        snd_device = SND_DEVICE_IN_HANDSET_MIC_NS;
2507c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    }
25083ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                }
2509cefbbac40220d4e7690d204eecff5f6ae3f63069Eric Laurent            }
2510b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2511b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else if (source == AUDIO_SOURCE_DEFAULT) {
2512b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
2513b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2514b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2515b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2516b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (snd_device != SND_DEVICE_NONE) {
2517b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        goto exit;
2518b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2519b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2520b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (in_device != AUDIO_DEVICE_NONE &&
2521b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            !(in_device & AUDIO_DEVICE_IN_VOICE_CALL) &&
2522b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            !(in_device & AUDIO_DEVICE_IN_COMMUNICATION)) {
2523b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (in_device & AUDIO_DEVICE_IN_BUILTIN_MIC) {
2524c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if ((my_data->source_mic_type & SOURCE_QUAD_MIC) &&
2525cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten                channel_mask == AUDIO_CHANNEL_INDEX_MASK_4) {
2526c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_QUAD_MIC;
2527c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_THREE_MIC) &&
2528cbe06cab2f36c0d54544f42b8eac51bbdbfc0e5eGlenn Kasten                       channel_mask == AUDIO_CHANNEL_INDEX_MASK_3) {
2529c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_THREE_MIC;
2530c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
2531c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       channel_count == 2) {
25323ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_HANDSET_DMIC_STEREO;
2533c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
2534c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       channel_count == 1) {
2535dae4471837fcdbd9356e3745b66f23f921fb531bvivek mehta                snd_device = SND_DEVICE_IN_HANDSET_MIC;
2536c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else {
2537c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                ALOGE("%s: something wrong (1): source type (%d) channel_count (%d) .."
2538c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                      " channel mask (0x%x) no combination found .. setting to mono", __func__,
2539c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       my_data->source_mic_type, channel_count, channel_mask);
2540c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_HANDSET_MIC;
2541c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            }
2542b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_BACK_MIC) {
2543c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
2544c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    channel_count == 2) {
25453ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_DMIC_STEREO;
2546c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
2547c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    channel_count == 1) {
2548c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2549c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else {
2550c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                ALOGE("%s: something wrong (2): source type (%d) channel_count (%d) .."
2551c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                      " no combination found .. setting to mono", __func__,
2552c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       my_data->source_mic_type, channel_count);
25533ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2554c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            }
2555b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_WIRED_HEADSET) {
2556b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HEADSET_MIC;
2557b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET) {
25589f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
2559e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2560e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2561e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2562e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
25639f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
2564e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2565e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2566e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2567e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC;
25689f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
2569b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
2570b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HDMI_MIC;
2571ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        } else if (in_device & AUDIO_DEVICE_IN_USB_DEVICE ) {
2572ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
2573b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
2574b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Unknown input device(s) %#x", __func__, in_device);
2575b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGW("%s: Using default handset-mic", __func__);
2576b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
2577b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2578b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    } else {
2579b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (out_device & AUDIO_DEVICE_OUT_EARPIECE) {
2580b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
2581b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_WIRED_HEADSET) {
2582b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HEADSET_MIC;
25833ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda        } else if (out_device & AUDIO_DEVICE_OUT_SPEAKER ||
25841b0d8ce4ec97a57b38a401dbd1e16ac5cf4c4671Eric Laurent                   out_device & AUDIO_DEVICE_OUT_SPEAKER_SAFE ||
25853ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                   out_device & AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
258609f2e0e6bf8accf1728ca89e780702d53f2c5b6dEric Laurent                   out_device & AUDIO_DEVICE_OUT_LINE) {
2587c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            if ((my_data->source_mic_type & SOURCE_DUAL_MIC) &&
2588c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                    channel_count == 2) {
25893ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_DMIC_STEREO;
2590c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else if ((my_data->source_mic_type & SOURCE_MONO_MIC) &&
2591c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                          channel_count == 1) {
2592c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2593c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            } else {
2594c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                ALOGE("%s: something wrong (3): source type (%d) channel_count (%d) .."
2595c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                      " no combination found .. setting to mono", __func__,
2596c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                       my_data->source_mic_type, channel_count);
25973ad4e1b9949d04ad90d053458b10fa4dfbfa088eRavi Kumar Alamanda                snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2598c92c59683257878fb8dc08d827313b4a865898daPrashant Malani            }
2599b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) {
26009f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            if (adev->bt_wb_speech_enabled) {
2601e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2602e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB_NREC;
2603e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2604e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_WB;
26059f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            } else {
2606e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                if (adev->bluetooth_nrec)
2607e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC_NREC;
2608e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                else
2609e258e6871b27aa4b63b4b44fe2e318ded4d4e511Ravi Kumar Alamanda                    snd_device = SND_DEVICE_IN_BT_SCO_MIC;
26109f3065480c81bf01d3af65bfd3da09e1fb74b520Ravi Kumar Alamanda            }
2611b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else if (out_device & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
2612b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HDMI_MIC;
2613ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        } else if (out_device & AUDIO_DEVICE_OUT_USB_DEVICE) {
2614ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            if (audio_extn_usb_is_capture_supported())
2615ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
2616ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            else
2617ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              snd_device = SND_DEVICE_IN_SPEAKER_MIC;
2618b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        } else {
2619b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGE("%s: Unknown output device(s) %#x", __func__, out_device);
2620b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            ALOGW("%s: Using default handset-mic", __func__);
2621b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            snd_device = SND_DEVICE_IN_HANDSET_MIC;
2622b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        }
2623b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2624b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentexit:
2625b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("%s: exit: in_snd_device(%s)", __func__, device_table[snd_device]);
2626b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return snd_device;
2627b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
2628b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2629b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurentint platform_set_hdmi_channels(void *platform,  int channel_count)
2630b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
2631b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct platform_data *my_data = (struct platform_data *)platform;
2632b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct audio_device *adev = my_data->adev;
2633b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    struct mixer_ctl *ctl;
2634b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *channel_cnt_str = NULL;
2635b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    const char *mixer_ctl_name = "HDMI_RX Channels";
2636b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    switch (channel_count) {
2637b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 8:
2638b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Eight"; break;
2639b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 7:
2640b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Seven"; break;
2641b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 6:
2642b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Six"; break;
2643b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 5:
2644b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Five"; break;
2645b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 4:
2646b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Four"; break;
2647b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    case 3:
2648b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Three"; break;
2649b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    default:
2650b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_cnt_str = "Two"; break;
2651b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2652b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
2653b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    if (!ctl) {
2654b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        ALOGE("%s: Could not get ctl for mixer cmd - %s",
2655b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent              __func__, mixer_ctl_name);
2656b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return -EINVAL;
2657b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2658b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    ALOGV("HDMI channel count: %s", channel_cnt_str);
2659b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
2660b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return 0;
2661b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
2662b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
266347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew Georgeint platform_edid_get_max_channels(void *platform)
2664b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent{
266547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct platform_data *my_data = (struct platform_data *)platform;
266647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct audio_device *adev = my_data->adev;
2667b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char block[MAX_SAD_BLOCKS * SAD_BLOCK_SIZE];
2668b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    char *sad = block;
2669b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int num_audio_blocks;
2670b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int channel_count;
2671b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    int max_channels = 0;
267247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    int i, ret, count;
2673b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
267447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    struct mixer_ctl *ctl;
267547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George
267647cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    ctl = mixer_get_ctl_by_name(adev->mixer, AUDIO_DATA_BLOCK_MIXER_CTL);
267747cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (!ctl) {
267847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        ALOGE("%s: Could not get ctl for mixer cmd - %s",
267947cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George              __func__, AUDIO_DATA_BLOCK_MIXER_CTL);
2680b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        return 0;
2681b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2682b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
268347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    mixer_ctl_update(ctl);
268447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George
268547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    count = mixer_ctl_get_num_values(ctl);
2686b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2687b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Read SAD blocks, clamping the maximum size for safety */
268847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (count > (int)sizeof(block))
268947cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        count = (int)sizeof(block);
2690b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
269147cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    ret = mixer_ctl_get_array(ctl, block, count);
269247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    if (ret != 0) {
269347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        ALOGE("%s: mixer_ctl_get_array() failed to get EDID info", __func__);
269447cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        return 0;
269547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    }
2696b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2697b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    /* Calculate the number of SAD blocks */
269847cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George    num_audio_blocks = count / SAD_BLOCK_SIZE;
2699b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2700b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    for (i = 0; i < num_audio_blocks; i++) {
2701b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        /* Only consider LPCM blocks */
270247cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        if ((sad[0] >> 3) != EDID_FORMAT_LPCM) {
270347cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George            sad += 3;
2704b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            continue;
270547cd4cbdb19543338d5c887e3d7bcd2513c5c3adHaynes Mathew George        }
2706b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2707b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        channel_count = (sad[0] & 0x7) + 1;
2708b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        if (channel_count > max_channels)
2709b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent            max_channels = channel_count;
2710b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2711b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        /* Advance to next block */
2712b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent        sad += 3;
2713b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    }
2714b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent
2715b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent    return max_channels;
2716b23d5286490ad2dc0edf919d52428fa02dc2b2dcEric Laurent}
27177ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George
27184b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_set_incall_recording_session_id(void *platform,
27194b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                                             uint32_t session_id, int rec_mode)
27204b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
27214b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
27224b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
27234b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct audio_device *adev = my_data->adev;
27244b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct mixer_ctl *ctl;
27254b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    const char *mixer_ctl_name = "Voc VSID";
27264b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int num_ctl_values;
27274b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int i;
27284b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27294b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    ctl = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name);
27304b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (!ctl) {
27314b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ALOGE("%s: Could not get ctl for mixer cmd - %s",
27324b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava              __func__, mixer_ctl_name);
27334b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = -EINVAL;
27344b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    } else {
27354b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        num_ctl_values = mixer_ctl_get_num_values(ctl);
27364b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        for (i = 0; i < num_ctl_values; i++) {
27374b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            if (mixer_ctl_set_value(ctl, i, session_id)) {
27384b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                ALOGV("Error: invalid session_id: %x", session_id);
27394b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                ret = -EINVAL;
27404b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                break;
27414b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            }
27424b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
27434b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
27444b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27454b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
27464b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->start_record(ALL_SESSION_VSID, rec_mode);
27474b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
27484b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_start_record failed, error %d",
27494b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
27504b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
27514b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
27524b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27534b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
27544b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
27554b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27564b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_incall_recording_usecase(void *platform)
27574b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
27584b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
27594b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
27604b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27614b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
27624b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->stop_record(ALL_SESSION_VSID);
27634b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
27644b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_stop_record failed, error %d",
27654b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
27664b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
27674b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
27684b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27694b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
27704b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
27714b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27724b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_start_incall_music_usecase(void *platform)
27734b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
27744b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
27754b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
27764b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27774b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
27784b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->start_playback(ALL_SESSION_VSID);
27794b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
27804b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_start_playback failed, error %d",
27814b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
27824b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
27834b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
27844b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27854b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
27864b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
27874b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27884b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastavaint platform_stop_incall_music_usecase(void *platform)
27894b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava{
27904b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    int ret = 0;
27914b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    struct platform_data *my_data = (struct platform_data *)platform;
27924b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
27934b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    if (my_data->csd != NULL) {
27944b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        ret = my_data->csd->stop_playback(ALL_SESSION_VSID);
27954b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        if (ret < 0) {
27964b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava            ALOGE("%s: csd_client_stop_playback failed, error %d",
27974b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava                  __func__, ret);
27984b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava        }
27994b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    }
28004b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
28014b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava    return ret;
28024b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava}
28034b89e37ad290ef955abf8ac1d151728303311345Vineeta Srivastava
2804c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandaint platform_set_parameters(void *platform, struct str_parms *parms)
2805c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda{
2806c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)platform;
28072f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    char value[128];
2808c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    char *kv_pairs = str_parms_to_str(parms);
2809c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    int ret = 0, err;
2810c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2811c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (kv_pairs == NULL) {
2812c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        ret = -EINVAL;
2813c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        ALOGE("%s: key-value pair is NULL",__func__);
2814c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        goto done;
2815c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    }
2816c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2817c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    ALOGV("%s: enter: %s", __func__, kv_pairs);
2818c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2819c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_SOUNDCARD_NAME,
2820c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda                            value, sizeof(value));
2821c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (err >= 0) {
2822c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        str_parms_del(parms, PLATFORM_CONFIG_KEY_SOUNDCARD_NAME);
2823c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        my_data->snd_card_name = strdup(value);
2824c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        ALOGV("%s: sound card name %s", __func__, my_data->snd_card_name);
2825c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    }
2826c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
28272f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_OPERATOR_INFO,
28282f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park                            value, sizeof(value));
28292f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    if (err >= 0) {
28302f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        struct operator_info *info;
28312f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        char *str = value;
28322f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        char *name;
28332f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
28342f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        str_parms_del(parms, PLATFORM_CONFIG_KEY_OPERATOR_INFO);
28352f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info = (struct operator_info *)calloc(1, sizeof(struct operator_info));
28362f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        name = strtok(str, ";");
28372f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info->name = strdup(name);
28382f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        info->mccmnc = strdup(str + strlen(name) + 1);
28392f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park
28402f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park        list_add_tail(&operator_info_list, &info->list);
2841188b6223c8baaba6a44c779783a878b4459a0642Joe Onorato        ALOGV("%s: add operator[%s] mccmnc[%s]", __func__, info->name, info->mccmnc);
28422f7306a9dae56a1204e8ec090198ce76b167bfa9keunhui.park    }
2843c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
2844c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    memset(value, 0, sizeof(value));
2845c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent    err = str_parms_get_str(parms, PLATFORM_CONFIG_KEY_MAX_MIC_COUNT,
2846c92c59683257878fb8dc08d827313b4a865898daPrashant Malani                            value, sizeof(value));
2847c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    if (err >= 0) {
2848c633338c83da3760c4965d29af2afd80d3cce840Eric Laurent        str_parms_del(parms, PLATFORM_CONFIG_KEY_MAX_MIC_COUNT);
2849c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        my_data->max_mic_count = atoi(value);
2850c92c59683257878fb8dc08d827313b4a865898daPrashant Malani        ALOGV("%s: max_mic_count %s/%d", __func__, value, my_data->max_mic_count);
2851c92c59683257878fb8dc08d827313b4a865898daPrashant Malani    }
2852c92c59683257878fb8dc08d827313b4a865898daPrashant Malani
2853c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamandadone:
2854c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    ALOGV("%s: exit with code(%d)", __func__, ret);
2855c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    if (kv_pairs != NULL)
2856c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda        free(kv_pairs);
2857c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
2858c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda    return ret;
2859c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda}
2860c4f57314a49fb83ed602395d9fe0c0164c9e863dRavi Kumar Alamanda
28617ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George/* Delay in Us */
28627ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew Georgeint64_t platform_render_latency(audio_usecase_t usecase)
28637ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George{
28647ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George    switch (usecase) {
28657ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        case USECASE_AUDIO_PLAYBACK_DEEP_BUFFER:
28667ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return DEEP_BUFFER_PLATFORM_DELAY;
28677ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        case USECASE_AUDIO_PLAYBACK_LOW_LATENCY:
28687ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return LOW_LATENCY_PLATFORM_DELAY;
286903c40105c0533a9e6667b95c526a188acf24acebHaynes Mathew George        case USECASE_AUDIO_PLAYBACK_ULL:
287003c40105c0533a9e6667b95c526a188acf24acebHaynes Mathew George            return ULL_PLATFORM_DELAY;
28710e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent        case USECASE_AUDIO_PLAYBACK_MMAP:
28720e46adf26c0fe46dc3accfc3f08a3106f3c110a7Eric Laurent            return MMAP_PLATFORM_DELAY;
28737ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George        default:
28747ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George            return 0;
28757ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George    }
28767ff216f80f6e53235b4239c6fb7da9b0d5127738Haynes Mathew George}
287798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
2878b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamandaint platform_set_snd_device_backend(snd_device_t device, const char *backend_tag,
2879b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda                                    const char * hw_interface)
288098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
288198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int ret = 0;
288298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
288398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((device < SND_DEVICE_MIN) || (device >= SND_DEVICE_MAX)) {
288498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: Invalid snd_device = %d",
288598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George            __func__, device);
288698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -EINVAL;
288798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        goto done;
288898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
288998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
2890b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: backend_tag_table[%s]: old = %s new = %s", __func__,
2891b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda          platform_get_snd_device_name(device),
2892b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda          backend_tag_table[device] != NULL ? backend_tag_table[device]: "null", backend_tag);
2893b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (backend_tag_table[device]) {
2894b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        free(backend_tag_table[device]);
2895b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    }
2896b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    backend_tag_table[device] = strdup(backend_tag);
2897b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda
2898b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    if (hw_interface != NULL) {
2899b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        if (hw_interface_table[device])
2900b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda            free(hw_interface_table[device]);
2901b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        ALOGV("%s: hw_interface_table[%d] = %s", __func__, device, hw_interface);
2902b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda        hw_interface_table[device] = strdup(hw_interface);
290398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
290498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone:
290598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return ret;
290698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
290798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
290898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgeint platform_set_usecase_pcm_id(audio_usecase_t usecase, int32_t type, int32_t pcm_id)
290998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George{
291098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    int ret = 0;
291198c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((usecase <= USECASE_INVALID) || (usecase >= AUDIO_USECASE_MAX)) {
291298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: invalid usecase case idx %d", __func__, usecase);
291398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -EINVAL;
291498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        goto done;
291598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
291698c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George
291798c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    if ((type != 0) && (type != 1)) {
291898c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ALOGE("%s: invalid usecase type", __func__);
291998c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George        ret = -EINVAL;
292098c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    }
2921b7ea4f581dab56101215e97692c265931addad80Ravi Kumar Alamanda    ALOGV("%s: pcm_device_table[%d][%d] = %d", __func__, usecase, type, pcm_id);
292298c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    pcm_device_table[usecase][type] = pcm_id;
292398c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew Georgedone:
292498c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George    return ret;
292598c95622da1e906d32dde6b6651ed5b270b9b5f1Haynes Mathew George}
29261f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
292788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi#define DEFAULT_NOMINAL_SPEAKER_GAIN 20
292888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Triviint ramp_speaker_gain(struct audio_device *adev, bool ramp_up, int target_ramp_up_gain) {
292988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    // backup_gain: gain to try to set in case of an error during ramp
293088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    int start_gain, end_gain, step, backup_gain, i;
293188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    bool error = false;
293288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    const struct mixer_ctl *ctl;
293388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    const char *mixer_ctl_name_gain_left = "Left Speaker Gain";
293488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    const char *mixer_ctl_name_gain_right = "Right Speaker Gain";
293588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    struct mixer_ctl *ctl_left = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_left);
293688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    struct mixer_ctl *ctl_right = mixer_get_ctl_by_name(adev->mixer, mixer_ctl_name_gain_right);
293788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    if (!ctl_left || !ctl_right) {
293888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        ALOGE("%s: Could not get ctl for mixer cmd - %s or %s, not applying speaker gain ramp",
293988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                      __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
294088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        return -EINVAL;
294188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    } else if ((mixer_ctl_get_num_values(ctl_left) != 1)
294288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            || (mixer_ctl_get_num_values(ctl_right) != 1)) {
294388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        ALOGE("%s: Unexpected num values for mixer cmd - %s or %s, not applying speaker gain ramp",
294488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                              __func__, mixer_ctl_name_gain_left, mixer_ctl_name_gain_right);
294588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        return -EINVAL;
294688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
294788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    if (ramp_up) {
294888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        start_gain = 0;
294988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        end_gain = target_ramp_up_gain > 0 ? target_ramp_up_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
295088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        step = +1;
295188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        backup_gain = end_gain;
295288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    } else {
295388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        // using same gain on left and right
295488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        const int left_gain = mixer_ctl_get_value(ctl_left, 0);
295588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        start_gain = left_gain > 0 ? left_gain : DEFAULT_NOMINAL_SPEAKER_GAIN;
295688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        end_gain = 0;
295788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        step = -1;
295888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        backup_gain = start_gain;
295988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
296088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    for (i = start_gain ; i != (end_gain + step) ; i += step) {
296188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        //ALOGV("setting speaker gain to %d", i);
296288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_left, 0, i)) {
296388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error setting %s to %d during gain ramp",
296488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    __func__, mixer_ctl_name_gain_left, i);
296588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            error = true;
296688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            break;
296788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
296888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_right, 0, i)) {
296988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error setting %s to %d during gain ramp",
297088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    __func__, mixer_ctl_name_gain_right, i);
297188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            error = true;
297288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            break;
297388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
297488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        usleep(1000);
297588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
297688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    if (error) {
297788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        // an error occured during the ramp, let's still try to go back to a safe volume
297888cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_left, 0, backup_gain)) {
297988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error restoring left gain to %d", __func__, backup_gain);
298088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
298188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        if (mixer_ctl_set_value(ctl_right, 0, backup_gain)) {
298288cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi            ALOGE("%s: error restoring right gain to %d", __func__, backup_gain);
298388cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi        }
298488cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    }
298588cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi    return start_gain;
298688cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi}
298788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi
29881f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamandaint platform_swap_lr_channels(struct audio_device *adev, bool swap_channels)
29891f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda{
29901f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    // only update if there is active pcm playback on speaker
29911f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    struct audio_usecase *usecase;
29921f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    struct listnode *node;
29931f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    struct platform_data *my_data = (struct platform_data *)adev->platform;
29941f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
29951f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    if (my_data->speaker_lr_swap != swap_channels) {
2996f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi
2997f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi        // do not swap channels in audio modes with concurrent capture and playback
2998f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi        // as this may break the echo reference
2999f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi        if ((adev->mode == AUDIO_MODE_IN_COMMUNICATION) || (adev->mode == AUDIO_MODE_IN_CALL)) {
3000f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi            ALOGV("%s: will not swap due to audio mode %d", __func__, adev->mode);
3001f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi            return 0;
3002f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi        }
3003f714870588e183aa511b4dfeb87ad65bc8b505efJean-Michel Trivi
30041f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        my_data->speaker_lr_swap = swap_channels;
30051f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda
30061f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        list_for_each(node, &adev->usecase_list) {
30071f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda            usecase = node_to_item(node, struct audio_usecase, list);
30081f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda            if (usecase->type == PCM_PLAYBACK &&
3009425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    usecase->stream.out->devices & AUDIO_DEVICE_OUT_SPEAKER) {
3010425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                /*
3011425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 * If acdb tuning is different for SPEAKER_REVERSE, it is must
3012425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 * to perform device switch to disable the current backend to
3013425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 * enable it with new acdb data.
3014425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                 */
3015425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                if (acdb_device_table[SND_DEVICE_OUT_SPEAKER] !=
3016425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    acdb_device_table[SND_DEVICE_OUT_SPEAKER_REVERSE]) {
301788cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    const int initial_skpr_gain = ramp_speaker_gain(adev, false /*ramp_up*/, -1);
3018425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    select_devices(adev, usecase->id);
301988cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    if (initial_skpr_gain != -EINVAL) {
302088cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                        ramp_speaker_gain(adev, true /*ramp_up*/, initial_skpr_gain);
302188cbad341d2dd920ac74c2296f319482bd53a33dJean-Michel Trivi                    }
30221f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda                } else {
3023425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    const char *mixer_path;
3024425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    if (swap_channels) {
3025425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER_REVERSE);
3026425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        audio_route_apply_and_update_path(adev->audio_route, mixer_path);
3027425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    } else {
3028425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        mixer_path = platform_get_snd_device_name(SND_DEVICE_OUT_SPEAKER);
3029425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                        audio_route_apply_and_update_path(adev->audio_route, mixer_path);
3030425e154c046554deb7ba766e89b943e8870ee251Ravi Kumar Alamanda                    }
30311f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda                }
30321f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda                break;
30331f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda            }
30341f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda        }
30351f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    }
30361f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda    return 0;
30371f60cf8ce4276473878a22956ae546911353ebd2Ravi Kumar Alamanda}
3038a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3039a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehtastatic struct amp_db_and_gain_table tbl_mapping[MAX_VOLUME_CAL_STEPS];
3040a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehtastatic int num_gain_tbl_entry = 0;
3041a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3042a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehtabool platform_add_gain_level_mapping(struct amp_db_and_gain_table *tbl_entry) {
3043a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3044a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    ALOGV("%s: enter .. add %f %f %d", __func__, tbl_entry->amp, tbl_entry->db, tbl_entry->level);
3045a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    if (num_gain_tbl_entry == -1) {
3046a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        ALOGE("%s: num entry beyond valid step levels or corrupted..rejecting custom mapping",
3047a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta               __func__);
3048a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        return false;
3049a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    }
3050a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3051a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    if (num_gain_tbl_entry >= MAX_VOLUME_CAL_STEPS) {
3052a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        ALOGE("%s: max entry reached max[%d] current index[%d]  .. rejecting", __func__,
3053a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta               MAX_VOLUME_CAL_STEPS, num_gain_tbl_entry);
3054a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        num_gain_tbl_entry  = -1; // indicates error and no more info will be cached
3055a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        return false;
3056a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    }
3057a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3058a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    if (num_gain_tbl_entry > 0 && tbl_mapping[num_gain_tbl_entry - 1].amp >= tbl_entry->amp) {
3059a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        ALOGE("%s: value not in ascending order .. rejecting custom mapping", __func__);
3060a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        num_gain_tbl_entry  = -1; // indicates error and no more info will be cached
3061a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        return false;
3062a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    }
3063a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3064a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    tbl_mapping[num_gain_tbl_entry] = *tbl_entry;
3065a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    ++num_gain_tbl_entry;
3066a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3067a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    return true;
3068a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta}
3069a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3070a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehtaint platform_get_gain_level_mapping(struct amp_db_and_gain_table *mapping_tbl,
3071a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta                                    int table_size) {
3072a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    int itt = 0;
3073a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    ALOGV("platform_get_gain_level_mapping called ");
3074a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3075a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    if (num_gain_tbl_entry <= 0 || num_gain_tbl_entry > MAX_VOLUME_CAL_STEPS) {
3076a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        ALOGD("%s: empty or currupted gain_mapping_table", __func__);
3077a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        return 0;
3078a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    }
3079a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3080a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    for (; itt < num_gain_tbl_entry && itt <= table_size; itt++) {
3081a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        mapping_tbl[itt] = tbl_mapping[itt];
3082a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta        ALOGV("%s: added amp[%f] db[%f] level[%d]", __func__,
3083a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta               mapping_tbl[itt].amp, mapping_tbl[itt].db, mapping_tbl[itt].level);
3084a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    }
3085a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta
3086a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta    return num_gain_tbl_entry;
3087a8d7c9257c3c9514f5c35d3dbd987703e12c82cdvivek mehta}
3088c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
3089c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew Georgeint platform_snd_card_update(void *platform, card_status_t status)
3090c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George{
3091c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    struct platform_data *my_data = (struct platform_data *)platform;
3092c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    struct audio_device *adev = my_data->adev;
3093c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George
3094c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    if (status == CARD_STATUS_ONLINE) {
3095c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George        if (my_data->acdb_send_custom_top)
3096c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George            my_data->acdb_send_custom_top();
3097c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    }
3098c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George    return 0;
3099c735fb07458a06b7f4dc702607b3cb722a78c9f7Haynes Mathew George}
3100ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3101ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin/*
3102ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin * configures afe with bit width and Sample Rate
3103ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin */
3104ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic int platform_set_backend_cfg(const struct audio_device* adev,
3105ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                          snd_device_t snd_device,
3106ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                          const struct audio_backend_cfg *backend_cfg)
3107ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3108ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3109ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int ret = 0;
3110ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    const int backend_idx = platform_get_backend_index(snd_device);
3111ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct platform_data *my_data = (struct platform_data *)adev->platform;
3112ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    const unsigned int bit_width = backend_cfg->bit_width;
3113ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    const unsigned int sample_rate = backend_cfg->sample_rate;
3114ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    const unsigned int channels = backend_cfg->channels;
3115ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    const audio_format_t format = backend_cfg->format;
3116ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    const bool passthrough_enabled = backend_cfg->passthrough_enabled;
3117ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3118ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3119ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
3120ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          ", backend_idx %d device (%s)", __func__,  bit_width,
3121ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          sample_rate, channels, backend_idx,
3122ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          platform_get_snd_device_name(snd_device));
3123ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3124ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if ((my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl) &&
3125ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        (bit_width != my_data->current_backend_cfg[backend_idx].bit_width)) {
3126ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3127ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        struct  mixer_ctl *ctl = NULL;
3128ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ctl = mixer_get_ctl_by_name(adev->mixer,
3129ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                    my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
3130ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (!ctl) {
3131ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
3132ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  __func__,
3133ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl);
3134ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            return -EINVAL;
3135ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3136ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3137ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (bit_width == 24) {
3138ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            if (format == AUDIO_FORMAT_PCM_24_BIT_PACKED)
3139ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                ret = mixer_ctl_set_enum_by_string(ctl, "S24_3LE");
3140ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            else
3141ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                ret = mixer_ctl_set_enum_by_string(ctl, "S24_LE");
3142ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        } else if (bit_width == 32) {
3143ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ret = mixer_ctl_set_enum_by_string(ctl, "S32_LE");
3144ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        } else {
3145ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ret = mixer_ctl_set_enum_by_string(ctl, "S16_LE");
3146ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3147ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if ( ret < 0) {
3148ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ALOGE("%s:becf: afe: fail for %s mixer set to %d bit for %x format", __func__,
3149ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
3150ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        } else {
3151ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            my_data->current_backend_cfg[backend_idx].bit_width = bit_width;
3152ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ALOGD("%s:becf: afe: %s mixer set to %d bit for %x format", __func__,
3153ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  my_data->current_backend_cfg[backend_idx].bitwidth_mixer_ctl, bit_width, format);
3154ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3155ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        /* set the ret as 0 and not pass back to upper layer */
3156ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ret = 0;
3157ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3158ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3159ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (passthrough_enabled || ((my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl) &&
3160ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate))) {
3161ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        char *rate_str = NULL;
3162ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        struct  mixer_ctl *ctl = NULL;
3163ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3164ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        switch (sample_rate) {
3165ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 32000:
3166ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                if (passthrough_enabled) {
3167ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                    rate_str = "KHZ_32";
3168ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                    break;
3169ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                }
3170ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 8000:
3171ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 11025:
3172ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 16000:
3173ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 22050:
3174ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 48000:
3175ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_48";
3176ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3177ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 44100:
3178ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_44P1";
3179ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3180ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 64000:
3181ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 96000:
3182ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_96";
3183ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3184ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 88200:
3185ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_88P2";
3186ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3187ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 176400:
3188ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_176P4";
3189ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3190ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 192000:
3191ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_192";
3192ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3193ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 352800:
3194ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_352P8";
3195ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3196ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 384000:
3197ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_384";
3198ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3199ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 144000:
3200ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                if (passthrough_enabled) {
3201ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                    rate_str = "KHZ_144";
3202ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                    break;
3203ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                }
3204ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            default:
3205ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                rate_str = "KHZ_48";
3206ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3207ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3208ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3209ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ctl = mixer_get_ctl_by_name(adev->mixer,
3210ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                    my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
3211ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if(!ctl) {
3212ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
3213ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  __func__,
3214ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl);
3215ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            return -EINVAL;
3216ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3217ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3218ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGD("%s:becf: afe: %s set to %s", __func__,
3219ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              my_data->current_backend_cfg[backend_idx].samplerate_mixer_ctl, rate_str);
3220ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        mixer_ctl_set_enum_by_string(ctl, rate_str);
3221ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        my_data->current_backend_cfg[backend_idx].sample_rate = sample_rate;
3222ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3223ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if ((my_data->current_backend_cfg[backend_idx].channels_mixer_ctl) &&
3224ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        (channels != my_data->current_backend_cfg[backend_idx].channels)) {
3225ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        struct  mixer_ctl *ctl = NULL;
3226ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        char *channel_cnt_str = NULL;
3227ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3228ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        switch (channels) {
3229ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 8:
3230ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Eight"; break;
3231ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 7:
3232ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Seven"; break;
3233ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 6:
3234ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Six"; break;
3235ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 5:
3236ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Five"; break;
3237ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 4:
3238ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Four"; break;
3239ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 3:
3240ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Three"; break;
3241ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 1:
3242ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "One"; break;
3243ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            case 2:
3244ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            default:
3245ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                channel_cnt_str = "Two"; break;
3246ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3247ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3248ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ctl = mixer_get_ctl_by_name(adev->mixer,
3249ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                    my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
3250ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if (!ctl) {
3251ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ALOGE("%s:becf: afe: Could not get ctl for mixer command - %s",
3252ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  __func__,
3253ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                  my_data->current_backend_cfg[backend_idx].channels_mixer_ctl);
3254ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            return -EINVAL;
3255ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3256ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        mixer_ctl_set_enum_by_string(ctl, channel_cnt_str);
3257ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        my_data->current_backend_cfg[backend_idx].channels = channels;
3258ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3259ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        // skip EDID configuration for HDMI backend
3260ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3261ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGD("%s:becf: afe: %s set to %s", __func__,
3262ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              my_data->current_backend_cfg[backend_idx].channels_mixer_ctl,
3263ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              channel_cnt_str);
3264ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3265ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3266ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // skip set ext_display format mixer control
3267ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return ret;
3268ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3269ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3270ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic int platform_get_snd_device_bit_width(snd_device_t snd_device)
3271ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3272ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if ((snd_device < SND_DEVICE_MIN) || (snd_device >= SND_DEVICE_MAX)) {
3273ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGE("%s: Invalid snd_device = %d", __func__, snd_device);
3274ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        return CODEC_BACKEND_DEFAULT_BIT_WIDTH;
3275ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3276ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3277ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return backend_bit_width_table[snd_device];
3278ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3279ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3280ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin/*
3281ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin * return backend_idx on which voice call is active
3282ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin */
3283ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic int platform_get_voice_call_backend(struct audio_device* adev)
3284ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3285ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct audio_usecase *uc = NULL;
3286ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct listnode *node;
3287ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    snd_device_t out_snd_device = SND_DEVICE_NONE;
3288ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3289ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int backend_idx = -1;
3290ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3291ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
3292ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        list_for_each(node, &adev->usecase_list) {
3293ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            uc =  node_to_item(node, struct audio_usecase, list);
3294ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            if (uc && uc->type == VOICE_CALL && uc->stream.out) {
3295ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                out_snd_device = platform_get_output_snd_device(adev->platform,
3296ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                                        uc->stream.out->devices);
3297ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                backend_idx = platform_get_backend_index(out_snd_device);
3298ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                break;
3299ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            }
3300ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3301ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3302ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return backend_idx;
3303ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3304ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3305ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin/*
3306ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin * goes through all the current usecases and picks the highest
3307ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin * bitwidth & samplerate
3308ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin */
3309ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic bool platform_check_capture_backend_cfg(struct audio_device* adev,
3310ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                   int backend_idx,
3311ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                   struct audio_backend_cfg *backend_cfg)
3312ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3313ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bool backend_change = false;
3314ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    unsigned int bit_width;
3315ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    unsigned int sample_rate;
3316ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    unsigned int channels;
3317ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct platform_data *my_data = (struct platform_data *)adev->platform;
3318ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3319ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bit_width = backend_cfg->bit_width;
3320ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    sample_rate = backend_cfg->sample_rate;
3321ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    channels = backend_cfg->channels;
3322ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3323ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:txbecf: afe: Codec selected backend: %d current bit width: %d and "
3324ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          "sample rate: %d, channels %d",__func__,backend_idx, bit_width,
3325ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          sample_rate, channels);
3326ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3327ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // For voice calls use default configuration i.e. 16b/48K, only applicable to
3328ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // default backend
3329ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // force routing is not required here, caller will do it anyway
3330ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (voice_is_in_call(adev) || adev->mode == AUDIO_MODE_IN_COMMUNICATION) {
3331ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGW("%s:txbecf: afe: Use default bw and sr for voice/voip calls and "
3332ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              "for unprocessed/camera source", __func__);
3333ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
3334ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        sample_rate =  CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
3335ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3336ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3337ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (backend_idx == USB_AUDIO_TX_BACKEND) {
3338ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        audio_extn_usb_is_config_supported(&bit_width, &sample_rate, &channels, false);
3339ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGV("%s:txbecf: afe: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
3340ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              __func__, bit_width, sample_rate, channels);
3341ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3342ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3343ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:txbecf: afe: Codec selected backend: %d updated bit width: %d and "
3344ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          "sample rate: %d", __func__, backend_idx, bit_width, sample_rate);
3345ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3346ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // Force routing if the expected bitwdith or samplerate
3347ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // is not same as current backend comfiguration
3348ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
3349ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
3350ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        (channels != my_data->current_backend_cfg[backend_idx].channels)) {
3351ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->bit_width = bit_width;
3352ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->sample_rate= sample_rate;
3353ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->channels = channels;
3354ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_change = true;
3355ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGI("%s:txbecf: afe: Codec backend needs to be updated. new bit width: %d "
3356ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              "new sample rate: %d new channel: %d",
3357ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              __func__, backend_cfg->bit_width,
3358ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              backend_cfg->sample_rate, backend_cfg->channels);
3359ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3360ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3361ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return backend_change;
3362ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3363ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
33644bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew Georgestatic void platform_pick_playback_cfg_for_uc(struct audio_device *adev,
33654bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                              struct audio_usecase *usecase,
33664bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                              snd_device_t snd_device,
33674bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                              unsigned int *bit_width,
33684bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                              unsigned int *sample_rate,
33694bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                              unsigned int *channels)
33704bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George{
33714bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    int i =0;
33724bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    struct listnode *node;
33734bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    list_for_each(node, &adev->usecase_list) {
33744bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        struct audio_usecase *uc;
33754bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        uc = node_to_item(node, struct audio_usecase, list);
33764bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        struct stream_out *out = (struct stream_out*) uc->stream.out;
33774bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        if (uc->type == PCM_PLAYBACK && out && usecase != uc) {
33784bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            unsigned int out_channels = audio_channel_count_from_out_mask(out->channel_mask);
33794bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            ALOGV("%s:napb: (%d) - (%s)id (%d) sr %d bw "
33804bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                  "(%d) ch (%d) device %s", __func__, i++, use_case_table[uc->id],
33814bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                  uc->id, out->sample_rate,
33824bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                  pcm_format_to_bits(out->config.format), out_channels,
33834bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                  platform_get_snd_device_name(uc->out_snd_device));
33844bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George
33854bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            if (platform_check_backends_match(snd_device, uc->out_snd_device)) {
33864bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                if (*bit_width < pcm_format_to_bits(out->config.format))
33874bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                    *bit_width = pcm_format_to_bits(out->config.format);
33884bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                if (*sample_rate < out->sample_rate)
33894bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                    *sample_rate = out->sample_rate;
33904bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                if (out->sample_rate < OUTPUT_SAMPLING_RATE_44100)
33914bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                    *sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
33924bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                if (*channels < out_channels)
33934bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                    *channels = out_channels;
33944bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            }
33954bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        }
33964bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    }
33974bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    return;
33984bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George}
33994bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George
3400ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linstatic bool platform_check_playback_backend_cfg(struct audio_device* adev,
3401ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                             struct audio_usecase* usecase,
3402ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                             snd_device_t snd_device,
3403ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                             struct audio_backend_cfg *backend_cfg)
3404ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3405ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bool backend_change = false;
3406ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    unsigned int bit_width;
3407ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    unsigned int sample_rate;
3408ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    unsigned int channels;
3409ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bool passthrough_enabled = false;
3410ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int backend_idx = DEFAULT_CODEC_BACKEND;
3411ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct platform_data *my_data = (struct platform_data *)adev->platform;
3412ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bool channels_updated = false;
3413ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3414ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (snd_device == SND_DEVICE_OUT_BT_SCO ||
3415ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        snd_device == SND_DEVICE_OUT_BT_SCO_WB) {
3416ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_change = false;
3417ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        return backend_change;
3418ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3419ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3420ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_idx = platform_get_backend_index(snd_device);
3421ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bit_width = backend_cfg->bit_width;
3422ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    sample_rate = backend_cfg->sample_rate;
3423ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    channels = backend_cfg->channels;
3424ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3425ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
3426ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          ", backend_idx %d usecase = %d device (%s)", __func__, bit_width,
3427ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          sample_rate, channels, backend_idx, usecase->id,
3428ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          platform_get_snd_device_name(snd_device));
3429ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3430ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (backend_idx == platform_get_voice_call_backend(adev)) {
3431ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGW("%s:becf: afe:Use default bw and sr for voice/voip calls ",
3432ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              __func__);
3433ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
3434ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        sample_rate =  CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
3435ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        channels = CODEC_BACKEND_DEFAULT_CHANNELS;
3436ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    } else {
3437ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        /*
3438ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         * The backend should be configured at highest bit width and/or
3439ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         * sample rate amongst all playback usecases.
3440ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         * If the selected sample rate and/or bit width differ with
3441ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         * current backend sample rate and/or bit width, then, we set the
3442ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         * backend re-configuration flag.
3443ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         *
3444ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         * Exception: 16 bit playbacks is allowed through 16 bit/48/44.1 khz backend only
3445ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin         */
34464bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        platform_pick_playback_cfg_for_uc(adev, usecase, snd_device,
34474bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                          &bit_width,
34484bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                          &sample_rate,
34494bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                          &channels);
34504bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    }
34514bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George
34524bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    switch (backend_idx) {
34534bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        case USB_AUDIO_RX_BACKEND:
34544bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            audio_extn_usb_is_config_supported(&bit_width,
34554bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                                               &sample_rate, &channels, true);
34564bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            ALOGV("%s: USB BE configured as bit_width(%d)sample_rate(%d)channels(%d)",
34574bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George                  __func__, bit_width, sample_rate, channels);
34584bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            break;
34594bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        case DEFAULT_CODEC_BACKEND:
34604bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        case HEADPHONE_BACKEND:
34614bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        default:
34624bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            bit_width = platform_get_snd_device_bit_width(snd_device);
34634bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            sample_rate = CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
34644bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            channels = CODEC_BACKEND_DEFAULT_CHANNELS;
34654bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George            break;
3466ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3467ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
34684bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    if (channels != my_data->current_backend_cfg[backend_idx].channels) {
34694bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        channels_updated = true;
3470ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3471ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
34724bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    ALOGV("%s:becf: afe: Codec selected backend: %d updated bit width: %d and"
34734bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George          "sample rate: %d",
3474ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          __func__, backend_idx , bit_width, sample_rate);
3475ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3476ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // Force routing if the expected bitwdith or samplerate
3477ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    // is not same as current backend comfiguration
3478ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if ((bit_width != my_data->current_backend_cfg[backend_idx].bit_width) ||
3479ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        (sample_rate != my_data->current_backend_cfg[backend_idx].sample_rate) ||
3480ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        passthrough_enabled || channels_updated) {
3481ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->bit_width = bit_width;
3482ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->sample_rate = sample_rate;
3483ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->channels = channels;
3484ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg->passthrough_enabled = passthrough_enabled;
3485ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_change = true;
3486ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGV("%s:becf: afe: Codec backend needs to be updated. new bit width: %d"
3487ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              "new sample rate: %d new channels: %d",
3488ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin              __func__, backend_cfg->bit_width, backend_cfg->sample_rate, backend_cfg->channels);
3489ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3490ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3491ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return backend_change;
3492ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3493ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3494ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linbool platform_check_and_set_playback_backend_cfg(struct audio_device* adev,
3495ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct audio_usecase *usecase, snd_device_t snd_device)
3496ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3497ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int backend_idx = DEFAULT_CODEC_BACKEND;
3498ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int new_snd_devices[SND_DEVICE_OUT_END];
3499ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int i, num_devices = 1;
3500ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    bool ret = false;
3501ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct platform_data *my_data = (struct platform_data *)adev->platform;
3502ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct audio_backend_cfg backend_cfg;
3503ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3504ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_idx = platform_get_backend_index(snd_device);
3505ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3506ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_cfg.bit_width = pcm_format_to_bits(usecase->stream.out->config.format);
3507ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_cfg.sample_rate = usecase->stream.out->sample_rate;
3508ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_cfg.format = usecase->stream.out->format;
3509ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_cfg.channels = audio_channel_count_from_out_mask(usecase->stream.out->channel_mask);
3510ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    /*this is populated by check_codec_backend_cfg hence set default value to false*/
3511ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    backend_cfg.passthrough_enabled = false;
3512ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3513ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:becf: afe: bitwidth %d, samplerate %d channels %d"
3514ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          ", backend_idx %d usecase = %d device (%s)", __func__, backend_cfg.bit_width,
3515ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          backend_cfg.sample_rate, backend_cfg.channels, backend_idx, usecase->id,
3516ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          platform_get_snd_device_name(snd_device));
3517ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3518ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (platform_can_split_snd_device(snd_device, &num_devices, new_snd_devices) < 0)
3519ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        new_snd_devices[0] = snd_device;
3520ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3521ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    for (i = 0; i < num_devices; i++) {
3522ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ALOGV("%s: new_snd_devices[%d] is %d", __func__, i, new_snd_devices[i]);
3523ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if ((platform_check_playback_backend_cfg(adev, usecase, new_snd_devices[i],
3524ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                                 &backend_cfg))) {
3525ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            platform_set_backend_cfg(adev, new_snd_devices[i],
3526ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                     &backend_cfg);
3527ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            ret = true;
3528ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        }
3529ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3530ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return ret;
3531ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3532ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3533ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Linbool platform_check_and_set_capture_backend_cfg(struct audio_device* adev,
3534ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct audio_usecase *usecase, snd_device_t snd_device)
3535ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin{
3536ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int backend_idx = platform_get_backend_index(snd_device);
3537ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    int ret = 0;
3538ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    struct audio_backend_cfg backend_cfg;
35394bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    memset(&backend_cfg, 0, sizeof(struct audio_backend_cfg));
3540ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
35414bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George    if (usecase->type == PCM_CAPTURE) {
35424bd47999803d55e67e00c56712dbdcddf7a94507Haynes Mathew George        backend_cfg.format = usecase->stream.in->format;
3543ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg.channels = audio_channel_count_from_in_mask(usecase->stream.in->channel_mask);
3544ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    } else {
3545ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg.bit_width = CODEC_BACKEND_DEFAULT_BIT_WIDTH;
3546ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg.sample_rate =  CODEC_BACKEND_DEFAULT_SAMPLE_RATE;
3547ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg.format = AUDIO_FORMAT_PCM_16_BIT;
3548ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        backend_cfg.channels = 1;
3549ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3550ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3551ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    ALOGV("%s:txbecf: afe: bitwidth %d, samplerate %d, channel %d"
3552ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          ", backend_idx %d usecase = %d device (%s)", __func__,
3553ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          backend_cfg.bit_width,
3554ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          backend_cfg.sample_rate,
3555ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          backend_cfg.channels,
3556ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          backend_idx, usecase->id,
3557ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin          platform_get_snd_device_name(snd_device));
3558ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3559ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    if (platform_check_capture_backend_cfg(adev, backend_idx, &backend_cfg)) {
3560ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        ret = platform_set_backend_cfg(adev, snd_device,
3561ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin                                       &backend_cfg);
3562ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin        if(!ret)
3563ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin            return true;
3564ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    }
3565ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3566ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin    return false;
3567ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin}
3568ee3fe40f7a48fa0abe8aef40a2abe83777468ebaDavid Lin
3569