Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04691cf6 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 427b24e3 4c519967
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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" />
+53 −0
Original line number Diff line number Diff line
@@ -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;