summaryrefslogtreecommitdiffstats
path: root/sound/pci/hda/patch_conexant.c
diff options
context:
space:
mode:
authorTakashi Iwai2012-01-25 11:54:19 +0100
committerTakashi Iwai2012-02-02 10:19:33 +0100
commit4f2864a49bf058184e85c9f5a2f4578f11992c7d (patch)
tree7154d97307e2e307611252cd67e7fa98f6380b58 /sound/pci/hda/patch_conexant.c
parentALSA: hda - explicitly set buffer-align flag for Nvidia controllers (diff)
downloadkernel-qcow2-linux-4f2864a49bf058184e85c9f5a2f4578f11992c7d.tar.gz
kernel-qcow2-linux-4f2864a49bf058184e85c9f5a2f4578f11992c7d.tar.xz
kernel-qcow2-linux-4f2864a49bf058184e85c9f5a2f4578f11992c7d.zip
ALSA: hda - Enable sync_write and reset for Conexant codecs
This is an attempt to fix S3-resume problems reported for a few laptops with different Conexant codecs. They show the communication stalls at some time in S3, and the driver falls back into the single-cmd mode. This leads to the silent output or the lack of auto-mute feature. As a workaround, here enables the sync_write and the bus-reset flags to make the communication more stable. Bugzilla: https://bugzilla.novell.com/show_bug.cgi?id=740115 Bugzilla: https://bugzilla.novell.com/show_bug.cgi?id=738397 Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/hda/patch_conexant.c')
-rw-r--r--sound/pci/hda/patch_conexant.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
index a7a5733aa4d2..117ae4c22be0 100644
--- a/sound/pci/hda/patch_conexant.c
+++ b/sound/pci/hda/patch_conexant.c
@@ -4414,6 +4414,18 @@ static int patch_conexant_auto(struct hda_codec *codec)
codec->patch_ops = cx_auto_patch_ops;
if (spec->beep_amp)
snd_hda_attach_beep_device(codec, spec->beep_amp);
+
+ /* Some laptops with Conexant chips show stalls in S3 resume,
+ * which falls into the single-cmd mode.
+ * Better to make reset, then.
+ */
+ if (!codec->bus->sync_write) {
+ snd_printd("hda_codec: "
+ "Enable sync_write for stable communication\n");
+ codec->bus->sync_write = 1;
+ codec->bus->allow_bus_reset = 1;
+ }
+
return 0;
}