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

Commit 978be6d7 authored by Wu Fengguang's avatar Wu Fengguang Committed by Takashi Iwai
Browse files

ALSA: intelhdmi - separate out infoframe checksum routine



And make it right when called for more than one times.

Signed-off-by: default avatarWu Fengguang <fengguang.wu@intel.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 3f54aa50
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -508,24 +508,35 @@ static void hdmi_clear_dip_buffers(struct hda_codec *codec, hda_nid_t pin_nid)
#endif
}

static void hdmi_checksum_audio_infoframe(struct hdmi_audio_infoframe *ai)
{
	u8 *bytes = (u8 *)ai;
	u8 sum = 0;
	int i;

	ai->checksum = 0;

	for (i = 0; i < sizeof(*ai); i++)
		sum += bytes[i];

	ai->checksum = - sum;
}

static void hdmi_fill_audio_infoframe(struct hda_codec *codec,
				      hda_nid_t pin_nid,
				      struct hdmi_audio_infoframe *ai)
{
	u8 *params = (u8 *)ai;
	u8 sum = 0;
	u8 *bytes = (u8 *)ai;
	int i;

	hdmi_debug_dip_size(codec, pin_nid);
	hdmi_clear_dip_buffers(codec, pin_nid); /* be paranoid */

	for (i = 0; i < sizeof(*ai); i++)
		sum += params[i];
	ai->checksum = - sum;
	hdmi_checksum_audio_infoframe(ai);

	hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0);
	for (i = 0; i < sizeof(*ai); i++)
		hdmi_write_dip_byte(codec, pin_nid, params[i]);
		hdmi_write_dip_byte(codec, pin_nid, bytes[i]);
}

/*