Merge "hal: enable TERT TDM TX to SEC RX hostless"

This commit is contained in:
Linux Build Service Account 2018-12-08 15:19:21 -08:00 committed by Gerrit - the friendly Code Review server
commit 0e5e6d2d63
2 changed files with 57 additions and 0 deletions

View File

@ -318,6 +318,10 @@
<ctl name="SEC_TDM_RX_0 Audio Mixer MultiMedia9" value="0" />
<ctl name="MultiMedia9 Mixer TERT_TDM_TX_0" value="0" />
<path name="dummy-hostless">
<ctl name="SEC_TDM_RX_7 Port Mixer TERT_TDM_TX_7" value="1" />
</path>
<!-- Codec controls -->
<!-- WSA controls -->
<ctl name="SpkrLeft COMP Switch" value="0" />

View File

@ -62,6 +62,57 @@ struct ext_hw_plugin_data {
/* This can be defined in platform specific file or use compile flag */
#define LIB_PLUGIN_DRIVER "libaudiohalplugin.so"
/* Note: Due to ADP H/W design, SoC TERT/SEC TDM CLK and FSYNC lines are both connected
* with CODEC and a single master is needed to provide consistent CLK and FSYNC to slaves,
* hence configuring SoC TERT TDM as single master and bring up a dummy hostless from TERT
* to SEC to ensure both slave SoC SEC TDM and CODEC are driven upon system boot. */
static void audio_extn_ext_hw_plugin_enable_adev_hostless(struct audio_device *adev)
{
ALOGI("%s: Enable TERT -> SEC Hostless", __func__);
char mixer_path[MIXER_PATH_MAX_LENGTH];
strlcpy(mixer_path, "dummy-hostless", MIXER_PATH_MAX_LENGTH);
ALOGD("%s: apply mixer and update path: %s", __func__, mixer_path);
audio_route_apply_and_update_path(adev->audio_route, mixer_path);
/* TERT TDM TX 7 HOSTLESS to SEC TDM RX 7 HOSTLESS */
int pcm_dev_rx = 48, pcm_dev_tx = 49;
struct pcm_config pcm_config_lb = {
.channels = 1,
.rate = 48000,
.period_size = 240,
.period_count = 2,
.format = PCM_FORMAT_S16_LE,
.start_threshold = 0,
.stop_threshold = INT_MAX,
.avail_min = 0,
};
struct pcm *pcm_tx = pcm_open(adev->snd_card,
pcm_dev_tx,
PCM_IN, &pcm_config_lb);
if (pcm_tx && !pcm_is_ready(pcm_tx)) {
ALOGE("%s: %s", __func__, pcm_get_error(pcm_tx));
return;
}
struct pcm *pcm_rx = pcm_open(adev->snd_card,
pcm_dev_rx,
PCM_OUT, &pcm_config_lb);
if (pcm_rx && !pcm_is_ready(pcm_rx)) {
ALOGE("%s: %s", __func__, pcm_get_error(pcm_rx));
return;
}
if (pcm_start(pcm_tx) < 0) {
ALOGE("%s: pcm start for pcm tx failed", __func__);
return;
}
if (pcm_start(pcm_rx) < 0) {
ALOGE("%s: pcm start for pcm rx failed", __func__);
return;
}
}
void* audio_extn_ext_hw_plugin_init(struct audio_device *adev)
{
int32_t ret = 0;
@ -114,6 +165,8 @@ void* audio_extn_ext_hw_plugin_init(struct audio_device *adev)
}
}
audio_extn_ext_hw_plugin_enable_adev_hostless(adev);
my_plugin->mic_mute = false;
return my_plugin;