--- /dev/null
+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;
+ }
+
+ /*