|
@@ -1486,6 +1486,7 @@ static int azx_first_init(struct azx *chip)
|
|
|
struct snd_card *card = chip->card;
|
|
|
int err;
|
|
|
unsigned short gcap;
|
|
|
+ unsigned int dma_bits = 64;
|
|
|
|
|
|
#if BITS_PER_LONG != 64
|
|
|
/* Fix up base address on ULI M5461 */
|
|
@@ -1522,9 +1523,14 @@ static int azx_first_init(struct azx *chip)
|
|
|
gcap = azx_readw(chip, GCAP);
|
|
|
dev_dbg(card->dev, "chipset global capabilities = 0x%x\n", gcap);
|
|
|
|
|
|
+ /* AMD devices support 40 or 48bit DMA, take the safe one */
|
|
|
+ if (chip->pci->vendor == PCI_VENDOR_ID_AMD)
|
|
|
+ dma_bits = 40;
|
|
|
+
|
|
|
/* disable SB600 64bit support for safety */
|
|
|
if (chip->pci->vendor == PCI_VENDOR_ID_ATI) {
|
|
|
struct pci_dev *p_smbus;
|
|
|
+ dma_bits = 40;
|
|
|
p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
|
|
|
PCI_DEVICE_ID_ATI_SBX00_SMBUS,
|
|
|
NULL);
|
|
@@ -1554,9 +1560,11 @@ static int azx_first_init(struct azx *chip)
|
|
|
}
|
|
|
|
|
|
/* allow 64bit DMA address if supported by H/W */
|
|
|
- if ((gcap & AZX_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64)))
|
|
|
- pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(64));
|
|
|
- else {
|
|
|
+ if (!(gcap & AZX_GCAP_64OK))
|
|
|
+ dma_bits = 32;
|
|
|
+ if (!pci_set_dma_mask(pci, DMA_BIT_MASK(dma_bits))) {
|
|
|
+ pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(dma_bits));
|
|
|
+ } else {
|
|
|
pci_set_dma_mask(pci, DMA_BIT_MASK(32));
|
|
|
pci_set_consistent_dma_mask(pci, DMA_BIT_MASK(32));
|
|
|
}
|