diff options
Diffstat (limited to 'sound/pci/hda/hda_intel.c')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 38 |
1 files changed, 36 insertions, 2 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 70a9d32f0e96..43a036716d25 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -126,6 +126,7 @@ MODULE_SUPPORTED_DEVICE("{{Intel, ICH6}," | |||
126 | "{Intel, ICH10}," | 126 | "{Intel, ICH10}," |
127 | "{Intel, PCH}," | 127 | "{Intel, PCH}," |
128 | "{Intel, CPT}," | 128 | "{Intel, CPT}," |
129 | "{Intel, PPT}," | ||
129 | "{Intel, PBG}," | 130 | "{Intel, PBG}," |
130 | "{Intel, SCH}," | 131 | "{Intel, SCH}," |
131 | "{ATI, SB450}," | 132 | "{ATI, SB450}," |
@@ -1091,7 +1092,13 @@ static void azx_init_pci(struct azx *chip) | |||
1091 | ? "Failed" : "OK"); | 1092 | ? "Failed" : "OK"); |
1092 | } | 1093 | } |
1093 | break; | 1094 | break; |
1094 | 1095 | default: | |
1096 | /* AMD Hudson needs the similar snoop, as it seems... */ | ||
1097 | if (chip->pci->vendor == PCI_VENDOR_ID_AMD) | ||
1098 | update_pci_byte(chip->pci, | ||
1099 | ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, | ||
1100 | 0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP); | ||
1101 | break; | ||
1095 | } | 1102 | } |
1096 | } | 1103 | } |
1097 | 1104 | ||
@@ -1446,6 +1453,17 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model) | |||
1446 | } | 1453 | } |
1447 | } | 1454 | } |
1448 | 1455 | ||
1456 | /* AMD chipsets often cause the communication stalls upon certain | ||
1457 | * sequence like the pin-detection. It seems that forcing the synced | ||
1458 | * access works around the stall. Grrr... | ||
1459 | */ | ||
1460 | if (chip->pci->vendor == PCI_VENDOR_ID_AMD || | ||
1461 | chip->pci->vendor == PCI_VENDOR_ID_ATI) { | ||
1462 | snd_printk(KERN_INFO SFX "Enable sync_write for AMD chipset\n"); | ||
1463 | chip->bus->sync_write = 1; | ||
1464 | chip->bus->allow_bus_reset = 1; | ||
1465 | } | ||
1466 | |||
1449 | /* Then create codec instances */ | 1467 | /* Then create codec instances */ |
1450 | for (c = 0; c < max_slots; c++) { | 1468 | for (c = 0; c < max_slots; c++) { |
1451 | if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { | 1469 | if ((chip->codec_mask & (1 << c)) & chip->codec_probe_mask) { |
@@ -2349,9 +2367,16 @@ static int __devinit check_position_fix(struct azx *chip, int fix) | |||
2349 | /* Check VIA/ATI HD Audio Controller exist */ | 2367 | /* Check VIA/ATI HD Audio Controller exist */ |
2350 | switch (chip->driver_type) { | 2368 | switch (chip->driver_type) { |
2351 | case AZX_DRIVER_VIA: | 2369 | case AZX_DRIVER_VIA: |
2352 | case AZX_DRIVER_ATI: | ||
2353 | /* Use link position directly, avoid any transfer problem. */ | 2370 | /* Use link position directly, avoid any transfer problem. */ |
2354 | return POS_FIX_VIACOMBO; | 2371 | return POS_FIX_VIACOMBO; |
2372 | case AZX_DRIVER_ATI: | ||
2373 | /* ATI chipsets don't work well with position-buffer */ | ||
2374 | return POS_FIX_LPIB; | ||
2375 | case AZX_DRIVER_GENERIC: | ||
2376 | /* AMD chipsets also don't work with position-buffer */ | ||
2377 | if (chip->pci->vendor == PCI_VENDOR_ID_AMD) | ||
2378 | return POS_FIX_LPIB; | ||
2379 | break; | ||
2355 | } | 2380 | } |
2356 | 2381 | ||
2357 | return POS_FIX_AUTO; | 2382 | return POS_FIX_AUTO; |
@@ -2549,6 +2574,13 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2549 | gcap &= ~ICH6_GCAP_64OK; | 2574 | gcap &= ~ICH6_GCAP_64OK; |
2550 | pci_dev_put(p_smbus); | 2575 | pci_dev_put(p_smbus); |
2551 | } | 2576 | } |
2577 | } else { | ||
2578 | /* FIXME: not sure whether this is really needed, but | ||
2579 | * Hudson isn't stable enough for allowing everything... | ||
2580 | * let's check later again. | ||
2581 | */ | ||
2582 | if (chip->pci->vendor == PCI_VENDOR_ID_AMD) | ||
2583 | gcap &= ~ICH6_GCAP_64OK; | ||
2552 | } | 2584 | } |
2553 | 2585 | ||
2554 | /* disable 64bit DMA address for Teradici */ | 2586 | /* disable 64bit DMA address for Teradici */ |
@@ -2759,6 +2791,8 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2759 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, | 2791 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, |
2760 | /* PBG */ | 2792 | /* PBG */ |
2761 | { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, | 2793 | { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, |
2794 | /* Panther Point */ | ||
2795 | { PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH }, | ||
2762 | /* SCH */ | 2796 | /* SCH */ |
2763 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, | 2797 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, |
2764 | /* Generic Intel */ | 2798 | /* Generic Intel */ |