hal: add support for SPDIF and HDMI input for qcs405
Add support for SPDIF/HDMI/HDMI-ARC backend.
Change-Id: I24f307074f3ceed4d4f484e4482458084063da19
diff --git a/hal/msm8974/platform.c b/hal/msm8974/platform.c
old mode 100755
new mode 100644
index e84ef41..1aa3147
--- a/hal/msm8974/platform.c
+++ b/hal/msm8974/platform.c
@@ -480,7 +480,9 @@
[SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = "headset-mic",
[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = "voice-speaker-mic",
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = "voice-headset-mic",
- [SND_DEVICE_IN_HDMI_MIC] = "hdmi-mic",
+ [SND_DEVICE_IN_SPDIF] = "spdif-in",
+ [SND_DEVICE_IN_HDMI_MIC] = "hdmi-in",
+ [SND_DEVICE_IN_HDMI_ARC] = "hdmi-arc-in",
[SND_DEVICE_IN_BT_SCO_MIC] = "bt-sco-mic",
[SND_DEVICE_IN_BT_SCO_MIC_NREC] = "bt-sco-mic",
[SND_DEVICE_IN_BT_SCO_MIC_WB] = "bt-sco-mic-wb",
@@ -646,7 +648,9 @@
[SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = 47,
[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = 11,
[SND_DEVICE_IN_VOICE_HEADSET_MIC] = 8,
+ [SND_DEVICE_IN_SPDIF] = 4,
[SND_DEVICE_IN_HDMI_MIC] = 4,
+ [SND_DEVICE_IN_HDMI_ARC] = 4,
[SND_DEVICE_IN_BT_SCO_MIC] = 21,
[SND_DEVICE_IN_BT_SCO_MIC_NREC] = 122,
[SND_DEVICE_IN_BT_SCO_MIC_WB] = 38,
@@ -794,7 +798,9 @@
{TO_NAME_INDEX(SND_DEVICE_IN_HEADSET_MIC_FLUENCE)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_SPEAKER_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_VOICE_HEADSET_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_SPDIF)},
{TO_NAME_INDEX(SND_DEVICE_IN_HDMI_MIC)},
+ {TO_NAME_INDEX(SND_DEVICE_IN_HDMI_ARC)},
{TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC)},
{TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_NREC)},
{TO_NAME_INDEX(SND_DEVICE_IN_BT_SCO_MIC_WB)},
@@ -1374,7 +1380,9 @@
backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("bt-sco-wb");
backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("bt-sco");
backend_tag_table[SND_DEVICE_IN_BT_SCO_MIC_WB_NREC] = strdup("bt-sco-wb");
- backend_tag_table[SND_DEVICE_IN_HDMI_MIC] = strdup("hdmi-mic");
+ backend_tag_table[SND_DEVICE_IN_SPDIF] = strdup("spdif-in");
+ backend_tag_table[SND_DEVICE_IN_HDMI_MIC] = strdup("hdmi-in");
+ backend_tag_table[SND_DEVICE_IN_HDMI_ARC] = strdup("hdmi-arc-in");
backend_tag_table[SND_DEVICE_OUT_BT_SCO] = strdup("bt-sco");
backend_tag_table[SND_DEVICE_OUT_BT_SCO_WB] = strdup("bt-sco-wb");
backend_tag_table[SND_DEVICE_OUT_HDMI] = strdup("hdmi");
@@ -1493,7 +1501,9 @@
hw_interface_table[SND_DEVICE_IN_HEADSET_MIC_FLUENCE] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_SPEAKER_MIC] = strdup("SLIMBUS_0_TX");
hw_interface_table[SND_DEVICE_IN_VOICE_HEADSET_MIC] = strdup("SLIMBUS_0_TX");
- hw_interface_table[SND_DEVICE_IN_HDMI_MIC] = strdup("HDMI");
+ hw_interface_table[SND_DEVICE_IN_SPDIF] = strdup("PRI_SPDIF_TX");
+ hw_interface_table[SND_DEVICE_IN_HDMI_MIC] = strdup("SEC_MI2S_TX");
+ hw_interface_table[SND_DEVICE_IN_HDMI_ARC] = strdup("SEC_SPDIF_TX");
hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC] = strdup("SLIMBUS_7_TX");
hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_NREC] = strdup("SLIMBUS_7_TX");
hw_interface_table[SND_DEVICE_IN_BT_SCO_MIC_WB] = strdup("SLIMBUS_7_TX");
@@ -2450,12 +2460,36 @@
my_data->current_backend_cfg[USB_AUDIO_TX_BACKEND].channels_mixer_ctl =
strdup("USB_AUDIO_TX Channels");
- my_data->current_backend_cfg[HDMI_TX_BACKEND].bitwidth_mixer_ctl =
- strdup("QUAT_MI2S_TX Format");
- my_data->current_backend_cfg[HDMI_TX_BACKEND].samplerate_mixer_ctl =
- strdup("QUAT_MI2S_TX SampleRate");
- my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
- strdup("QUAT_MI2S_TX Channels");
+ if (!strncmp(platform_get_snd_device_backend_interface(SND_DEVICE_IN_HDMI_MIC),
+ "SEC_MI2S_TX", sizeof("SEC_MI2S_TX"))) {
+ my_data->current_backend_cfg[HDMI_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("SEC_MI2S_TX Format");
+ my_data->current_backend_cfg[HDMI_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("SEC_MI2S_TX SampleRate");
+ my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
+ strdup("SEC_MI2S_TX Channels");
+ } else {
+ my_data->current_backend_cfg[HDMI_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("QUAT_MI2S_TX Format");
+ my_data->current_backend_cfg[HDMI_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("QUAT_MI2S_TX SampleRate");
+ my_data->current_backend_cfg[HDMI_TX_BACKEND].channels_mixer_ctl =
+ strdup("QUAT_MI2S_TX Channels");
+ }
+
+ my_data->current_backend_cfg[SPDIF_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("PRIM_SPDIF_TX Format");
+ my_data->current_backend_cfg[SPDIF_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("PRIM_SPDIF_TX SampleRate");
+ my_data->current_backend_cfg[SPDIF_TX_BACKEND].channels_mixer_ctl =
+ strdup("PRIM_SPDIF_TX Channels");
+
+ my_data->current_backend_cfg[HDMI_ARC_TX_BACKEND].bitwidth_mixer_ctl =
+ strdup("SEC_SPDIF_TX Format");
+ my_data->current_backend_cfg[HDMI_ARC_TX_BACKEND].samplerate_mixer_ctl =
+ strdup("SEC_SPDIF_TX SampleRate");
+ my_data->current_backend_cfg[HDMI_ARC_TX_BACKEND].channels_mixer_ctl =
+ strdup("SEC_SPDIF_TX Channels");
for (idx = 0; idx < MAX_CODEC_BACKENDS; idx++) {
if (my_data->current_backend_cfg[idx].bitwidth_mixer_ctl) {
@@ -3228,8 +3262,12 @@
port = USB_AUDIO_TX_BACKEND;
else if (strstr(backend_tag_table[snd_device], "bt-sco") != NULL)
port = BT_SCO_TX_BACKEND;
- else if (strcmp(backend_tag_table[snd_device], "hdmi-mic") == 0)
+ else if (strcmp(backend_tag_table[snd_device], "spdif-in") == 0)
+ port = SPDIF_TX_BACKEND;
+ else if (strcmp(backend_tag_table[snd_device], "hdmi-in") == 0)
port = HDMI_TX_BACKEND;
+ else if (strcmp(backend_tag_table[snd_device], "hdmi-arc-in") == 0)
+ port = HDMI_ARC_TX_BACKEND;
}
} else {
ALOGW("%s:napb: Invalid device - %d ", __func__, snd_device);
@@ -4545,8 +4583,13 @@
else
snd_device = SND_DEVICE_IN_BT_SCO_MIC;
}
+ } else if (in_device & AUDIO_DEVICE_IN_SPDIF) {
+ snd_device = SND_DEVICE_IN_SPDIF;
} else if (in_device & AUDIO_DEVICE_IN_AUX_DIGITAL) {
snd_device = SND_DEVICE_IN_HDMI_MIC;
+ } else if (in_device & AUDIO_DEVICE_IN_TV_TUNER) {
+ /* add separate AUDIO_DEVICE for this? */
+ snd_device = SND_DEVICE_IN_HDMI_ARC;
} else if (in_device & AUDIO_DEVICE_IN_ANLG_DOCK_HEADSET ||
in_device & AUDIO_DEVICE_IN_DGTL_DOCK_HEADSET) {
snd_device = SND_DEVICE_IN_USB_HEADSET_MIC;
@@ -5784,7 +5827,9 @@
if (rate_str == NULL) {
switch (sample_rate) {
case 32000:
- if (passthrough_enabled || (backend_idx == HDMI_TX_BACKEND )) {
+ if (passthrough_enabled || (backend_idx == SPDIF_TX_BACKEND ) ||
+ (backend_idx == HDMI_TX_BACKEND ) ||
+ (backend_idx == HDMI_ARC_TX_BACKEND )) {
rate_str = "KHZ_32";
break;
}
@@ -5893,8 +5938,18 @@
} else if (backend_idx == DISP_PORT_RX_BACKEND) {
ext_disp_format = "Display Port RX Format";
set_ext_disp_format = true;
+ } else if (backend_idx == SPDIF_TX_BACKEND) {
+ ext_disp_format = "PRI SPDIF TX Format";
+ set_mi2s_tx_data_format = true;
} else if (backend_idx == HDMI_TX_BACKEND) {
- ext_disp_format = "QUAT MI2S TX Format";
+ if (!strncmp(platform_get_snd_device_backend_interface(snd_device),
+ "SEC_MI2S_TX", sizeof("SEC_MI2S_TX")))
+ ext_disp_format = "SEC MI2S TX Format";
+ else
+ ext_disp_format = "QUAT MI2S TX Format";
+ set_mi2s_tx_data_format = true;
+ } else if (backend_idx == HDMI_ARC_TX_BACKEND) {
+ ext_disp_format = "SEC SPDIF TX Format";
set_mi2s_tx_data_format = true;
} else {
ALOGV("%s: Format doesnt have to be set", __func__);
@@ -5911,10 +5966,10 @@
return -EINVAL;
}
if (format == AUDIO_FORMAT_PCM) {
- ALOGE("%s:MI2S data format LPCM", __func__);
+ ALOGE("%s:Set %s to LPCM", __func__, ext_disp_format);
mixer_ctl_set_enum_by_string(ctl, "LPCM");
} else {
- ALOGE("%s:MI2S data format Compr", __func__);
+ ALOGE("%s:Set %s to Compr", __func__, ext_disp_format);
mixer_ctl_set_enum_by_string(ctl, "Compr");
}
my_data->current_backend_cfg[backend_idx].format = format;
diff --git a/hal/msm8974/platform.h b/hal/msm8974/platform.h
index e0aa58d..01f1516 100644
--- a/hal/msm8974/platform.h
+++ b/hal/msm8974/platform.h
@@ -174,7 +174,9 @@
SND_DEVICE_IN_HEADSET_MIC_FLUENCE,
SND_DEVICE_IN_VOICE_SPEAKER_MIC,
SND_DEVICE_IN_VOICE_HEADSET_MIC,
+ SND_DEVICE_IN_SPDIF,
SND_DEVICE_IN_HDMI_MIC,
+ SND_DEVICE_IN_HDMI_ARC,
SND_DEVICE_IN_BT_SCO_MIC,
SND_DEVICE_IN_BT_SCO_MIC_NREC,
SND_DEVICE_IN_BT_SCO_MIC_WB,
@@ -266,7 +268,9 @@
DEFAULT_CODEC_TX_BACKEND = SLIMBUS_0_TX,
USB_AUDIO_TX_BACKEND,
BT_SCO_TX_BACKEND,
+ SPDIF_TX_BACKEND,
HDMI_TX_BACKEND,
+ HDMI_ARC_TX_BACKEND,
MAX_CODEC_BACKENDS
};