| From c673ba1c23941173c16ff24c7cb34199e826c8b5 Mon Sep 17 00:00:00 2001 |
| From: Takashi Iwai <tiwai@suse.de> |
| Date: Tue, 17 Mar 2009 07:49:14 +0100 |
| Subject: ALSA: hda - Workaround for buggy DMA position on ATI controllers |
| |
| From: Takashi Iwai <tiwai@suse.de> |
| |
| commit c673ba1c23941173c16ff24c7cb34199e826c8b5 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@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 |
| @@ -2063,26 +2063,31 @@ static int __devinit check_position_fix( |
| { |
| 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; |
| } |
| |
| /* |