Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 170347
b: refs/heads/master
c: 848de59
h: refs/heads/master
i:
  170345: 97fb982
  170343: 90094cf
v: v3
  • Loading branch information
Wu Fengguang authored and Takashi Iwai committed Nov 18, 2009
1 parent f0f05c2 commit 8c4d48b
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 13 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 978be6d711be237e0344eca21c3922ae88a240bc
refs/heads/master: 848de598eef9603d6f2c174f90fded4e63ac5e23
38 changes: 26 additions & 12 deletions trunk/sound/pci/hda/patch_intelhdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,27 @@ static void hdmi_setup_channel_mapping(struct hda_codec *codec, hda_nid_t nid,
hdmi_debug_channel_mapping(codec, nid);
}

static bool hdmi_infoframe_uptodate(struct hda_codec *codec, hda_nid_t pin_nid,
struct hdmi_audio_infoframe *ai)
{
u8 *bytes = (u8 *)ai;
u8 val;
int i;

if (snd_hda_codec_read(codec, pin_nid, 0, AC_VERB_GET_HDMI_DIP_XMIT, 0)
!= AC_DIPXMIT_BEST)
return false;

hdmi_set_dip_index(codec, pin_nid, 0x0, 0x0);
for (i = 0; i < sizeof(*ai); i++) {
val = snd_hda_codec_read(codec, pin_nid, 0,
AC_VERB_GET_HDMI_DIP_DATA, 0);
if (val != bytes[i])
return false;
}

return true;
}

static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
struct snd_pcm_substream *substream)
Expand All @@ -670,8 +691,11 @@ static void hdmi_setup_audio_infoframe(struct hda_codec *codec, hda_nid_t nid,
continue;

pin_nid = spec->pin[i];
hdmi_fill_audio_infoframe(codec, pin_nid, &ai);
hdmi_start_infoframe_trans(codec, pin_nid);
if (!hdmi_infoframe_uptodate(codec, pin_nid, &ai)) {
hdmi_stop_infoframe_trans(codec, pin_nid);
hdmi_fill_audio_infoframe(codec, pin_nid, &ai);
hdmi_start_infoframe_trans(codec, pin_nid);
}
}
}

Expand Down Expand Up @@ -767,16 +791,6 @@ static int intel_hdmi_playback_pcm_cleanup(struct hda_pcm_stream *hinfo,
struct hda_codec *codec,
struct snd_pcm_substream *substream)
{
struct intel_hdmi_spec *spec = codec->spec;
int i;

for (i = 0; i < spec->num_pins; i++) {
if (spec->pin_cvt[i] != hinfo->nid)
continue;

hdmi_stop_infoframe_trans(codec, spec->pin[i]);
}

snd_hda_codec_cleanup_stream(codec, hinfo->nid);
return 0;
}
Expand Down

0 comments on commit 8c4d48b

Please sign in to comment.