From 72080b8d9d20e05a257f69e04e94bbec9cfe5f6c Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Fri, 15 Feb 2013 21:10:23 +0200 Subject: [PATCH] linux: add patch to fix broken audio over optical on alc662+ many thanks to MrXIII for testing --- ...-broken-audio-over-optical-on-alc662.patch | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 packages/linux/patches/3.7.8/linux-990.06-hda-fix-broken-audio-over-optical-on-alc662.patch diff --git a/packages/linux/patches/3.7.8/linux-990.06-hda-fix-broken-audio-over-optical-on-alc662.patch b/packages/linux/patches/3.7.8/linux-990.06-hda-fix-broken-audio-over-optical-on-alc662.patch new file mode 100644 index 0000000000..0c7f1922f0 --- /dev/null +++ b/packages/linux/patches/3.7.8/linux-990.06-hda-fix-broken-audio-over-optical-on-alc662.patch @@ -0,0 +1,93 @@ +From 09c206b7ee18b50d81916697150bd510f198716d Mon Sep 17 00:00:00 2001 +From: Stefan Saraev +Date: Fri, 15 Feb 2013 20:19:48 +0200 +Subject: [PATCH] hda: fix broken audio over optical on alc662+ + + original commit: + + > commit 2626d16bbdedcd64c6af3c519aecd5a6f2356e58 + > Author: Takashi Iwai + > Date: Fri Dec 14 10:22:35 2012 +0100 + > + > ALSA: hda - Always turn on pins for HDMI/DP + > + > commit 6169b673618bf0b2518ce413b54925782a603f06 upstream. + > + > We've seen the broken HDMI *video* output on some machines with GM965, + > and the debugging session pointed that the culprit is the disabled + > audio output pins. Toggling these pins dynamically on demand caused + > flickering of HDMI TV. + > + > This patch changes the behavior to keep the pin ON constantly. + > + > Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=51421 + > + > Signed-off-by: Takashi Iwai + > Signed-off-by: Greg Kroah-Hartman + + for now we revert the above commit, until we have a propper fix +--- + sound/pci/hda/patch_hdmi.c | 18 ++++++++++++++---- + 1 files changed, 14 insertions(+), 4 deletions(-) + +diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c +index 791ef80..2587119 100644 +--- a/sound/pci/hda/patch_hdmi.c ++++ b/sound/pci/hda/patch_hdmi.c +@@ -431,11 +431,9 @@ static void hdmi_init_pin(struct hda_codec *codec, hda_nid_t pin_nid) + if (get_wcaps(codec, pin_nid) & AC_WCAP_OUT_AMP) + snd_hda_codec_write(codec, pin_nid, 0, + AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE); +- /* Enable pin out: some machines with GM965 gets broken output when +- * the pin is disabled or changed while using with HDMI +- */ ++ /* Disable pin out until stream is active*/ + snd_hda_codec_write(codec, pin_nid, 0, +- AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT); ++ AC_VERB_SET_PIN_WIDGET_CONTROL, 0); + } + + static int hdmi_get_channel_count(struct hda_codec *codec, hda_nid_t cvt_nid) +@@ -1343,6 +1341,7 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, + struct hdmi_spec *spec = codec->spec; + int pin_idx = hinfo_to_pin_index(spec, hinfo); + hda_nid_t pin_nid = spec->pins[pin_idx].pin_nid; ++ int pinctl; + bool non_pcm; + + non_pcm = check_non_pcm_per_cvt(codec, cvt_nid); +@@ -1351,6 +1350,11 @@ static int generic_hdmi_playback_pcm_prepare(struct hda_pcm_stream *hinfo, + + hdmi_setup_audio_infoframe(codec, pin_idx, non_pcm, substream); + ++ pinctl = snd_hda_codec_read(codec, pin_nid, 0, ++ AC_VERB_GET_PIN_WIDGET_CONTROL, 0); ++ snd_hda_codec_write(codec, pin_nid, 0, ++ AC_VERB_SET_PIN_WIDGET_CONTROL, pinctl | PIN_OUT); ++ + return hdmi_setup_stream(codec, cvt_nid, pin_nid, stream_tag, format); + } + +@@ -1370,6 +1374,7 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, + int cvt_idx, pin_idx; + struct hdmi_spec_per_cvt *per_cvt; + struct hdmi_spec_per_pin *per_pin; ++ int pinctl; + + if (hinfo->nid) { + cvt_idx = cvt_nid_to_cvt_index(spec, hinfo->nid); +@@ -1386,6 +1391,11 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo, + return -EINVAL; + per_pin = &spec->pins[pin_idx]; + ++ pinctl = snd_hda_codec_read(codec, per_pin->pin_nid, 0, ++ AC_VERB_GET_PIN_WIDGET_CONTROL, 0); ++ snd_hda_codec_write(codec, per_pin->pin_nid, 0, ++ AC_VERB_SET_PIN_WIDGET_CONTROL, ++ pinctl & ~PIN_OUT); + snd_hda_spdif_ctls_unassign(codec, pin_idx); + per_pin->chmap_set = false; + memset(per_pin->chmap, 0, sizeof(per_pin->chmap)); +-- +1.7.2.5 +