[067/289] ALSA: hda - Disable sticky PCM stream assignment for AD codecs

Greg KH
2010-12-08T01:00:11Z

From: Takashi Iwai <tiwai@suse.de>

commit 0e7adbe263f89ea2ef15b5af5e80a812b2a85025 upstream.

The sticky PCM stream assignment introduced in 2.6.36 kernel seems
causing problems on AD codecs. At some time later, the streaming no
longer works by unknown reason. A simple workaround is to disable
sticky-assignment for these codecs.

Tested-by: Vasily Khoruzhick <anarsoul@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

---
sound/pci/hda/hda_codec.c | 3 +++
sound/pci/hda/hda_codec.h | 1 +
sound/pci/hda/patch_analog.c | 7 +++++++
3 files changed, 11 insertions(+)

--- a/sound/pci/hda/hda_codec.c
+++ b/sound/pci/hda/hda_codec.c
@@ -1281,6 +1281,9 @@ void __snd_hda_codec_cleanup_stream(stru
if (!nid)
return;

+ if (codec->no_sticky_stream)
+ do_now = 1;
+
snd_printdd("hda_codec_cleanup_stream: NID=0x%x\n", nid);
p = get_hda_cvt_setup(codec, nid);
if (p) {
--- a/sound/pci/hda/hda_codec.h
+++ b/sound/pci/hda/hda_codec.h
@@ -850,6 +850,7 @@ struct hda_codec {
unsigned int pin_amp_workaround:1; /* pin out-amp takes index
* (e.g. Conexant codecs)
*/
+ unsigned int no_sticky_stream:1; /* no sticky-PCM stream assignment */
unsigned int pins_shutup:1; /* pins are shut up */
unsigned int no_trigger_sense:1; /* don't trigger at pin-sensing */
#ifdef CONFIG_SND_HDA_POWER_SAVE
--- a/sound/pci/hda/patch_analog.c
+++ b/sound/pci/hda/patch_analog.c
@@ -1276,6 +1276,7 @@ static int patch_ad1986a(struct hda_code
spec->multiout.no_share_stream = 1;

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}
@@ -1463,6 +1464,7 @@ static int patch_ad1983(struct hda_codec
codec->patch_ops = ad198x_patch_ops;

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}
@@ -1917,6 +1919,7 @@ static int patch_ad1981(struct hda_codec
}

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}
@@ -3235,6 +3238,7 @@ static int patch_ad1988(struct hda_codec
spec->vmaster_nid = 0x04;

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}
@@ -3449,6 +3453,7 @@ static int patch_ad1884(struct hda_codec
codec->patch_ops = ad198x_patch_ops;

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}
@@ -4422,6 +4427,7 @@ static int patch_ad1884a(struct hda_code
}

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}
@@ -4761,6 +4767,7 @@ static int patch_ad1882(struct hda_codec
}

codec->no_trigger_sense = 1;
+ codec->no_sticky_stream = 1;

return 0;
}