]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.25/patches.drivers/alsa-post-ga-hda-ati-pos-fix
Revert "Move xen patchset to new version's subdir."
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / alsa-post-ga-hda-ati-pos-fix
diff --git a/src/patches/suse-2.6.27.25/patches.drivers/alsa-post-ga-hda-ati-pos-fix b/src/patches/suse-2.6.27.25/patches.drivers/alsa-post-ga-hda-ati-pos-fix
new file mode 100644 (file)
index 0000000..748a593
--- /dev/null
@@ -0,0 +1,62 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: ALSA: hda - Workaround for buggy DMA position on ATI controllers
+Patch-mainline: 2.6.30-rc1
+References: bnc#502733
+
+The position-buffer on ATI controllers are unreliable as well as
+on VIA chips, thus the same workaround for DMA position reading as
+VIA is useful for ATI.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/hda_intel.c |   31 ++++++++++++++++++-------------
+ 1 file changed, 18 insertions(+), 13 deletions(-)
+
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2065,26 +2065,31 @@
+ {
+       const struct snd_pci_quirk *q;
+-      /* Check VIA HD Audio Controller exist */
+-      if (chip->pci->vendor == PCI_VENDOR_ID_VIA &&
+-          chip->pci->device == VIA_HDAC_DEVICE_ID) {
++      switch (fix) {
++      case POS_FIX_LPIB:
++      case POS_FIX_POSBUF:
++              return fix;
++      }
++
++      /* Check VIA/ATI HD Audio Controller exist */
++      switch (chip->driver_type) {
++      case AZX_DRIVER_VIA:
++      case AZX_DRIVER_ATI:
+               chip->via_dmapos_patch = 1;
+               /* Use link position directly, avoid any transfer problem. */
+               return POS_FIX_LPIB;
+       }
+       chip->via_dmapos_patch = 0;
+-      if (fix == POS_FIX_AUTO) {
+-              q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
+-              if (q) {
+-                      printk(KERN_INFO
+-                                  "hda_intel: position_fix set to %d "
+-                                  "for device %04x:%04x\n",
+-                                  q->value, q->subvendor, q->subdevice);
+-                      return q->value;
+-              }
++      q = snd_pci_quirk_lookup(chip->pci, position_fix_list);
++      if (q) {
++              printk(KERN_INFO
++                     "hda_intel: position_fix set to %d "
++                     "for device %04x:%04x\n",
++                     q->value, q->subvendor, q->subdevice);
++              return q->value;
+       }
+-      return fix;
++      return POS_FIX_AUTO;
+ }
+ /*