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

Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
Takashi Iwai 2011-02-11 12:17:30 +01:00
parent 965b76d23e
commit 2b203dbbcb
1 changed files with 13 additions and 9 deletions

View File

@ -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,
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,
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,
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,
* 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,
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);
} }
} }