Commit 2b203dbb authored by Takashi Iwai's avatar Takashi Iwai

ALSA: hda - Avoid cast with union data for HDMI audio infoframe

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 965b76d2
...@@ -110,6 +110,12 @@ struct dp_audio_infoframe { ...@@ -110,6 +110,12 @@ struct dp_audio_infoframe {
u8 LFEPBL01_LSV36_DM_INH7; u8 LFEPBL01_LSV36_DM_INH7;
}; };
union audio_infoframe {
struct hdmi_audio_infoframe hdmi;
struct dp_audio_infoframe dp;
u8 bytes[0];
};
/* /*
* CEA speaker placement: * CEA speaker placement:
* *
...@@ -620,8 +626,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -620,8 +626,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
int channels = substream->runtime->channels; int channels = substream->runtime->channels;
int ca; int ca;
int i; int i;
u8 ai[max(sizeof(struct hdmi_audio_infoframe), union audio_infoframe ai;
sizeof(struct dp_audio_infoframe))];
ca = hdmi_channel_allocation(codec, nid, channels); ca = hdmi_channel_allocation(codec, nid, channels);
...@@ -633,11 +638,10 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -633,11 +638,10 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
pin_nid = spec->pin[i]; pin_nid = spec->pin[i];
memset(ai, 0, sizeof(ai)); memset(&ai, 0, sizeof(ai));
if (spec->sink_eld[i].conn_type == 0) { /* HDMI */ if (spec->sink_eld[i].conn_type == 0) { /* HDMI */
struct hdmi_audio_infoframe *hdmi_ai; struct hdmi_audio_infoframe *hdmi_ai = &ai.hdmi;
hdmi_ai = (struct hdmi_audio_infoframe *)ai;
hdmi_ai->type = 0x84; hdmi_ai->type = 0x84;
hdmi_ai->ver = 0x01; hdmi_ai->ver = 0x01;
hdmi_ai->len = 0x0a; hdmi_ai->len = 0x0a;
...@@ -645,9 +649,8 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -645,9 +649,8 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
hdmi_ai->CA = ca; hdmi_ai->CA = ca;
hdmi_checksum_audio_infoframe(hdmi_ai); hdmi_checksum_audio_infoframe(hdmi_ai);
} else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */ } else if (spec->sink_eld[i].conn_type == 1) { /* DisplayPort */
struct dp_audio_infoframe *dp_ai; struct dp_audio_infoframe *dp_ai = &ai.dp;
dp_ai = (struct dp_audio_infoframe *)ai;
dp_ai->type = 0x84; dp_ai->type = 0x84;
dp_ai->len = 0x1b; dp_ai->len = 0x1b;
dp_ai->ver = 0x11 << 2; dp_ai->ver = 0x11 << 2;
...@@ -664,7 +667,8 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -664,7 +667,8 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
* sizeof(*dp_ai) to avoid partial match/update problems when * sizeof(*dp_ai) to avoid partial match/update problems when
* the user switches between HDMI/DP monitors. * the user switches between HDMI/DP monitors.
*/ */
if (!hdmi_infoframe_uptodate(codec, pin_nid, ai, sizeof(ai))) { if (!hdmi_infoframe_uptodate(codec, pin_nid, ai.bytes,
sizeof(ai))) {
snd_printdd("hdmi_setup_audio_infoframe: " snd_printdd("hdmi_setup_audio_infoframe: "
"cvt=%d pin=%d channels=%d\n", "cvt=%d pin=%d channels=%d\n",
nid, pin_nid, nid, pin_nid,
...@@ -672,7 +676,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid, ...@@ -672,7 +676,7 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
hdmi_setup_channel_mapping(codec, pin_nid, ca); hdmi_setup_channel_mapping(codec, pin_nid, ca);
hdmi_stop_infoframe_trans(codec, pin_nid); hdmi_stop_infoframe_trans(codec, pin_nid);
hdmi_fill_audio_infoframe(codec, pin_nid, hdmi_fill_audio_infoframe(codec, pin_nid,
ai, sizeof(ai)); ai.bytes, sizeof(ai));
hdmi_start_infoframe_trans(codec, pin_nid); hdmi_start_infoframe_trans(codec, pin_nid);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment