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

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

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

parents 76942383 f4ce234f
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;
}