hal: Add support for BCL feature in sm6150
Add a new persist node to check whether BCL is
enabled or not to differentiate from legacy VBAT
feature. Use this node to select the VBAT sound
devices. BCL does not need any calibration unlike
legacy VBAT, use BCL persist node and avoid
sending calibration.
CRs-Fixed: 2225097
Change-Id: I1ce8eb08de9bd0e49457f645730c103282f0d496
diff --git a/hal/audio_extn/audio_extn.c b/hal/audio_extn/audio_extn.c
index 5b388a8..d125b2f 100755
--- a/hal/audio_extn/audio_extn.c
+++ b/hal/audio_extn/audio_extn.c
@@ -72,6 +72,7 @@
uint32_t proxy_channel_num;
bool hpx_enabled;
bool vbat_enabled;
+ bool bcl_enabled;
bool hifi_audio_enabled;
bool ras_enabled;
struct aptx_dec_bt_addr addr;
@@ -414,6 +415,25 @@
ALOGD("%s: vbat.enabled property is set to %s", __func__, prop_vbat_enabled);
return (aextnmod.vbat_enabled ? true: false);
}
+
+bool audio_extn_is_bcl_enabled(void)
+{
+ ALOGD("%s: status: %d", __func__, aextnmod.bcl_enabled);
+ return (aextnmod.bcl_enabled ? true: false);
+}
+
+bool audio_extn_can_use_bcl(void)
+{
+ char prop_bcl_enabled[PROPERTY_VALUE_MAX] = "false";
+
+ property_get("persist.vendor.audio.bcl.enabled", prop_bcl_enabled, "0");
+ if (!strncmp("true", prop_bcl_enabled, 4)) {
+ aextnmod.bcl_enabled = 1;
+ }
+
+ ALOGD("%s: bcl.enabled property is set to %s", __func__, prop_bcl_enabled);
+ return (aextnmod.bcl_enabled ? true: false);
+}
#endif
#ifdef RAS_ENABLED
@@ -824,6 +844,7 @@
aextnmod.proxy_channel_num = 2;
aextnmod.hpx_enabled = 0;
aextnmod.vbat_enabled = 0;
+ aextnmod.bcl_enabled = 0;
aextnmod.hifi_audio_enabled = 0;
aextnmod.addr.nap = 0;
aextnmod.addr.uap = 0;
diff --git a/hal/audio_extn/audio_extn.h b/hal/audio_extn/audio_extn.h
index 365b03e..d3e7a5f 100644
--- a/hal/audio_extn/audio_extn.h
+++ b/hal/audio_extn/audio_extn.h
@@ -169,9 +169,13 @@
#ifndef VBAT_MONITOR_ENABLED
#define audio_extn_is_vbat_enabled() (0)
#define audio_extn_can_use_vbat() (0)
+#define audio_extn_is_bcl_enabled() (0)
+#define audio_extn_can_use_bcl() (0)
#else
bool audio_extn_is_vbat_enabled(void);
bool audio_extn_can_use_vbat(void);
+bool audio_extn_is_bcl_enabled(void);
+bool audio_extn_can_use_bcl(void);
#endif
#ifndef RAS_ENABLED
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
index e8da091..cd2a816 100755
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -238,6 +238,7 @@
bool is_acdb_initialized;
/* Vbat monitor related flags */
bool is_vbat_speaker;
+ bool is_bcl_speaker;
bool gsm_mode_enabled;
bool is_slimbus_interface;
bool is_internal_codec;
@@ -1751,6 +1752,9 @@
ret = 0;
if ((plat_data->is_vbat_speaker) && (WCD9XXX_VBAT_CAL == type)) {
+ /* VBAT BCL speaker does not need tuning data */
+ if (!plat_data->is_bcl_speaker)
+ return;
ret = send_vbat_adc_data_to_acdb(plat_data, cal_name_info[type]);
if (ret < 0)
ALOGE("%s error in sending vbat adc data to acdb", __func__);
@@ -2218,6 +2222,10 @@
if (ret)
my_data->is_vbat_speaker = true;
+ ret = audio_extn_can_use_bcl();
+ if (ret)
+ my_data->is_bcl_speaker = true;
+
list_init(&my_data->acdb_meta_key_list);
set_platform_defaults(my_data);
@@ -3392,7 +3400,7 @@
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
- if (my_data->is_vbat_speaker)
+ if (my_data->is_vbat_speaker || my_data->is_bcl_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
else
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
@@ -3467,7 +3475,7 @@
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_VBAT ||
out_snd_device == SND_DEVICE_OUT_VOICE_SPEAKER_2_VBAT) &&
audio_extn_spkr_prot_is_enabled()) {
- if (my_data->is_vbat_speaker)
+ if (my_data->is_vbat_speaker || my_data->is_bcl_speaker)
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED_VBAT];
else
acdb_rx_id = acdb_device_table[SND_DEVICE_OUT_SPEAKER_PROTECTED];
@@ -3989,7 +3997,7 @@
else
snd_device = SND_DEVICE_OUT_BT_SCO;
} else if (devices & AUDIO_DEVICE_OUT_SPEAKER) {
- if (my_data->is_vbat_speaker) {
+ if (my_data->is_vbat_speaker || my_data->is_bcl_speaker) {
if (hw_info_is_stereo_spkr(my_data->hw_info)) {
if (my_data->mono_speaker == SPKR_1)
snd_device = SND_DEVICE_OUT_VOICE_SPEAKER_VBAT;
@@ -4073,7 +4081,7 @@
snd_device = SND_DEVICE_OUT_SPEAKER_EXTERNAL_2;
else if (adev->speaker_lr_swap)
snd_device = SND_DEVICE_OUT_SPEAKER_REVERSE;
- else if (my_data->is_vbat_speaker)
+ else if (my_data->is_vbat_speaker || my_data->is_bcl_speaker)
snd_device = SND_DEVICE_OUT_SPEAKER_VBAT;
else
snd_device = SND_DEVICE_OUT_SPEAKER;