mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-28 13:16:41 +00:00
linux: update alsa/hda patches. thanks to Anssi
This commit is contained in:
parent
73beb73afc
commit
cef57bf597
139
packages/linux/patches/3.7.8/linux-990.04-hda-Fix-broken-workaround-for-HDMI-SPDIF-confli.patch
vendored
Normal file
139
packages/linux/patches/3.7.8/linux-990.04-hda-Fix-broken-workaround-for-HDMI-SPDIF-confli.patch
vendored
Normal file
@ -0,0 +1,139 @@
|
|||||||
|
From ea9b43addc4d90ca5b029f47f85ca152320a1e8d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Takashi Iwai <tiwai@suse.de>
|
||||||
|
Date: Tue, 12 Feb 2013 17:02:41 +0100
|
||||||
|
Subject: [PATCH] ALSA: hda - Fix broken workaround for HDMI/SPDIF conflicts
|
||||||
|
|
||||||
|
The commit [dcda58061: ALSA: hda - Add workaround for conflicting
|
||||||
|
IEC958 controls] introduced a workaround for cards that have both
|
||||||
|
SPDIF and HDMI devices for giving device=1 to SPDIF control elements.
|
||||||
|
It turned out, however, that this workaround doesn't work well -
|
||||||
|
|
||||||
|
- The workaround checks only conflicts in a single codec, but SPDIF
|
||||||
|
and HDMI are provided by multiple codecs in many cases, and
|
||||||
|
|
||||||
|
- ALSA mixer abstraction doesn't care about the device number in ctl
|
||||||
|
elements, thus you'll get errors from amixer such as
|
||||||
|
% amixer scontrols -c 0
|
||||||
|
ALSA lib simple_none.c:1551:(simple_add1) helem (MIXER,'IEC958
|
||||||
|
Playback Switch',0,1,0) appears twice or more
|
||||||
|
amixer: Mixer hw:0 load error: Invalid argument
|
||||||
|
|
||||||
|
This patch fixes the previous broken workaround. Instead of changing
|
||||||
|
the device number of SPDIF ctl elements, shift the element indices of
|
||||||
|
such controls up to 16. Also, the conflict check is performed over
|
||||||
|
all codecs found on the bus.
|
||||||
|
|
||||||
|
HDMI devices will be put to dev=0,index=0 as before. Only the
|
||||||
|
conflicting SPDIF device is moved to a different place. The new place
|
||||||
|
of SPDIF device is supposed by the updated alsa-lib HDA-Intel.conf,
|
||||||
|
respectively.
|
||||||
|
|
||||||
|
Reported-by: Stephan Raue <stephan@openelec.tv>
|
||||||
|
Reported-by: Anssi Hannula <anssi.hannula@iki.fi>
|
||||||
|
Cc: <stable@vger.kernel.org> [v3.8]
|
||||||
|
Signed-off-by: Takashi Iwai <tiwai@suse.de>
|
||||||
|
---
|
||||||
|
sound/pci/hda/hda_codec.c | 43 +++++++++++++++++++++----------------------
|
||||||
|
sound/pci/hda/hda_codec.h | 3 ++-
|
||||||
|
2 files changed, 23 insertions(+), 23 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
|
||||||
|
index e80f835..04b5738 100644
|
||||||
|
--- a/sound/pci/hda/hda_codec.c
|
||||||
|
+++ b/sound/pci/hda/hda_codec.c
|
||||||
|
@@ -2332,11 +2332,12 @@ struct snd_kcontrol *snd_hda_find_mixer_ctl(struct hda_codec *codec,
|
||||||
|
EXPORT_SYMBOL_HDA(snd_hda_find_mixer_ctl);
|
||||||
|
|
||||||
|
static int find_empty_mixer_ctl_idx(struct hda_codec *codec, const char *name,
|
||||||
|
- int dev)
|
||||||
|
+ int start_idx)
|
||||||
|
{
|
||||||
|
- int idx;
|
||||||
|
- for (idx = 0; idx < 16; idx++) { /* 16 ctlrs should be large enough */
|
||||||
|
- if (!find_mixer_ctl(codec, name, dev, idx))
|
||||||
|
+ int i, idx;
|
||||||
|
+ /* 16 ctlrs should be large enough */
|
||||||
|
+ for (i = 0, idx = start_idx; i < 16; i++, idx++) {
|
||||||
|
+ if (!find_mixer_ctl(codec, name, 0, idx))
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
return -EBUSY;
|
||||||
|
@@ -3305,30 +3306,29 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
||||||
|
int err;
|
||||||
|
struct snd_kcontrol *kctl;
|
||||||
|
struct snd_kcontrol_new *dig_mix;
|
||||||
|
- int idx, dev = 0;
|
||||||
|
- const int spdif_pcm_dev = 1;
|
||||||
|
+ int idx = 0;
|
||||||
|
+ const int spdif_index = 16;
|
||||||
|
struct hda_spdif_out *spdif;
|
||||||
|
+ struct hda_bus *bus = codec->bus;
|
||||||
|
|
||||||
|
- if (codec->primary_dig_out_type == HDA_PCM_TYPE_HDMI &&
|
||||||
|
+ if (bus->primary_dig_out_type == HDA_PCM_TYPE_HDMI &&
|
||||||
|
type == HDA_PCM_TYPE_SPDIF) {
|
||||||
|
- dev = spdif_pcm_dev;
|
||||||
|
- } else if (codec->primary_dig_out_type == HDA_PCM_TYPE_SPDIF &&
|
||||||
|
+ idx = spdif_index;
|
||||||
|
+ } else if (bus->primary_dig_out_type == HDA_PCM_TYPE_SPDIF &&
|
||||||
|
type == HDA_PCM_TYPE_HDMI) {
|
||||||
|
- for (idx = 0; idx < codec->spdif_out.used; idx++) {
|
||||||
|
- spdif = snd_array_elem(&codec->spdif_out, idx);
|
||||||
|
- for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
||||||
|
- kctl = find_mixer_ctl(codec, dig_mix->name, 0, idx);
|
||||||
|
- if (!kctl)
|
||||||
|
- break;
|
||||||
|
- kctl->id.device = spdif_pcm_dev;
|
||||||
|
- }
|
||||||
|
+ /* suppose a single SPDIF device */
|
||||||
|
+ for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
||||||
|
+ kctl = find_mixer_ctl(codec, dig_mix->name, 0, 0);
|
||||||
|
+ if (!kctl)
|
||||||
|
+ break;
|
||||||
|
+ kctl->id.index = spdif_index;
|
||||||
|
}
|
||||||
|
- codec->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
|
||||||
|
+ bus->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
|
||||||
|
}
|
||||||
|
- if (!codec->primary_dig_out_type)
|
||||||
|
- codec->primary_dig_out_type = type;
|
||||||
|
+ if (!bus->primary_dig_out_type)
|
||||||
|
+ bus->primary_dig_out_type = type;
|
||||||
|
|
||||||
|
- idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", dev);
|
||||||
|
+ idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", idx);
|
||||||
|
if (idx < 0) {
|
||||||
|
printk(KERN_ERR "hda_codec: too many IEC958 outputs\n");
|
||||||
|
return -EBUSY;
|
||||||
|
@@ -3338,7 +3338,6 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
||||||
|
kctl = snd_ctl_new1(dig_mix, codec);
|
||||||
|
if (!kctl)
|
||||||
|
return -ENOMEM;
|
||||||
|
- kctl->id.device = dev;
|
||||||
|
kctl->id.index = idx;
|
||||||
|
kctl->private_value = codec->spdif_out.used - 1;
|
||||||
|
err = snd_hda_ctl_add(codec, associated_nid, kctl);
|
||||||
|
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
|
||||||
|
index e8c9442..23ca172 100644
|
||||||
|
--- a/sound/pci/hda/hda_codec.h
|
||||||
|
+++ b/sound/pci/hda/hda_codec.h
|
||||||
|
@@ -679,6 +679,8 @@ struct hda_bus {
|
||||||
|
unsigned int response_reset:1; /* controller was reset */
|
||||||
|
unsigned int in_reset:1; /* during reset operation */
|
||||||
|
unsigned int power_keep_link_on:1; /* don't power off HDA link */
|
||||||
|
+
|
||||||
|
+ int primary_dig_out_type; /* primary digital out PCM type */
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -846,7 +848,6 @@ struct hda_codec {
|
||||||
|
struct mutex hash_mutex;
|
||||||
|
struct snd_array spdif_out;
|
||||||
|
unsigned int spdif_in_enable; /* SPDIF input enable? */
|
||||||
|
- int primary_dig_out_type; /* primary digital out PCM type */
|
||||||
|
const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */
|
||||||
|
struct snd_array init_pins; /* initial (BIOS) pin configurations */
|
||||||
|
struct snd_array driver_pins; /* pin configs set by codec parser */
|
||||||
|
--
|
||||||
|
1.7.10
|
||||||
|
|
@ -1,94 +0,0 @@
|
|||||||
From 1aec20670bfd1c0680d2ea4b29c4e5d8f1bdb43f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Anssi Hannula <anssi.hannula@iki.fi>
|
|
||||||
Date: Sat, 9 Feb 2013 00:19:09 +0200
|
|
||||||
Subject: [PATCH] ALSA: hda - Fix the workaround for conflicting IEC958
|
|
||||||
controls
|
|
||||||
|
|
||||||
Commit dcda5806165c155d90b9aa466a1602cf4726012b ("ALSA: hda - Add
|
|
||||||
workaround for conflicting IEC958 controls") added a workaround for
|
|
||||||
cards that have both an S/PDIF and an HDMI device, so that S/PDIF IEC958
|
|
||||||
controls will be moved to device=1 on such cards.
|
|
||||||
|
|
||||||
However, the workaround did not take it into account that the S/PDIF and
|
|
||||||
HDMI devices may be on different codecs of the same card. Currently this
|
|
||||||
is always the case, and the workaround therefore fails to work.
|
|
||||||
|
|
||||||
Fix the workaround to handle card-wide IEC958 conflicts.
|
|
||||||
|
|
||||||
Reported-by: Stephan Raue <stephan@openelec.tv>
|
|
||||||
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
|
|
||||||
---
|
|
||||||
sound/pci/hda/hda_codec.c | 27 +++++++++++++++------------
|
|
||||||
sound/pci/hda/hda_codec.h | 4 +++-
|
|
||||||
2 files changed, 18 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/sound/pci/hda/hda_codec.c b/sound/pci/hda/hda_codec.c
|
|
||||||
index 822df97..fe5d6fc 100644
|
|
||||||
--- a/sound/pci/hda/hda_codec.c
|
|
||||||
+++ b/sound/pci/hda/hda_codec.c
|
|
||||||
@@ -3135,25 +3135,28 @@ int snd_hda_create_dig_out_ctls(struct hda_codec *codec,
|
|
||||||
int idx, dev = 0;
|
|
||||||
const int spdif_pcm_dev = 1;
|
|
||||||
struct hda_spdif_out *spdif;
|
|
||||||
+ struct hda_codec *c;
|
|
||||||
|
|
||||||
- if (codec->primary_dig_out_type == HDA_PCM_TYPE_HDMI &&
|
|
||||||
+ if (codec->bus->primary_dig_out_type == HDA_PCM_TYPE_HDMI &&
|
|
||||||
type == HDA_PCM_TYPE_SPDIF) {
|
|
||||||
dev = spdif_pcm_dev;
|
|
||||||
- } else if (codec->primary_dig_out_type == HDA_PCM_TYPE_SPDIF &&
|
|
||||||
+ } else if (codec->bus->primary_dig_out_type == HDA_PCM_TYPE_SPDIF &&
|
|
||||||
type == HDA_PCM_TYPE_HDMI) {
|
|
||||||
- for (idx = 0; idx < codec->spdif_out.used; idx++) {
|
|
||||||
- spdif = snd_array_elem(&codec->spdif_out, idx);
|
|
||||||
- for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
|
||||||
- kctl = find_mixer_ctl(codec, dig_mix->name, 0, idx);
|
|
||||||
- if (!kctl)
|
|
||||||
- break;
|
|
||||||
- kctl->id.device = spdif_pcm_dev;
|
|
||||||
+ list_for_each_entry(c, &codec->bus->codec_list, list) {
|
|
||||||
+ for (idx = 0; idx < c->spdif_out.used; idx++) {
|
|
||||||
+ spdif = snd_array_elem(&c->spdif_out, idx);
|
|
||||||
+ for (dig_mix = dig_mixes; dig_mix->name; dig_mix++) {
|
|
||||||
+ kctl = find_mixer_ctl(c, dig_mix->name, 0, idx);
|
|
||||||
+ if (!kctl)
|
|
||||||
+ break;
|
|
||||||
+ kctl->id.device = spdif_pcm_dev;
|
|
||||||
+ }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- codec->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
|
|
||||||
+ codec->bus->primary_dig_out_type = HDA_PCM_TYPE_HDMI;
|
|
||||||
}
|
|
||||||
- if (!codec->primary_dig_out_type)
|
|
||||||
- codec->primary_dig_out_type = type;
|
|
||||||
+ if (!codec->bus->primary_dig_out_type)
|
|
||||||
+ codec->bus->primary_dig_out_type = type;
|
|
||||||
|
|
||||||
idx = find_empty_mixer_ctl_idx(codec, "IEC958 Playback Switch", dev);
|
|
||||||
if (idx < 0) {
|
|
||||||
diff --git a/sound/pci/hda/hda_codec.h b/sound/pci/hda/hda_codec.h
|
|
||||||
index 8665540..ab807f7 100644
|
|
||||||
--- a/sound/pci/hda/hda_codec.h
|
|
||||||
+++ b/sound/pci/hda/hda_codec.h
|
|
||||||
@@ -671,6 +671,9 @@ struct hda_bus {
|
|
||||||
unsigned int response_reset:1; /* controller was reset */
|
|
||||||
unsigned int in_reset:1; /* during reset operation */
|
|
||||||
unsigned int power_keep_link_on:1; /* don't power off HDA link */
|
|
||||||
+
|
|
||||||
+ /* primary digital out PCM type */
|
|
||||||
+ int primary_dig_out_type;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
@@ -837,7 +840,6 @@ struct hda_codec {
|
|
||||||
struct mutex hash_mutex;
|
|
||||||
struct snd_array spdif_out;
|
|
||||||
unsigned int spdif_in_enable; /* SPDIF input enable? */
|
|
||||||
- int primary_dig_out_type; /* primary digital out PCM type */
|
|
||||||
const hda_nid_t *slave_dig_outs; /* optional digital out slave widgets */
|
|
||||||
struct snd_array init_pins; /* initial (BIOS) pin configurations */
|
|
||||||
struct snd_array driver_pins; /* pin configs set by codec parser */
|
|
||||||
--
|
|
||||||
1.7.10
|
|
||||||
|
|
76
packages/linux/patches/3.7.8/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch
vendored
Normal file
76
packages/linux/patches/3.7.8/linux-990.06-hda-Avoid-outputting-HDMI-audio-before-prepare-.patch
vendored
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
From a6024295fd3290a8c9c5519a03316081ee82378a Mon Sep 17 00:00:00 2001
|
||||||
|
From: Anssi Hannula <anssi.hannula@iki.fi>
|
||||||
|
Date: Sat, 16 Feb 2013 17:42:46 +0200
|
||||||
|
Subject: [PATCH] ALSA: hda - Avoid outputting HDMI audio before prepare() and
|
||||||
|
after close()
|
||||||
|
|
||||||
|
Some HDMI codecs (at least NVIDIA 0x10de000b:0x10de0101:0x100100) start
|
||||||
|
transmitting an empty audio stream as soon as PIN_OUT and AC_DIG1_ENABLE
|
||||||
|
are enabled.
|
||||||
|
|
||||||
|
Since commit 6169b673618bf0b2518ce413b54925782a603f06 ("ALSA: hda -
|
||||||
|
Always turn on pins for HDMI/DP") this happens at first open() time, and
|
||||||
|
will continue even after close().
|
||||||
|
|
||||||
|
Additionally, some codecs (at least Intel PantherPoint HDMI) currently
|
||||||
|
continue transmitting HDMI audio even after close() in case some actual
|
||||||
|
audio was output after open() (this happens regardless of PIN_OUT).
|
||||||
|
|
||||||
|
Empty HDMI audio transmission when not intended has the effect that a
|
||||||
|
possible HDMI audio sink/receiver may prefer the empty HDMI audio stream
|
||||||
|
over an actual audio stream on its S/PDIF inputs.
|
||||||
|
|
||||||
|
To avoid the issue before first prepare(), set stream format to 0 on
|
||||||
|
codec initialization. 0 is not a valid format value for HDMI and will
|
||||||
|
prevent the audio stream from being output.
|
||||||
|
|
||||||
|
Additionally, at close() time, make sure that the stream is cleaned up.
|
||||||
|
This will ensure that the format is reset to 0 at that time, preventing
|
||||||
|
audio from being output in that case.
|
||||||
|
|
||||||
|
Thanks to OpenELEC developers and users for their help in investigating
|
||||||
|
this issue on the affected NVIDIA "ION2" hardware. Testing of the final
|
||||||
|
version on NVIDIA ION2 was done by OpenELEC user "MrXIII". Testing on
|
||||||
|
Intel PantherPoint was done by myself.
|
||||||
|
|
||||||
|
Signed-off-by: Anssi Hannula <anssi.hannula@iki.fi>
|
||||||
|
Cc: stable@vger.kernel.org
|
||||||
|
---
|
||||||
|
sound/pci/hda/patch_hdmi.c | 14 ++++++++++++++
|
||||||
|
1 file changed, 14 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
|
||||||
|
index 807a2aa..bcb83c7 100644
|
||||||
|
--- a/sound/pci/hda/patch_hdmi.c
|
||||||
|
+++ b/sound/pci/hda/patch_hdmi.c
|
||||||
|
@@ -1253,6 +1253,14 @@ static int hdmi_add_cvt(struct hda_codec *codec, hda_nid_t cvt_nid)
|
||||||
|
if (err < 0)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
+ /*
|
||||||
|
+ * Some HDMI codecs (at least NVIDIA 0x10de000b:0x10de0101:0x100100)
|
||||||
|
+ * start transmitting an empty audio stream as soon as PIN_OUT and
|
||||||
|
+ * AC_DIG1_ENABLE are enabled, which happens at open() time.
|
||||||
|
+ * To avoid that, set format to 0, which is not valid for HDMI.
|
||||||
|
+ */
|
||||||
|
+ snd_hda_codec_write(codec, cvt_nid, 0, AC_VERB_SET_STREAM_FORMAT, 0);
|
||||||
|
+
|
||||||
|
spec->num_cvts++;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
@@ -1372,6 +1380,12 @@ static int hdmi_pcm_close(struct hda_pcm_stream *hinfo,
|
||||||
|
struct hdmi_spec_per_pin *per_pin;
|
||||||
|
|
||||||
|
if (hinfo->nid) {
|
||||||
|
+ /*
|
||||||
|
+ * Make sure no empty audio is output after this point by
|
||||||
|
+ * setting stream format to 0, which is not valid for HDMI.
|
||||||
|
+ */
|
||||||
|
+ __snd_hda_codec_cleanup_stream(codec, hinfo->nid, 1);
|
||||||
|
+
|
||||||
|
cvt_idx = cvt_nid_to_cvt_index(spec, hinfo->nid);
|
||||||
|
if (snd_BUG_ON(cvt_idx < 0))
|
||||||
|
return -EINVAL;
|
||||||
|
--
|
||||||
|
1.7.10
|
||||||
|
|
@ -1,93 +0,0 @@
|
|||||||
From 09c206b7ee18b50d81916697150bd510f198716d Mon Sep 17 00:00:00 2001
|
|
||||||
From: Stefan Saraev <stefan@saraev.ca>
|
|
||||||
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 <tiwai@suse.de>
|
|
||||||
> 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 <tiwai@suse.de>
|
|
||||||
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user