Merge "asoc: qcs405: Add dai links for hdmi tx"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
1aec879743
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -25,8 +25,8 @@
|
||||
static SOC_ENUM_SINGLE_DECL(ext_disp_audio_ack_state##index, \
|
||||
SND_SOC_NOPM, index, ext_disp_audio_ack_text)
|
||||
|
||||
#define SWITCH_DP_CODEC(codec_info, codec_data, dai_id) \
|
||||
codec_info.type = EXT_DISPLAY_TYPE_DP; \
|
||||
#define SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type) \
|
||||
codec_info.type = type; \
|
||||
codec_info.ctrl_id = codec_data->ctl[dai_id]; \
|
||||
codec_info.stream_id = codec_data->stream[dai_id]; \
|
||||
|
||||
@@ -38,6 +38,7 @@ enum {
|
||||
enum {
|
||||
DP_STREAM0 = 0,
|
||||
DP_STREAM1,
|
||||
HDMI,
|
||||
DP_STREAM_MAX,
|
||||
};
|
||||
|
||||
@@ -49,6 +50,7 @@ enum {
|
||||
DP_DAI1 = 1,
|
||||
DP_DAI2,
|
||||
HDMI_DAI,
|
||||
HDMI_MS_DAI,
|
||||
DP_DAI_MAX,
|
||||
};
|
||||
|
||||
@@ -60,6 +62,8 @@ SOC_EXT_DISP_AUDIO_TYPE(1);
|
||||
SOC_EXT_DISP_AUDIO_ACK_STATE(1);
|
||||
SOC_EXT_DISP_AUDIO_TYPE(2);
|
||||
SOC_EXT_DISP_AUDIO_ACK_STATE(2);
|
||||
SOC_EXT_DISP_AUDIO_TYPE(3);
|
||||
SOC_EXT_DISP_AUDIO_ACK_STATE(3);
|
||||
|
||||
struct msm_ext_disp_audio_codec_rx_data {
|
||||
struct platform_device *ext_disp_core_pdev;
|
||||
@@ -80,6 +84,7 @@ static int msm_ext_disp_edid_ctl_info(struct snd_kcontrol *kcontrol,
|
||||
int rc = 0;
|
||||
struct msm_ext_disp_codec_id codec_info;
|
||||
int dai_id = kcontrol->private_value;
|
||||
int type;
|
||||
|
||||
codec_data = snd_soc_component_get_drvdata(component);
|
||||
if (!codec_data) {
|
||||
@@ -91,7 +96,11 @@ static int msm_ext_disp_edid_ctl_info(struct snd_kcontrol *kcontrol,
|
||||
codec_data->ctl[dai_id], codec_data->stream[dai_id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
|
||||
if (dai_id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) {
|
||||
@@ -126,6 +135,7 @@ static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol,
|
||||
struct msm_ext_disp_codec_id codec_info;
|
||||
int rc = 0;
|
||||
int dai_id = kcontrol->private_value;
|
||||
int type;
|
||||
|
||||
codec_data = snd_soc_component_get_drvdata(component);
|
||||
if (!codec_data) {
|
||||
@@ -138,7 +148,11 @@ static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol,
|
||||
codec_data->ctl[dai_id], codec_data->stream[dai_id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
|
||||
if (dai_id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
if (!codec_data->ext_disp_ops.get_audio_edid_blk || rc) {
|
||||
@@ -147,7 +161,6 @@ static int msm_ext_disp_edid_get(struct snd_kcontrol *kcontrol,
|
||||
mutex_unlock(&codec_data->dp_ops_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rc = codec_data->ext_disp_ops.get_audio_edid_blk(
|
||||
codec_data->ext_disp_core_pdev, &edid_blk);
|
||||
mutex_unlock(&codec_data->dp_ops_lock);
|
||||
@@ -188,6 +201,7 @@ static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol,
|
||||
struct msm_ext_disp_codec_id codec_info;
|
||||
int rc = 0;
|
||||
int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l;
|
||||
int type;
|
||||
|
||||
codec_data = snd_soc_component_get_drvdata(component);
|
||||
if (!codec_data) {
|
||||
@@ -200,7 +214,11 @@ static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol,
|
||||
codec_data->ctl[dai_id], codec_data->stream[dai_id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
|
||||
if (dai_id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
|
||||
@@ -213,7 +231,7 @@ static int msm_ext_disp_audio_type_get(struct snd_kcontrol *kcontrol,
|
||||
}
|
||||
|
||||
cable_state = codec_data->ext_disp_ops.cable_status(
|
||||
codec_data->ext_disp_core_pdev, 1);
|
||||
codec_data->ext_disp_core_pdev, 1);
|
||||
if (cable_state < 0) {
|
||||
dev_err(component->dev, "%s: Error retrieving cable state from ext_disp, err:%d\n",
|
||||
__func__, cable_state);
|
||||
@@ -274,6 +292,7 @@ static int msm_ext_disp_audio_ack_set(struct snd_kcontrol *kcontrol,
|
||||
struct msm_ext_disp_codec_id codec_info;
|
||||
int rc = 0;
|
||||
int dai_id = ((struct soc_enum *) kcontrol->private_value)->shift_l;
|
||||
int type;
|
||||
|
||||
codec_data = snd_soc_component_get_drvdata(component);
|
||||
if (!codec_data) {
|
||||
@@ -287,7 +306,11 @@ static int msm_ext_disp_audio_ack_set(struct snd_kcontrol *kcontrol,
|
||||
codec_data->ctl[dai_id], codec_data->stream[dai_id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id);
|
||||
if (dai_id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai_id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
|
||||
@@ -421,6 +444,15 @@ static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = {
|
||||
.get = msm_ext_disp_edid_get,
|
||||
.private_value = HDMI_DAI,
|
||||
},
|
||||
{
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READ |
|
||||
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
|
||||
.iface = SNDRV_CTL_ELEM_IFACE_PCM,
|
||||
.name = "HDMI MS EDID",
|
||||
.info = msm_ext_disp_edid_ctl_info,
|
||||
.get = msm_ext_disp_edid_get,
|
||||
.private_value = HDMI_MS_DAI,
|
||||
},
|
||||
{
|
||||
.access = SNDRV_CTL_ELEM_ACCESS_READ |
|
||||
SNDRV_CTL_ELEM_ACCESS_VOLATILE,
|
||||
@@ -445,12 +477,18 @@ static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = {
|
||||
SOC_ENUM_EXT("External Display1 Type",
|
||||
ext_disp_audio_type2,
|
||||
msm_ext_disp_audio_type_get, NULL),
|
||||
SOC_ENUM_EXT("External HDMI Type",
|
||||
ext_disp_audio_type3,
|
||||
msm_ext_disp_audio_type_get, NULL),
|
||||
SOC_ENUM_EXT("External Display Audio Ack",
|
||||
ext_disp_audio_ack_state1,
|
||||
NULL, msm_ext_disp_audio_ack_set),
|
||||
SOC_ENUM_EXT("External Display1 Audio Ack",
|
||||
ext_disp_audio_ack_state2,
|
||||
NULL, msm_ext_disp_audio_ack_set),
|
||||
SOC_ENUM_EXT("External HDMI Audio Ack",
|
||||
ext_disp_audio_ack_state3,
|
||||
NULL, msm_ext_disp_audio_ack_set),
|
||||
|
||||
SOC_SINGLE_MULTI_EXT("External Display Audio Device",
|
||||
SND_SOC_NOPM, DP_DAI1, DP_STREAM_MAX - 1, 0, 2,
|
||||
@@ -460,6 +498,11 @@ static const struct snd_kcontrol_new msm_ext_disp_codec_rx_controls[] = {
|
||||
SND_SOC_NOPM, DP_DAI2, DP_STREAM_MAX - 1, 0, 2,
|
||||
msm_ext_disp_audio_device_get,
|
||||
msm_ext_disp_audio_device_set),
|
||||
SOC_SINGLE_MULTI_EXT("External HDMI Device",
|
||||
SND_SOC_NOPM, HDMI_MS_DAI, DP_STREAM_MAX - 1, 0, 2,
|
||||
msm_ext_disp_audio_device_get,
|
||||
msm_ext_disp_audio_device_set),
|
||||
|
||||
};
|
||||
|
||||
static int msm_ext_disp_audio_codec_rx_dai_startup(
|
||||
@@ -470,6 +513,7 @@ static int msm_ext_disp_audio_codec_rx_dai_startup(
|
||||
struct msm_ext_disp_codec_id codec_info;
|
||||
struct msm_ext_disp_audio_codec_rx_data *codec_data =
|
||||
dev_get_drvdata(dai->component->dev);
|
||||
int type;
|
||||
|
||||
if (!codec_data) {
|
||||
dev_err(dai->dev, "%s() codec_data is null\n",
|
||||
@@ -482,7 +526,11 @@ static int msm_ext_disp_audio_codec_rx_dai_startup(
|
||||
codec_data->ctl[dai->id], codec_data->stream[dai->id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
|
||||
if (dai->id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
|
||||
@@ -524,7 +572,7 @@ static int msm_ext_disp_audio_codec_rx_dai_hw_params(
|
||||
struct msm_ext_disp_codec_id codec_info;
|
||||
int rc = 0;
|
||||
struct msm_ext_disp_audio_setup_params audio_setup_params = {0};
|
||||
|
||||
int type;
|
||||
struct msm_ext_disp_audio_codec_rx_data *codec_data =
|
||||
dev_get_drvdata(dai->component->dev);
|
||||
|
||||
@@ -539,7 +587,11 @@ static int msm_ext_disp_audio_codec_rx_dai_hw_params(
|
||||
codec_data->ctl[dai->id], codec_data->stream[dai->id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
|
||||
if (dai->id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
|
||||
@@ -609,7 +661,7 @@ static int msm_ext_disp_audio_codec_rx_dai_hw_params(
|
||||
audio_setup_params.down_mix = down_mix;
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
if (rc)
|
||||
@@ -636,6 +688,7 @@ static void msm_ext_disp_audio_codec_rx_dai_shutdown(
|
||||
|
||||
struct msm_ext_disp_audio_codec_rx_data *codec_data =
|
||||
dev_get_drvdata(dai->component->dev);
|
||||
int type;
|
||||
|
||||
if (!codec_data) {
|
||||
dev_err(dai->dev, "%s() codec_data is null\n",
|
||||
@@ -648,7 +701,11 @@ static void msm_ext_disp_audio_codec_rx_dai_shutdown(
|
||||
codec_data->ctl[dai->id], codec_data->stream[dai->id]);
|
||||
|
||||
mutex_lock(&codec_data->dp_ops_lock);
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id);
|
||||
if (dai->id == HDMI_MS_DAI)
|
||||
type = EXT_DISPLAY_TYPE_HDMI;
|
||||
else
|
||||
type = EXT_DISPLAY_TYPE_DP;
|
||||
SWITCH_DP_CODEC(codec_info, codec_data, dai->id, type);
|
||||
rc = msm_ext_disp_select_audio_codec(codec_data->ext_disp_core_pdev,
|
||||
&codec_info);
|
||||
|
||||
@@ -754,6 +811,20 @@ static struct snd_soc_dai_driver msm_ext_disp_audio_codec_rx_dais[] = {
|
||||
},
|
||||
.ops = &msm_ext_disp_audio_codec_rx_dai_ops,
|
||||
},
|
||||
{
|
||||
.name = "msm_hdmi_ms_audio_codec_rx_dai",
|
||||
.id = HDMI_MS_DAI,
|
||||
.playback = {
|
||||
.stream_name = "HDMI MS Playback",
|
||||
.channels_min = 1,
|
||||
.channels_max = 8,
|
||||
.rate_min = 48000,
|
||||
.rate_max = 48000,
|
||||
.rates = MSM_EXT_DISP_PCM_RATES,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE,
|
||||
},
|
||||
.ops = &msm_ext_disp_audio_codec_rx_dai_ops,
|
||||
},
|
||||
{
|
||||
.name = "msm_dp_audio_codec_rx_dai",
|
||||
.id = DP_DAI1,
|
||||
|
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
@@ -54,7 +54,7 @@ struct msm_dai_q6_hdmi_dai_data {
|
||||
static int get_port_id(int dai_id)
|
||||
{
|
||||
/* Currently, display devices share a common AFE port */
|
||||
if (dai_id != HDMI_RX)
|
||||
if (dai_id != HDMI_RX || dai_id != HDMI_RX_MS)
|
||||
return DISPLAY_PORT_RX;
|
||||
|
||||
return dai_id;
|
||||
@@ -436,7 +436,7 @@ static int msm_dai_q6_hdmi_dai_probe(struct snd_soc_dai *dai)
|
||||
|
||||
msm_dai_q6_hdmi_set_dai_id(dai);
|
||||
|
||||
if (dai->driver->id == HDMI_RX) {
|
||||
if (dai->driver->id == HDMI_RX || dai->driver->id == HDMI_RX_MS) {
|
||||
kcontrol = &hdmi_config_controls[0];
|
||||
rc = snd_ctl_add(dai->component->card->snd_card,
|
||||
snd_ctl_new1(kcontrol, dai_data));
|
||||
@@ -563,6 +563,28 @@ static struct snd_soc_dai_driver msm_dai_q6_hdmi_hdmi_rx_dai = {
|
||||
.remove = msm_dai_q6_hdmi_dai_remove,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver msm_dai_q6_hdmi_hdmi_ms_rx_dai = {
|
||||
.playback = {
|
||||
.stream_name = "HDMI MS Playback",
|
||||
.aif_name = "HDMI_MS",
|
||||
.rates = SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 |
|
||||
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_88200 |
|
||||
SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_176400 |
|
||||
SNDRV_PCM_RATE_192000,
|
||||
.formats = SNDRV_PCM_FMTBIT_S16_LE |
|
||||
SNDRV_PCM_FMTBIT_S24_LE |
|
||||
SNDRV_PCM_FMTBIT_S24_3LE,
|
||||
.channels_min = 2,
|
||||
.channels_max = 8,
|
||||
.rate_max = 192000,
|
||||
.rate_min = 48000,
|
||||
},
|
||||
.ops = &msm_dai_q6_hdmi_ops,
|
||||
.id = HDMI_RX_MS,
|
||||
.probe = msm_dai_q6_hdmi_dai_probe,
|
||||
.remove = msm_dai_q6_hdmi_dai_remove,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_driver msm_dai_q6_display_port_rx_dai[] = {
|
||||
{
|
||||
.playback = {
|
||||
@@ -646,6 +668,12 @@ static int msm_dai_q6_hdmi_dev_probe(struct platform_device *pdev)
|
||||
&msm_dai_hdmi_q6_component,
|
||||
&msm_dai_q6_display_port_rx_dai[1], 1);
|
||||
break;
|
||||
case HDMI_RX_MS:
|
||||
rc = snd_soc_register_component(&pdev->dev,
|
||||
&msm_dai_hdmi_q6_component,
|
||||
&msm_dai_q6_hdmi_hdmi_ms_rx_dai, 1);
|
||||
break;
|
||||
|
||||
default:
|
||||
dev_err(&pdev->dev, "invalid device ID %d\n", pdev->id);
|
||||
rc = -ENODEV;
|
||||
|
@@ -146,6 +146,7 @@ struct msm_pcm_route_bdai_pp_params {
|
||||
static struct msm_pcm_route_bdai_pp_params
|
||||
msm_bedais_pp_params[MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX] = {
|
||||
{HDMI_RX, 0, 0, 0},
|
||||
{HDMI_RX_MS, 0, 0, 0},
|
||||
{DISPLAY_PORT_RX, 0, 0, 0},
|
||||
};
|
||||
|
||||
@@ -698,6 +699,7 @@ struct msm_pcm_routing_bdai_data msm_bedais[MSM_BACKEND_DAI_MAX] = {
|
||||
LPASS_BE_SEC_META_MI2S_RX},
|
||||
{ RT_PROXY_PORT_002_RX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_RX},
|
||||
{ RT_PROXY_PORT_002_TX, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_PROXY_TX},
|
||||
{ HDMI_RX_MS, 0, {0}, {0}, 0, 0, 0, 0, LPASS_BE_HDMI_MS},
|
||||
};
|
||||
|
||||
/* Track ASM playback & capture sessions of DAI
|
||||
@@ -3533,7 +3535,7 @@ static const char *const be_name[] = {
|
||||
"RX_CDC_DMA_RX_6", "RX_CDC_DMA_RX_7",
|
||||
"PRI_SPDIF_TX", "SEC_SPDIF_RX", "SEC_SPDIF_TX",
|
||||
"SLIM_9_RX", "SLIM_9_TX", "AFE_LOOPBACK_TX", "PRI_META_MI2S_RX",
|
||||
"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX"
|
||||
"SEC_META_MI2S_RX", "PROXY_RX", "PROXY_TX", "HDMI_RX_MS"
|
||||
};
|
||||
|
||||
static SOC_ENUM_SINGLE_DECL(mm1_channel_mux,
|
||||
@@ -7548,6 +7550,101 @@ static const struct snd_kcontrol_new hdmi_mixer_controls[] = {
|
||||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new hdmi_ms_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA1, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia2", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA2, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia3", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA3, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia4", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA4, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia5", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA5, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia6", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA6, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia7", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA7, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia8", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA8, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia9", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA9, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia10", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA10, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia11", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA11, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia12", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA12, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia13", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA13, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia14", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA14, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia15", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA15, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia16", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA16, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia17", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA17, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia18", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA18, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia19", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA19, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia26", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA26, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia28", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA28, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia29", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA29, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
SOC_DOUBLE_EXT("MultiMedia30", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_FRONTEND_DAI_MULTIMEDIA30, 1, 0, msm_routing_get_audio_mixer,
|
||||
msm_routing_put_audio_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new display_port_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("MultiMedia1", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_DISPLAY_PORT_RX,
|
||||
@@ -18457,6 +18554,13 @@ static const struct snd_kcontrol_new hdmi_rx_port_mixer_controls[] = {
|
||||
msm_routing_put_port_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new hdmi_rx_ms_port_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_BACKEND_DAI_MI2S_TX, 1, 0, msm_routing_get_port_mixer,
|
||||
msm_routing_put_port_mixer),
|
||||
};
|
||||
|
||||
static const struct snd_kcontrol_new display_port_rx_port_mixer_controls[] = {
|
||||
SOC_DOUBLE_EXT("MI2S_TX", SND_SOC_NOPM,
|
||||
MSM_BACKEND_DAI_DISPLAY_PORT_RX,
|
||||
@@ -24224,6 +24328,7 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_2_RX", "Slimbus2 Playback", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("SLIMBUS_5_RX", "Slimbus5 Playback", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("HDMI", "HDMI Playback", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("HDMI_MS", "HDMI MS Playback", 0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT", "Display Port Playback",
|
||||
0, 0, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("DISPLAY_PORT1", "Display Port1 Playback",
|
||||
@@ -24672,6 +24777,8 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
||||
slimbus_9_rx_mixer_controls, ARRAY_SIZE(slimbus_9_rx_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("HDMI Mixer", SND_SOC_NOPM, 0, 0,
|
||||
hdmi_mixer_controls, ARRAY_SIZE(hdmi_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("HDMI_MS Mixer", SND_SOC_NOPM, 0, 0,
|
||||
hdmi_ms_mixer_controls, ARRAY_SIZE(hdmi_ms_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("DISPLAY_PORT Mixer", SND_SOC_NOPM, 0, 0,
|
||||
display_port_mixer_controls, ARRAY_SIZE(display_port_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("DISPLAY_PORT1 Mixer", SND_SOC_NOPM, 0, 0,
|
||||
@@ -25124,6 +25231,9 @@ static const struct snd_soc_dapm_widget msm_qdsp6_widgets[] = {
|
||||
SND_SOC_DAPM_MIXER("HDMI_RX Port Mixer",
|
||||
SND_SOC_NOPM, 0, 0, hdmi_rx_port_mixer_controls,
|
||||
ARRAY_SIZE(hdmi_rx_port_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("HDMI_RX_MS Port Mixer",
|
||||
SND_SOC_NOPM, 0, 0, hdmi_rx_ms_port_mixer_controls,
|
||||
ARRAY_SIZE(hdmi_rx_ms_port_mixer_controls)),
|
||||
SND_SOC_DAPM_MIXER("DISPLAY_PORT_RX Port Mixer",
|
||||
SND_SOC_NOPM, 0, 0, display_port_rx_port_mixer_controls,
|
||||
ARRAY_SIZE(display_port_rx_port_mixer_controls)),
|
||||
@@ -25665,6 +25775,25 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{"HDMI Mixer", "MultiMedia26", "MM_DL26"},
|
||||
{"HDMI", NULL, "HDMI Mixer"},
|
||||
|
||||
{"HDMI_MS Mixer", "MultiMedia1", "MM_DL1"},
|
||||
{"HDMI_MS Mixer", "MultiMedia2", "MM_DL2"},
|
||||
{"HDMI_MS Mixer", "MultiMedia3", "MM_DL3"},
|
||||
{"HDMI_MS Mixer", "MultiMedia4", "MM_DL4"},
|
||||
{"HDMI_MS Mixer", "MultiMedia5", "MM_DL5"},
|
||||
{"HDMI_MS Mixer", "MultiMedia6", "MM_DL6"},
|
||||
{"HDMI_MS Mixer", "MultiMedia7", "MM_DL7"},
|
||||
{"HDMI_MS Mixer", "MultiMedia8", "MM_DL8"},
|
||||
{"HDMI_MS Mixer", "MultiMedia9", "MM_DL9"},
|
||||
{"HDMI_MS Mixer", "MultiMedia10", "MM_DL10"},
|
||||
{"HDMI_MS Mixer", "MultiMedia11", "MM_DL11"},
|
||||
{"HDMI_MS Mixer", "MultiMedia12", "MM_DL12"},
|
||||
{"HDMI_MS Mixer", "MultiMedia13", "MM_DL13"},
|
||||
{"HDMI_MS Mixer", "MultiMedia14", "MM_DL14"},
|
||||
{"HDMI_MS Mixer", "MultiMedia15", "MM_DL15"},
|
||||
{"HDMI_MS Mixer", "MultiMedia16", "MM_DL16"},
|
||||
{"HDMI_MS Mixer", "MultiMedia26", "MM_DL26"},
|
||||
{"HDMI_MS", NULL, "HDMI_MS Mixer"},
|
||||
|
||||
{"DISPLAY_PORT Mixer", "MultiMedia1", "MM_DL1"},
|
||||
{"DISPLAY_PORT Mixer", "MultiMedia2", "MM_DL2"},
|
||||
{"DISPLAY_PORT Mixer", "MultiMedia3", "MM_DL3"},
|
||||
@@ -29344,6 +29473,9 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{"HDMI_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"HDMI", NULL, "HDMI_RX Port Mixer"},
|
||||
|
||||
{"HDMI_RX_MS Port Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"HDMI_MS", NULL, "HDMI_RX_MS Port Mixer"},
|
||||
|
||||
{"DISPLAY_PORT_RX Port Mixer", "MI2S_TX", "MI2S_TX"},
|
||||
{"DISPLAY_PORT", NULL, "DISPLAY_PORT_RX Port Mixer"},
|
||||
|
||||
@@ -29439,6 +29571,7 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{"BE_OUT", NULL, "SLIMBUS_9_RX"},
|
||||
{"BE_OUT", NULL, "USB_AUDIO_RX"},
|
||||
{"BE_OUT", NULL, "HDMI"},
|
||||
{"BE_OUT", NULL, "HDMI_MS"},
|
||||
{"BE_OUT", NULL, "DISPLAY_PORT"},
|
||||
{"BE_OUT", NULL, "DISPLAY_PORT1"},
|
||||
{"BE_OUT", NULL, "PRI_SPDIF_RX"},
|
||||
@@ -29927,7 +30060,8 @@ static int msm_routing_send_device_pp_params(int port_id, int copp_idx,
|
||||
|
||||
pr_debug("%s: port_id %d, copp_idx %d\n", __func__, port_id, copp_idx);
|
||||
|
||||
if (port_id != HDMI_RX && port_id != DISPLAY_PORT_RX) {
|
||||
if (port_id != HDMI_RX && port_id != DISPLAY_PORT_RX
|
||||
&& port_id != HDMI_RX_MS) {
|
||||
pr_err("%s: Device pp params on invalid port %d, copp_idx %d, fe_id %d\n",
|
||||
__func__, port_id, copp_idx, fe_id);
|
||||
return -EINVAL;
|
||||
@@ -30064,7 +30198,8 @@ static int msm_routing_put_device_pp_params_mixer(struct snd_kcontrol *kcontrol,
|
||||
|
||||
for (be_idx = 0; be_idx < MSM_BACKEND_DAI_MAX; be_idx++) {
|
||||
port_id = msm_bedais[be_idx].port_id;
|
||||
if (port_id == HDMI_RX || port_id == DISPLAY_PORT_RX)
|
||||
if (port_id == HDMI_RX || port_id == DISPLAY_PORT_RX
|
||||
|| port_id == HDMI_RX_MS)
|
||||
break;
|
||||
}
|
||||
|
||||
|
@@ -17,6 +17,7 @@
|
||||
#define LPASS_BE_SLIMBUS_0_RX "SLIMBUS_0_RX"
|
||||
#define LPASS_BE_SLIMBUS_0_TX "SLIMBUS_0_TX"
|
||||
#define LPASS_BE_HDMI "HDMI"
|
||||
#define LPASS_BE_HDMI_MS "HDMI_MS"
|
||||
#define LPASS_BE_DISPLAY_PORT "DISPLAY_PORT"
|
||||
#define LPASS_BE_DISPLAY_PORT1 "DISPLAY_PORT1"
|
||||
#define LPASS_BE_INT_BT_SCO_RX "INT_BT_SCO_RX"
|
||||
@@ -508,6 +509,7 @@ enum {
|
||||
MSM_BACKEND_DAI_SEC_META_MI2S_RX,
|
||||
MSM_BACKEND_DAI_PROXY_RX,
|
||||
MSM_BACKEND_DAI_PROXY_TX,
|
||||
MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
MSM_BACKEND_DAI_MAX,
|
||||
};
|
||||
|
||||
@@ -539,7 +541,7 @@ enum {
|
||||
#define RELEASE_LOCK 0
|
||||
#define ACQUIRE_LOCK 1
|
||||
|
||||
#define MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX 2
|
||||
#define MSM_BACKEND_DAI_PP_PARAMS_REQ_MAX 3
|
||||
#define HDMI_RX_ID 0x8001
|
||||
#define ADM_PP_PARAM_MUTE_ID 0
|
||||
#define ADM_PP_PARAM_MUTE_BIT 1
|
||||
|
287
asoc/qcs405.c
287
asoc/qcs405.c
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
||||
/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||
*/
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
@@ -148,6 +148,11 @@ enum {
|
||||
SPDIF_TX_MAX,
|
||||
};
|
||||
|
||||
enum {
|
||||
HDMI_RX_IDX = 0,
|
||||
EXT_HDMI_RX_IDX_MAX,
|
||||
};
|
||||
|
||||
struct mi2s_conf {
|
||||
struct mutex lock;
|
||||
u32 ref_cnt;
|
||||
@@ -344,7 +349,9 @@ static struct dev_config tdm_tx_cfg[TDM_INTERFACE_MAX][TDM_PORT_MAX] = {
|
||||
{SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 1}, /* TX_7 */
|
||||
}
|
||||
};
|
||||
|
||||
static struct dev_config ext_hdmi_rx_cfg[] = {
|
||||
[HDMI_RX_IDX] = {SAMPLING_RATE_48KHZ, SNDRV_PCM_FORMAT_S16_LE, 2},
|
||||
};
|
||||
|
||||
/* Default configuration of slimbus channels */
|
||||
static struct dev_config slim_rx_cfg[] = {
|
||||
@@ -488,6 +495,12 @@ static char const *usb_sample_rate_text[] = {"KHZ_8", "KHZ_11P025",
|
||||
"KHZ_32", "KHZ_44P1", "KHZ_48",
|
||||
"KHZ_88P2", "KHZ_96", "KHZ_176P4",
|
||||
"KHZ_192", "KHZ_352P8", "KHZ_384"};
|
||||
static char const *ext_hdmi_sample_rate_text[] = {"KHZ_48", "KHZ_96",
|
||||
"KHZ_192", "KHZ_32", "KHZ_44P1",
|
||||
"KHZ_88P2", "KHZ_176P4"};
|
||||
static char const *ext_hdmi_bit_format_text[] = {"S16_LE", "S24_LE",
|
||||
"S24_3LE"};
|
||||
|
||||
static char const *tdm_ch_text[] = {"One", "Two", "Three", "Four",
|
||||
"Five", "Six", "Seven", "Eight"};
|
||||
static char const *tdm_bit_format_text[] = {"S16_LE", "S24_LE", "S32_LE"};
|
||||
@@ -539,6 +552,7 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_chs, slim_rx_ch_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_chs, usb_ch_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_chs, usb_ch_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(vi_feed_tx_chs, vi_feed_ch_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(ext_hdmi_rx_chs, ch_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(proxy_rx_chs, ch_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_format, bit_format_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_format, bit_format_text);
|
||||
@@ -546,6 +560,7 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_format, bit_format_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_format, bit_format_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_format, bit_format_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_format, bit_format_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(ext_hdmi_rx_format, ext_hdmi_bit_format_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_0_rx_sample_rate, slim_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_2_rx_sample_rate, slim_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_0_tx_sample_rate, slim_sample_rate_text);
|
||||
@@ -553,6 +568,8 @@ static SOC_ENUM_SINGLE_EXT_DECL(slim_5_rx_sample_rate, slim_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(slim_6_rx_sample_rate, slim_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate, bt_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(bt_sample_rate_sink, bt_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(ext_hdmi_rx_sample_rate,
|
||||
ext_hdmi_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(usb_rx_sample_rate, usb_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(usb_tx_sample_rate, usb_sample_rate_text);
|
||||
static SOC_ENUM_SINGLE_EXT_DECL(tdm_tx_chs, tdm_ch_text);
|
||||
@@ -2110,6 +2127,191 @@ static int usb_audio_tx_format_put(struct snd_kcontrol *kcontrol,
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ext_hdmi_get_port_idx(struct snd_kcontrol *kcontrol)
|
||||
{
|
||||
int idx;
|
||||
|
||||
if (strnstr(kcontrol->id.name, "HDMI_RX",
|
||||
sizeof("HDMI_RX"))) {
|
||||
idx = HDMI_RX_IDX;
|
||||
} else {
|
||||
pr_err("%s: unsupported BE: %s",
|
||||
__func__, kcontrol->id.name);
|
||||
idx = -EINVAL;
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static int ext_hdmi_rx_format_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int idx = ext_hdmi_get_port_idx(kcontrol);
|
||||
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
switch (ext_hdmi_rx_cfg[idx].bit_format) {
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
ucontrol->value.integer.value[0] = 1;
|
||||
break;
|
||||
|
||||
case SNDRV_PCM_FORMAT_S16_LE:
|
||||
default:
|
||||
ucontrol->value.integer.value[0] = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
pr_debug("%s: ext_hdmi_rx[%d].format = %d, ucontrol value = %ld\n",
|
||||
__func__, idx, ext_hdmi_rx_cfg[idx].bit_format,
|
||||
ucontrol->value.integer.value[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ext_hdmi_rx_format_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int idx = ext_hdmi_get_port_idx(kcontrol);
|
||||
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
switch (ucontrol->value.integer.value[0]) {
|
||||
case 1:
|
||||
ext_hdmi_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S24_LE;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
ext_hdmi_rx_cfg[idx].bit_format = SNDRV_PCM_FORMAT_S16_LE;
|
||||
break;
|
||||
}
|
||||
pr_debug("%s: ext_hdmi_rx[%d].format = %d, ucontrol value = %ld\n",
|
||||
__func__, idx, ext_hdmi_rx_cfg[idx].bit_format,
|
||||
ucontrol->value.integer.value[0]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ext_hdmi_rx_ch_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int idx = ext_hdmi_get_port_idx(kcontrol);
|
||||
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
ucontrol->value.integer.value[0] =
|
||||
ext_hdmi_rx_cfg[idx].channels - 2;
|
||||
|
||||
pr_debug("%s: ext_hdmi_rx[%d].ch = %d\n", __func__,
|
||||
idx, ext_hdmi_rx_cfg[idx].channels);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ext_hdmi_rx_ch_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int idx = ext_hdmi_get_port_idx(kcontrol);
|
||||
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
ext_hdmi_rx_cfg[idx].channels =
|
||||
ucontrol->value.integer.value[0] + 2;
|
||||
|
||||
pr_debug("%s: ext_hdmi_rx[%d].ch = %d\n", __func__,
|
||||
idx, ext_hdmi_rx_cfg[idx].channels);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ext_hdmi_rx_sample_rate_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int sample_rate_val;
|
||||
int idx = ext_hdmi_get_port_idx(kcontrol);
|
||||
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
switch (ext_hdmi_rx_cfg[idx].sample_rate) {
|
||||
case SAMPLING_RATE_176P4KHZ:
|
||||
sample_rate_val = 6;
|
||||
break;
|
||||
|
||||
case SAMPLING_RATE_88P2KHZ:
|
||||
sample_rate_val = 5;
|
||||
break;
|
||||
|
||||
case SAMPLING_RATE_44P1KHZ:
|
||||
sample_rate_val = 4;
|
||||
break;
|
||||
|
||||
case SAMPLING_RATE_32KHZ:
|
||||
sample_rate_val = 3;
|
||||
break;
|
||||
|
||||
case SAMPLING_RATE_192KHZ:
|
||||
sample_rate_val = 2;
|
||||
break;
|
||||
|
||||
case SAMPLING_RATE_96KHZ:
|
||||
sample_rate_val = 1;
|
||||
break;
|
||||
|
||||
case SAMPLING_RATE_48KHZ:
|
||||
default:
|
||||
sample_rate_val = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
ucontrol->value.integer.value[0] = sample_rate_val;
|
||||
pr_debug("%s: ext_hdmi_rx[%d].sample_rate = %d\n", __func__,
|
||||
idx, ext_hdmi_rx_cfg[idx].sample_rate);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int ext_hdmi_rx_sample_rate_put(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
int idx = ext_hdmi_get_port_idx(kcontrol);
|
||||
|
||||
if (idx < 0)
|
||||
return idx;
|
||||
|
||||
switch (ucontrol->value.integer.value[0]) {
|
||||
case 6:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_176P4KHZ;
|
||||
break;
|
||||
case 5:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_88P2KHZ;
|
||||
break;
|
||||
case 4:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_44P1KHZ;
|
||||
break;
|
||||
case 3:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_32KHZ;
|
||||
break;
|
||||
case 2:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_192KHZ;
|
||||
break;
|
||||
case 1:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_96KHZ;
|
||||
break;
|
||||
case 0:
|
||||
default:
|
||||
ext_hdmi_rx_cfg[idx].sample_rate = SAMPLING_RATE_48KHZ;
|
||||
break;
|
||||
}
|
||||
|
||||
pr_debug("%s: control value = %ld, ext_hdmi_rx[%d].sample_rate = %d\n",
|
||||
__func__, ucontrol->value.integer.value[0], idx,
|
||||
ext_hdmi_rx_cfg[idx].sample_rate);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int proxy_rx_ch_get(struct snd_kcontrol *kcontrol,
|
||||
struct snd_ctl_elem_value *ucontrol)
|
||||
{
|
||||
@@ -3842,6 +4044,14 @@ static const struct snd_kcontrol_new msm_snd_sb_controls[] = {
|
||||
slim_rx_bit_format_get, slim_rx_bit_format_put),
|
||||
SOC_ENUM_EXT("SLIM_0_TX Format", slim_0_tx_format,
|
||||
slim_tx_bit_format_get, slim_tx_bit_format_put),
|
||||
SOC_ENUM_EXT("HDMI_RX Bit Format", ext_hdmi_rx_format,
|
||||
ext_hdmi_rx_format_get, ext_hdmi_rx_format_put),
|
||||
SOC_ENUM_EXT("HDMI_RX SampleRate", ext_hdmi_rx_sample_rate,
|
||||
ext_hdmi_rx_sample_rate_get,
|
||||
ext_hdmi_rx_sample_rate_put),
|
||||
SOC_ENUM_EXT("HDMI_RX Channels", ext_hdmi_rx_chs,
|
||||
ext_hdmi_rx_ch_get,
|
||||
ext_hdmi_rx_ch_put),
|
||||
SOC_ENUM_EXT("SLIM_0_RX SampleRate", slim_0_rx_sample_rate,
|
||||
slim_rx_sample_rate_get, slim_rx_sample_rate_put),
|
||||
SOC_ENUM_EXT("SLIM_2_RX SampleRate", slim_2_rx_sample_rate,
|
||||
@@ -4506,6 +4716,23 @@ static int msm_slim_get_ch_from_beid(int32_t be_id)
|
||||
return ch_id;
|
||||
}
|
||||
|
||||
static int msm_ext_hdmi_get_idx_from_beid(int32_t be_id)
|
||||
{
|
||||
int idx;
|
||||
|
||||
switch (be_id) {
|
||||
case MSM_BACKEND_DAI_HDMI_RX_MS:
|
||||
idx = HDMI_RX_IDX;
|
||||
break;
|
||||
default:
|
||||
pr_err("%s: Incorrect ext_hdmi BE id %d\n", __func__, be_id);
|
||||
idx = -EINVAL;
|
||||
break;
|
||||
}
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
static int msm_cdc_dma_get_idx_from_beid(int32_t be_id)
|
||||
{
|
||||
int idx = 0;
|
||||
@@ -5040,11 +5267,27 @@ static int msm_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
channels->min = channels->max = afe_lb_tx_cfg.channels;
|
||||
break;
|
||||
|
||||
case MSM_BACKEND_DAI_HDMI_RX_MS:
|
||||
idx = msm_ext_hdmi_get_idx_from_beid(dai_link->id);
|
||||
|
||||
if (idx < 0) {
|
||||
pr_err("%s: Incorrect ext hdmi idx %d\n",
|
||||
__func__, idx);
|
||||
rc = idx;
|
||||
goto done;
|
||||
}
|
||||
|
||||
param_set_mask(params, SNDRV_PCM_HW_PARAM_FORMAT,
|
||||
ext_hdmi_rx_cfg[idx].bit_format);
|
||||
rate->min = rate->max = ext_hdmi_rx_cfg[idx].sample_rate;
|
||||
channels->min = channels->max = ext_hdmi_rx_cfg[idx].channels;
|
||||
break;
|
||||
|
||||
default:
|
||||
rate->min = rate->max = SAMPLING_RATE_48KHZ;
|
||||
break;
|
||||
}
|
||||
|
||||
done:
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -6104,7 +6347,6 @@ static struct snd_soc_ops msm_fe_qos_ops = {
|
||||
.prepare = msm_fe_qos_prepare,
|
||||
};
|
||||
|
||||
|
||||
static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream)
|
||||
{
|
||||
int ret = 0;
|
||||
@@ -7337,6 +7579,24 @@ static struct snd_soc_dai_link msm_common_misc_fe_dai_links[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link ext_hdmi_be_dai_link[] = {
|
||||
/* HDMI RX BACK END DAI Link */
|
||||
{
|
||||
.name = LPASS_BE_HDMI_MS,
|
||||
.stream_name = "HDMI MS Playback",
|
||||
.cpu_dai_name = "msm-dai-q6-hdmi.24578",
|
||||
.platform_name = "msm-pcm-routing",
|
||||
.codec_name = "msm-ext-disp-audio-codec-rx",
|
||||
.codec_dai_name = "msm_hdmi_ms_audio_codec_rx_dai",
|
||||
.no_pcm = 1,
|
||||
.dpcm_playback = 1,
|
||||
.id = MSM_BACKEND_DAI_HDMI_RX_MS,
|
||||
.be_hw_params_fixup = msm_be_hw_params_fixup,
|
||||
.ignore_pmdown_time = 1,
|
||||
.ignore_suspend = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link msm_common_be_dai_links[] = {
|
||||
/* Backend AFE DAI Links */
|
||||
{
|
||||
@@ -8344,7 +8604,8 @@ static struct snd_soc_dai_link msm_qcs405_dai_links[
|
||||
ARRAY_SIZE(msm_wsa_cdc_dma_be_dai_links) +
|
||||
ARRAY_SIZE(msm_bolero_fe_dai_links) +
|
||||
ARRAY_SIZE(msm_spdif_be_dai_links) +
|
||||
ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link)];
|
||||
ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link) +
|
||||
ARRAY_SIZE(ext_hdmi_be_dai_link)];
|
||||
|
||||
static int msm_snd_card_tasha_late_probe(struct snd_soc_card *card)
|
||||
{
|
||||
@@ -8595,6 +8856,7 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
|
||||
uint32_t va_bolero_codec = 0, wsa_bolero_codec = 0, mi2s_audio_intf = 0;
|
||||
uint32_t spdif_audio_intf = 0, wcn_audio_intf = 0;
|
||||
uint32_t afe_loopback_intf = 0, meta_mi2s_intf = 0;
|
||||
uint32_t ext_disp_hdmi_rx = 0;
|
||||
const struct of_device_id *match;
|
||||
char __iomem *spdif_cfg, *spdif_pin_ctl;
|
||||
int rc = 0;
|
||||
@@ -8782,6 +9044,20 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
|
||||
ARRAY_SIZE(msm_afe_rxtx_lb_be_dai_link);
|
||||
}
|
||||
}
|
||||
rc = of_property_read_u32(dev->of_node,
|
||||
"qcom,ext-disp-audio-rx", &ext_disp_hdmi_rx);
|
||||
if (rc) {
|
||||
dev_dbg(dev, "%s: No DT match ext disp hdmi rx\n",
|
||||
__func__);
|
||||
} else {
|
||||
if (ext_disp_hdmi_rx) {
|
||||
memcpy(msm_qcs405_dai_links + total_links,
|
||||
ext_hdmi_be_dai_link,
|
||||
sizeof(ext_hdmi_be_dai_link));
|
||||
total_links += ARRAY_SIZE(ext_hdmi_be_dai_link);
|
||||
}
|
||||
}
|
||||
|
||||
dailink = msm_qcs405_dai_links;
|
||||
} else if (!strcmp(match->data, "stub_codec")) {
|
||||
card = &snd_soc_card_stub_msm;
|
||||
@@ -8795,7 +9071,6 @@ static struct snd_soc_card *populate_snd_card_dailinks(struct device *dev)
|
||||
msm_stub_be_dai_links,
|
||||
sizeof(msm_stub_be_dai_links));
|
||||
total_links += ARRAY_SIZE(msm_stub_be_dai_links);
|
||||
|
||||
dailink = msm_stub_dai_links;
|
||||
}
|
||||
|
||||
|
@@ -1083,6 +1083,7 @@ int afe_sizeof_cfg_cmd(u16 port_id)
|
||||
ret_size = SIZEOF_CFG_CMD(afe_param_id_meta_i2s_cfg);
|
||||
break;
|
||||
case HDMI_RX:
|
||||
case HDMI_RX_MS:
|
||||
case DISPLAY_PORT_RX:
|
||||
ret_size =
|
||||
SIZEOF_CFG_CMD(afe_param_id_hdmi_multi_chan_audio_cfg);
|
||||
@@ -5278,6 +5279,7 @@ static int __afe_port_start(u16 port_id, union afe_port_config *afe_config,
|
||||
cfg_type = AFE_PARAM_ID_META_I2S_CONFIG;
|
||||
break;
|
||||
case HDMI_RX:
|
||||
case HDMI_RX_MS:
|
||||
case DISPLAY_PORT_RX:
|
||||
cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
|
||||
break;
|
||||
@@ -5570,6 +5572,7 @@ int afe_get_port_index(u16 port_id)
|
||||
case MI2S_RX: return IDX_MI2S_RX;
|
||||
case MI2S_TX: return IDX_MI2S_TX;
|
||||
case HDMI_RX: return IDX_HDMI_RX;
|
||||
case HDMI_RX_MS: return IDX_HDMI_RX_MS;
|
||||
case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX;
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX;
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX;
|
||||
@@ -6033,6 +6036,7 @@ int afe_open(u16 port_id,
|
||||
cfg_type = AFE_PARAM_ID_META_I2S_CONFIG;
|
||||
break;
|
||||
case HDMI_RX:
|
||||
case HDMI_RX_MS:
|
||||
case DISPLAY_PORT_RX:
|
||||
cfg_type = AFE_PARAM_ID_HDMI_CONFIG;
|
||||
break;
|
||||
@@ -7929,6 +7933,7 @@ int afe_validate_port(u16 port_id)
|
||||
case MI2S_RX:
|
||||
case MI2S_TX:
|
||||
case HDMI_RX:
|
||||
case HDMI_RX_MS:
|
||||
case DISPLAY_PORT_RX:
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_RX:
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_TX:
|
||||
|
@@ -46,6 +46,7 @@ int q6audio_get_port_index(u16 port_id)
|
||||
case MI2S_RX: return IDX_MI2S_RX;
|
||||
case MI2S_TX: return IDX_MI2S_TX;
|
||||
case HDMI_RX: return IDX_HDMI_RX;
|
||||
case HDMI_RX_MS: return IDX_HDMI_RX_MS;
|
||||
case DISPLAY_PORT_RX: return IDX_DISPLAY_PORT_RX;
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_RX: return IDX_PRIMARY_SPDIF_RX;
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_TX: return IDX_PRIMARY_SPDIF_TX;
|
||||
@@ -427,6 +428,8 @@ int q6audio_get_port_id(u16 port_id)
|
||||
case MI2S_RX: return AFE_PORT_ID_PRIMARY_MI2S_RX;
|
||||
case MI2S_TX: return AFE_PORT_ID_PRIMARY_MI2S_TX;
|
||||
case HDMI_RX: return AFE_PORT_ID_MULTICHAN_HDMI_RX;
|
||||
case HDMI_RX_MS:
|
||||
return AFE_PORT_ID_HDMI_MS;
|
||||
case DISPLAY_PORT_RX:
|
||||
return AFE_PORT_ID_HDMI_OVER_DP_RX;
|
||||
case AFE_PORT_ID_PRIMARY_SPDIF_RX:
|
||||
@@ -1017,6 +1020,7 @@ int q6audio_validate_port(u16 port_id)
|
||||
case MI2S_RX:
|
||||
case MI2S_TX:
|
||||
case HDMI_RX:
|
||||
case HDMI_RX_MS:
|
||||
case DISPLAY_PORT_RX:
|
||||
case RSVD_2:
|
||||
case RSVD_3:
|
||||
|
@@ -1356,6 +1356,7 @@ struct adm_cmd_connect_afe_port_v5 {
|
||||
#define RT_PROXY_PORT_001_RX 0x2000
|
||||
#define RT_PROXY_PORT_001_TX 0x2001
|
||||
#define AFE_LOOPBACK_TX 0x6001
|
||||
#define HDMI_RX_MS 0x6002
|
||||
#define DISPLAY_PORT_RX 0x6020
|
||||
|
||||
#define AFE_LANE_MASK_INVALID 0
|
||||
@@ -1562,6 +1563,8 @@ struct adm_cmd_connect_afe_port_v5 {
|
||||
#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_RX 0x4012
|
||||
/* SLIMbus Tx port on channel 9. */
|
||||
#define AFE_PORT_ID_SLIMBUS_MULTI_CHAN_9_TX 0x4013
|
||||
/*AFE Rx port for audio over hdmi*/
|
||||
#define AFE_PORT_ID_HDMI_MS 0x6002
|
||||
/* AFE Rx port for audio over Display port */
|
||||
#define AFE_PORT_ID_HDMI_OVER_DP_RX 0x6020
|
||||
/*USB AFE port */
|
||||
|
@@ -289,6 +289,8 @@ enum {
|
||||
/* IDX 210-> 211 */
|
||||
IDX_RT_PROXY_PORT_002_RX,
|
||||
IDX_RT_PROXY_PORT_002_TX,
|
||||
/* IDX 212 */
|
||||
IDX_HDMI_RX_MS,
|
||||
AFE_MAX_PORTS
|
||||
};
|
||||
|
||||
|
Reference in New Issue
Block a user