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

Commit f4ce234f authored by Venkata Narendra Kumar Gutta's avatar Venkata Narendra Kumar Gutta Committed by Gerrit - the friendly Code Review server
Browse files

ASoC: codecs: Add support to read HDMI EDID audio block data



HDMI EDID audio block data is needed to know the sink capabilities.
Add support to read the same for adv chip.

CRs-Fixed: 968610
Change-Id: I6ba6acaeaa6f7d095fa312a5627bbf774f0440a6
Signed-off-by: default avatarVenkata Narendra Kumar Gutta <vgutta@codeaurora.org>
parent d3068532
Loading
Loading
Loading
Loading
+23 −8
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <sound/pcm_params.h>
#include <sound/soc.h>
#include <video/msm_dba.h>
#include <linux/msm_hdmi.h>

#define CHANNEL_STATUS_SIZE 24
#define MSM_DBA_AUDIO_N_SIZE 6144
@@ -214,6 +215,7 @@ static int msm_hdmi_dba_edid_ctl_info(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_info *uinfo)
{
	struct msm_hdmi_dba_codec_rx_data *codec_data;
	struct msm_hdmi_audio_edid_blk edid_blk;

	if (!kcontrol || !uinfo) {
		pr_err_ratelimited("%s: invalid control\n", __func__);
@@ -224,11 +226,15 @@ static int msm_hdmi_dba_edid_ctl_info(struct snd_kcontrol *kcontrol,
		pr_err_ratelimited("%s: codec_data is NULL\n", __func__);
		return -EINVAL;
	}

	uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
	if (codec_data->dba_ops.get_edid_size)
		codec_data->dba_ops.get_edid_size(codec_data->dba_data,
			&uinfo->count, 0);
	codec_data->edid_size = uinfo->count;
	if (codec_data->dba_ops.get_audio_block) {
		codec_data->dba_ops.get_audio_block(codec_data->dba_data,
			sizeof(edid_blk), &edid_blk);
		uinfo->count = edid_blk.audio_data_blk_size +
				edid_blk.spk_alloc_data_blk_size;
	} else
		uinfo->count = 0;

	return 0;
}
@@ -246,6 +252,7 @@ static int msm_hdmi_dba_edid_get(struct snd_kcontrol *kcontrol,
				struct snd_ctl_elem_value *ucontrol)
{
	struct msm_hdmi_dba_codec_rx_data *codec_data;
	struct msm_hdmi_audio_edid_blk edid_blk;

	if (!kcontrol || !ucontrol) {
		pr_err_ratelimited("%s: invalid control\n", __func__);
@@ -260,10 +267,18 @@ static int msm_hdmi_dba_edid_get(struct snd_kcontrol *kcontrol,
		pr_err_ratelimited("%s: hdmi is not connected yet\n", __func__);
		return -EINVAL;
	}
	if (codec_data->dba_ops.get_raw_edid)
		codec_data->dba_ops.get_raw_edid(codec_data->dba_data,
			codec_data->edid_size,
			ucontrol->value.bytes.data, 0);

	if (codec_data->dba_ops.get_audio_block) {
		codec_data->dba_ops.get_audio_block(codec_data->dba_data,
					sizeof(edid_blk), &edid_blk);

		memcpy(ucontrol->value.bytes.data, edid_blk.audio_data_blk,
			edid_blk.audio_data_blk_size);
		memcpy((ucontrol->value.bytes.data +
			edid_blk.audio_data_blk_size),
			edid_blk.spk_alloc_data_blk,
			edid_blk.spk_alloc_data_blk_size);
	}

	return 0;
}