diff options
author | Takashi Iwai <tiwai@suse.de> | 2011-05-25 03:11:37 -0400 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2011-05-26 08:43:07 -0400 |
commit | 9477c58e3308f54a108a5d1eb9621830b329b0ca (patch) | |
tree | 8b93d7cfe898df5cb5d63f14847dc1ad5d3f6065 /sound/pci | |
parent | 0b6267376d1113bf8e09ae655919e6f0bbe90d01 (diff) |
ALSA: hda - Reorganize controller quriks with bit flags
Introduce bit-flags indicating the necessary controller quirks, and
set them in pci driver_data field. This simplifies the checks in the
driver code and avoids the pci-id lookup in different places.
Also, this patch adds the PCI ID entry for AMD Hudson. AMD Hudson
requires a similar workaround like ATI SB while other generic ATI and
AMD controllers don't need but some ATI-HDMI quirks. So, we need a
different entry for Hudson.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci')
-rw-r--r-- | sound/pci/hda/hda_intel.c | 206 |
1 files changed, 125 insertions, 81 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 43a036716d25..348705666f99 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -391,6 +391,7 @@ struct azx { | |||
391 | 391 | ||
392 | /* chip type specific */ | 392 | /* chip type specific */ |
393 | int driver_type; | 393 | int driver_type; |
394 | unsigned int driver_caps; | ||
394 | int playback_streams; | 395 | int playback_streams; |
395 | int playback_index_offset; | 396 | int playback_index_offset; |
396 | int capture_streams; | 397 | int capture_streams; |
@@ -464,6 +465,34 @@ enum { | |||
464 | AZX_NUM_DRIVERS, /* keep this as last entry */ | 465 | AZX_NUM_DRIVERS, /* keep this as last entry */ |
465 | }; | 466 | }; |
466 | 467 | ||
468 | /* driver quirks (capabilities) */ | ||
469 | /* bits 0-7 are used for indicating driver type */ | ||
470 | #define AZX_DCAPS_NO_TCSEL (1 << 8) /* No Intel TCSEL bit */ | ||
471 | #define AZX_DCAPS_NO_MSI (1 << 9) /* No MSI support */ | ||
472 | #define AZX_DCAPS_ATI_SNOOP (1 << 10) /* ATI snoop enable */ | ||
473 | #define AZX_DCAPS_NVIDIA_SNOOP (1 << 11) /* Nvidia snoop enable */ | ||
474 | #define AZX_DCAPS_SCH_SNOOP (1 << 12) /* SCH/PCH snoop enable */ | ||
475 | #define AZX_DCAPS_RIRB_DELAY (1 << 13) /* Long delay in read loop */ | ||
476 | #define AZX_DCAPS_RIRB_PRE_DELAY (1 << 14) /* Put a delay before read */ | ||
477 | #define AZX_DCAPS_CTX_WORKAROUND (1 << 15) /* X-Fi workaround */ | ||
478 | #define AZX_DCAPS_POSFIX_LPIB (1 << 16) /* Use LPIB as default */ | ||
479 | #define AZX_DCAPS_POSFIX_VIA (1 << 17) /* Use VIACOMBO as default */ | ||
480 | #define AZX_DCAPS_NO_64BIT (1 << 18) /* No 64bit address */ | ||
481 | #define AZX_DCAPS_SYNC_WRITE (1 << 19) /* sync each cmd write */ | ||
482 | |||
483 | /* quirks for ATI SB / AMD Hudson */ | ||
484 | #define AZX_DCAPS_PRESET_ATI_SB \ | ||
485 | (AZX_DCAPS_ATI_SNOOP | AZX_DCAPS_NO_TCSEL | \ | ||
486 | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB) | ||
487 | |||
488 | /* quirks for ATI/AMD HDMI */ | ||
489 | #define AZX_DCAPS_PRESET_ATI_HDMI \ | ||
490 | (AZX_DCAPS_NO_TCSEL | AZX_DCAPS_SYNC_WRITE | AZX_DCAPS_POSFIX_LPIB) | ||
491 | |||
492 | /* quirks for Nvidia */ | ||
493 | #define AZX_DCAPS_PRESET_NVIDIA \ | ||
494 | (AZX_DCAPS_NVIDIA_SNOOP | AZX_DCAPS_RIRB_DELAY | AZX_DCAPS_NO_MSI) | ||
495 | |||
467 | static char *driver_short_names[] __devinitdata = { | 496 | static char *driver_short_names[] __devinitdata = { |
468 | [AZX_DRIVER_ICH] = "HDA Intel", | 497 | [AZX_DRIVER_ICH] = "HDA Intel", |
469 | [AZX_DRIVER_PCH] = "HDA Intel PCH", | 498 | [AZX_DRIVER_PCH] = "HDA Intel PCH", |
@@ -566,7 +595,7 @@ static void azx_init_cmd_io(struct azx *chip) | |||
566 | /* reset the rirb hw write pointer */ | 595 | /* reset the rirb hw write pointer */ |
567 | azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); | 596 | azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); |
568 | /* set N=1, get RIRB response interrupt for new entry */ | 597 | /* set N=1, get RIRB response interrupt for new entry */ |
569 | if (chip->driver_type == AZX_DRIVER_CTX) | 598 | if (chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) |
570 | azx_writew(chip, RINTCNT, 0xc0); | 599 | azx_writew(chip, RINTCNT, 0xc0); |
571 | else | 600 | else |
572 | azx_writew(chip, RINTCNT, 1); | 601 | azx_writew(chip, RINTCNT, 1); |
@@ -1056,19 +1085,24 @@ static void azx_init_pci(struct azx *chip) | |||
1056 | * codecs. | 1085 | * codecs. |
1057 | * The PCI register TCSEL is defined in the Intel manuals. | 1086 | * The PCI register TCSEL is defined in the Intel manuals. |
1058 | */ | 1087 | */ |
1059 | if (chip->driver_type != AZX_DRIVER_ATI && | 1088 | if (chip->driver_caps & AZX_DCAPS_NO_TCSEL) { |
1060 | chip->driver_type != AZX_DRIVER_ATIHDMI) | 1089 | snd_printdd(SFX "Clearing TCSEL\n"); |
1061 | update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0); | 1090 | update_pci_byte(chip->pci, ICH6_PCIREG_TCSEL, 0x07, 0); |
1091 | } | ||
1062 | 1092 | ||
1063 | switch (chip->driver_type) { | 1093 | /* For ATI SB450/600/700/800/900 and AMD Hudson azalia HD audio, |
1064 | case AZX_DRIVER_ATI: | 1094 | * we need to enable snoop. |
1065 | /* For ATI SB450 azalia HD audio, we need to enable snoop */ | 1095 | */ |
1096 | if (chip->driver_caps & AZX_DCAPS_ATI_SNOOP) { | ||
1097 | snd_printdd(SFX "Enabling ATI snoop\n"); | ||
1066 | update_pci_byte(chip->pci, | 1098 | update_pci_byte(chip->pci, |
1067 | ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, | 1099 | ATI_SB450_HDAUDIO_MISC_CNTR2_ADDR, |
1068 | 0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP); | 1100 | 0x07, ATI_SB450_HDAUDIO_ENABLE_SNOOP); |
1069 | break; | 1101 | } |
1070 | case AZX_DRIVER_NVIDIA: | 1102 | |
1071 | /* For NVIDIA HDA, enable snoop */ | 1103 | /* For NVIDIA HDA, enable snoop */ |
1104 | if (chip->driver_caps & AZX_DCAPS_NVIDIA_SNOOP) { | ||
1105 | snd_printdd(SFX "Enabling Nvidia snoop\n"); | ||
1072 | update_pci_byte(chip->pci, | 1106 | update_pci_byte(chip->pci, |
1073 | NVIDIA_HDA_TRANSREG_ADDR, | 1107 | NVIDIA_HDA_TRANSREG_ADDR, |
1074 | 0x0f, NVIDIA_HDA_ENABLE_COHBITS); | 1108 | 0x0f, NVIDIA_HDA_ENABLE_COHBITS); |
@@ -1078,9 +1112,10 @@ static void azx_init_pci(struct azx *chip) | |||
1078 | update_pci_byte(chip->pci, | 1112 | update_pci_byte(chip->pci, |
1079 | NVIDIA_HDA_OSTRM_COH, | 1113 | NVIDIA_HDA_OSTRM_COH, |
1080 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); | 1114 | 0x01, NVIDIA_HDA_ENABLE_COHBIT); |
1081 | break; | 1115 | } |
1082 | case AZX_DRIVER_SCH: | 1116 | |
1083 | case AZX_DRIVER_PCH: | 1117 | /* Enable SCH/PCH snoop if needed */ |
1118 | if (chip->driver_caps & AZX_DCAPS_SCH_SNOOP) { | ||
1084 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); | 1119 | pci_read_config_word(chip->pci, INTEL_SCH_HDA_DEVC, &snoop); |
1085 | if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) { | 1120 | if (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) { |
1086 | pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, | 1121 | pci_write_config_word(chip->pci, INTEL_SCH_HDA_DEVC, |
@@ -1091,14 +1126,6 @@ static void azx_init_pci(struct azx *chip) | |||
1091 | (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) | 1126 | (snoop & INTEL_SCH_HDA_DEVC_NOSNOOP) |
1092 | ? "Failed" : "OK"); | 1127 | ? "Failed" : "OK"); |
1093 | } | 1128 | } |
1094 | break; | ||
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; | ||
1102 | } | 1129 | } |
1103 | } | 1130 | } |
1104 | 1131 | ||
@@ -1152,7 +1179,7 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) | |||
1152 | status = azx_readb(chip, RIRBSTS); | 1179 | status = azx_readb(chip, RIRBSTS); |
1153 | if (status & RIRB_INT_MASK) { | 1180 | if (status & RIRB_INT_MASK) { |
1154 | if (status & RIRB_INT_RESPONSE) { | 1181 | if (status & RIRB_INT_RESPONSE) { |
1155 | if (chip->driver_type == AZX_DRIVER_CTX) | 1182 | if (chip->driver_caps & AZX_DCAPS_RIRB_PRE_DELAY) |
1156 | udelay(80); | 1183 | udelay(80); |
1157 | azx_update_rirb(chip); | 1184 | azx_update_rirb(chip); |
1158 | } | 1185 | } |
@@ -1421,8 +1448,10 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model) | |||
1421 | if (err < 0) | 1448 | if (err < 0) |
1422 | return err; | 1449 | return err; |
1423 | 1450 | ||
1424 | if (chip->driver_type == AZX_DRIVER_NVIDIA) | 1451 | if (chip->driver_caps & AZX_DCAPS_RIRB_DELAY) { |
1452 | snd_printd(SFX "Enable delay in RIRB handling\n"); | ||
1425 | chip->bus->needs_damn_long_delay = 1; | 1453 | chip->bus->needs_damn_long_delay = 1; |
1454 | } | ||
1426 | 1455 | ||
1427 | codecs = 0; | 1456 | codecs = 0; |
1428 | max_slots = azx_max_codecs[chip->driver_type]; | 1457 | max_slots = azx_max_codecs[chip->driver_type]; |
@@ -1457,9 +1486,8 @@ static int __devinit azx_codec_create(struct azx *chip, const char *model) | |||
1457 | * sequence like the pin-detection. It seems that forcing the synced | 1486 | * sequence like the pin-detection. It seems that forcing the synced |
1458 | * access works around the stall. Grrr... | 1487 | * access works around the stall. Grrr... |
1459 | */ | 1488 | */ |
1460 | if (chip->pci->vendor == PCI_VENDOR_ID_AMD || | 1489 | if (chip->driver_caps & AZX_DCAPS_SYNC_WRITE) { |
1461 | chip->pci->vendor == PCI_VENDOR_ID_ATI) { | 1490 | snd_printd(SFX "Enable sync_write for stable communication\n"); |
1462 | snd_printk(KERN_INFO SFX "Enable sync_write for AMD chipset\n"); | ||
1463 | chip->bus->sync_write = 1; | 1491 | chip->bus->sync_write = 1; |
1464 | chip->bus->allow_bus_reset = 1; | 1492 | chip->bus->allow_bus_reset = 1; |
1465 | } | 1493 | } |
@@ -1720,7 +1748,7 @@ static int azx_pcm_prepare(struct snd_pcm_substream *substream) | |||
1720 | 1748 | ||
1721 | stream_tag = azx_dev->stream_tag; | 1749 | stream_tag = azx_dev->stream_tag; |
1722 | /* CA-IBG chips need the playback stream starting from 1 */ | 1750 | /* CA-IBG chips need the playback stream starting from 1 */ |
1723 | if (chip->driver_type == AZX_DRIVER_CTX && | 1751 | if ((chip->driver_caps & AZX_DCAPS_CTX_WORKAROUND) && |
1724 | stream_tag > chip->capture_streams) | 1752 | stream_tag > chip->capture_streams) |
1725 | stream_tag -= chip->capture_streams; | 1753 | stream_tag -= chip->capture_streams; |
1726 | return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag, | 1754 | return snd_hda_codec_prepare(apcm->codec, hinfo, stream_tag, |
@@ -2365,20 +2393,14 @@ static int __devinit check_position_fix(struct azx *chip, int fix) | |||
2365 | } | 2393 | } |
2366 | 2394 | ||
2367 | /* Check VIA/ATI HD Audio Controller exist */ | 2395 | /* Check VIA/ATI HD Audio Controller exist */ |
2368 | switch (chip->driver_type) { | 2396 | if (chip->driver_caps & AZX_DCAPS_POSFIX_VIA) { |
2369 | case AZX_DRIVER_VIA: | 2397 | snd_printd(SFX "Using VIACOMBO position fix\n"); |
2370 | /* Use link position directly, avoid any transfer problem. */ | ||
2371 | return POS_FIX_VIACOMBO; | 2398 | return POS_FIX_VIACOMBO; |
2372 | case AZX_DRIVER_ATI: | 2399 | } |
2373 | /* ATI chipsets don't work well with position-buffer */ | 2400 | if (chip->driver_caps & AZX_DCAPS_POSFIX_LPIB) { |
2401 | snd_printd(SFX "Using LPIB position fix\n"); | ||
2374 | return POS_FIX_LPIB; | 2402 | 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; | ||
2380 | } | 2403 | } |
2381 | |||
2382 | return POS_FIX_AUTO; | 2404 | return POS_FIX_AUTO; |
2383 | } | 2405 | } |
2384 | 2406 | ||
@@ -2460,8 +2482,8 @@ static void __devinit check_msi(struct azx *chip) | |||
2460 | } | 2482 | } |
2461 | 2483 | ||
2462 | /* NVidia chipsets seem to cause troubles with MSI */ | 2484 | /* NVidia chipsets seem to cause troubles with MSI */ |
2463 | if (chip->driver_type == AZX_DRIVER_NVIDIA) { | 2485 | if (chip->driver_caps & AZX_DCAPS_NO_MSI) { |
2464 | printk(KERN_INFO "hda_intel: Disable MSI for Nvidia chipset\n"); | 2486 | printk(KERN_INFO "hda_intel: Disabling MSI\n"); |
2465 | chip->msi = 0; | 2487 | chip->msi = 0; |
2466 | } | 2488 | } |
2467 | } | 2489 | } |
@@ -2471,7 +2493,7 @@ static void __devinit check_msi(struct azx *chip) | |||
2471 | * constructor | 2493 | * constructor |
2472 | */ | 2494 | */ |
2473 | static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | 2495 | static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, |
2474 | int dev, int driver_type, | 2496 | int dev, unsigned int driver_caps, |
2475 | struct azx **rchip) | 2497 | struct azx **rchip) |
2476 | { | 2498 | { |
2477 | struct azx *chip; | 2499 | struct azx *chip; |
@@ -2499,7 +2521,8 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2499 | chip->card = card; | 2521 | chip->card = card; |
2500 | chip->pci = pci; | 2522 | chip->pci = pci; |
2501 | chip->irq = -1; | 2523 | chip->irq = -1; |
2502 | chip->driver_type = driver_type; | 2524 | chip->driver_caps = driver_caps; |
2525 | chip->driver_type = driver_caps & 0xff; | ||
2503 | check_msi(chip); | 2526 | check_msi(chip); |
2504 | chip->dev_index = dev; | 2527 | chip->dev_index = dev; |
2505 | INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work); | 2528 | INIT_WORK(&chip->irq_pending_work, azx_irq_pending_work); |
@@ -2563,8 +2586,7 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2563 | snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap); | 2586 | snd_printdd(SFX "chipset global capabilities = 0x%x\n", gcap); |
2564 | 2587 | ||
2565 | /* disable SB600 64bit support for safety */ | 2588 | /* disable SB600 64bit support for safety */ |
2566 | if ((chip->driver_type == AZX_DRIVER_ATI) || | 2589 | if (chip->pci->vendor == PCI_VENDOR_ID_ATI) { |
2567 | (chip->driver_type == AZX_DRIVER_ATIHDMI)) { | ||
2568 | struct pci_dev *p_smbus; | 2590 | struct pci_dev *p_smbus; |
2569 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, | 2591 | p_smbus = pci_get_device(PCI_VENDOR_ID_ATI, |
2570 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, | 2592 | PCI_DEVICE_ID_ATI_SBX00_SMBUS, |
@@ -2574,19 +2596,13 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci, | |||
2574 | gcap &= ~ICH6_GCAP_64OK; | 2596 | gcap &= ~ICH6_GCAP_64OK; |
2575 | pci_dev_put(p_smbus); | 2597 | pci_dev_put(p_smbus); |
2576 | } | 2598 | } |
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; | ||
2584 | } | 2599 | } |
2585 | 2600 | ||
2586 | /* disable 64bit DMA address for Teradici */ | 2601 | /* disable 64bit DMA address on some devices */ |
2587 | /* it does not work with device 6549:1200 subsys e4a2:040b */ | 2602 | if (chip->driver_caps & AZX_DCAPS_NO_64BIT) { |
2588 | if (chip->driver_type == AZX_DRIVER_TERA) | 2603 | snd_printd(SFX "Disabling 64bit DMA\n"); |
2589 | gcap &= ~ICH6_GCAP_64OK; | 2604 | gcap &= ~ICH6_GCAP_64OK; |
2605 | } | ||
2590 | 2606 | ||
2591 | /* allow 64bit DMA address if supported by H/W */ | 2607 | /* allow 64bit DMA address if supported by H/W */ |
2592 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) | 2608 | if ((gcap & ICH6_GCAP_64OK) && !pci_set_dma_mask(pci, DMA_BIT_MASK(64))) |
@@ -2788,38 +2804,62 @@ static void __devexit azx_remove(struct pci_dev *pci) | |||
2788 | /* PCI IDs */ | 2804 | /* PCI IDs */ |
2789 | static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | 2805 | static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { |
2790 | /* CPT */ | 2806 | /* CPT */ |
2791 | { PCI_DEVICE(0x8086, 0x1c20), .driver_data = AZX_DRIVER_PCH }, | 2807 | { PCI_DEVICE(0x8086, 0x1c20), |
2808 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP }, | ||
2792 | /* PBG */ | 2809 | /* PBG */ |
2793 | { PCI_DEVICE(0x8086, 0x1d20), .driver_data = AZX_DRIVER_PCH }, | 2810 | { PCI_DEVICE(0x8086, 0x1d20), |
2811 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP }, | ||
2794 | /* Panther Point */ | 2812 | /* Panther Point */ |
2795 | { PCI_DEVICE(0x8086, 0x1e20), .driver_data = AZX_DRIVER_PCH }, | 2813 | { PCI_DEVICE(0x8086, 0x1e20), |
2814 | .driver_data = AZX_DRIVER_PCH | AZX_DCAPS_SCH_SNOOP }, | ||
2796 | /* SCH */ | 2815 | /* SCH */ |
2797 | { PCI_DEVICE(0x8086, 0x811b), .driver_data = AZX_DRIVER_SCH }, | 2816 | { PCI_DEVICE(0x8086, 0x811b), |
2817 | .driver_data = AZX_DRIVER_SCH | AZX_DCAPS_SCH_SNOOP }, | ||
2798 | /* Generic Intel */ | 2818 | /* Generic Intel */ |
2799 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID), | 2819 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID), |
2800 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2820 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2801 | .class_mask = 0xffffff, | 2821 | .class_mask = 0xffffff, |
2802 | .driver_data = AZX_DRIVER_ICH }, | 2822 | .driver_data = AZX_DRIVER_ICH }, |
2803 | /* ATI SB 450/600 */ | 2823 | /* ATI SB 450/600/700/800/900 */ |
2804 | { PCI_DEVICE(0x1002, 0x437b), .driver_data = AZX_DRIVER_ATI }, | 2824 | { PCI_DEVICE(0x1002, 0x437b), |
2805 | { PCI_DEVICE(0x1002, 0x4383), .driver_data = AZX_DRIVER_ATI }, | 2825 | .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB }, |
2826 | { PCI_DEVICE(0x1002, 0x4383), | ||
2827 | .driver_data = AZX_DRIVER_ATI | AZX_DCAPS_PRESET_ATI_SB }, | ||
2828 | /* AMD Hudson */ | ||
2829 | { PCI_DEVICE(0x1022, 0x780d), | ||
2830 | .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_SB }, | ||
2806 | /* ATI HDMI */ | 2831 | /* ATI HDMI */ |
2807 | { PCI_DEVICE(0x1002, 0x793b), .driver_data = AZX_DRIVER_ATIHDMI }, | 2832 | { PCI_DEVICE(0x1002, 0x793b), |
2808 | { PCI_DEVICE(0x1002, 0x7919), .driver_data = AZX_DRIVER_ATIHDMI }, | 2833 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2809 | { PCI_DEVICE(0x1002, 0x960f), .driver_data = AZX_DRIVER_ATIHDMI }, | 2834 | { PCI_DEVICE(0x1002, 0x7919), |
2810 | { PCI_DEVICE(0x1002, 0x970f), .driver_data = AZX_DRIVER_ATIHDMI }, | 2835 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2811 | { PCI_DEVICE(0x1002, 0xaa00), .driver_data = AZX_DRIVER_ATIHDMI }, | 2836 | { PCI_DEVICE(0x1002, 0x960f), |
2812 | { PCI_DEVICE(0x1002, 0xaa08), .driver_data = AZX_DRIVER_ATIHDMI }, | 2837 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2813 | { PCI_DEVICE(0x1002, 0xaa10), .driver_data = AZX_DRIVER_ATIHDMI }, | 2838 | { PCI_DEVICE(0x1002, 0x970f), |
2814 | { PCI_DEVICE(0x1002, 0xaa18), .driver_data = AZX_DRIVER_ATIHDMI }, | 2839 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2815 | { PCI_DEVICE(0x1002, 0xaa20), .driver_data = AZX_DRIVER_ATIHDMI }, | 2840 | { PCI_DEVICE(0x1002, 0xaa00), |
2816 | { PCI_DEVICE(0x1002, 0xaa28), .driver_data = AZX_DRIVER_ATIHDMI }, | 2841 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2817 | { PCI_DEVICE(0x1002, 0xaa30), .driver_data = AZX_DRIVER_ATIHDMI }, | 2842 | { PCI_DEVICE(0x1002, 0xaa08), |
2818 | { PCI_DEVICE(0x1002, 0xaa38), .driver_data = AZX_DRIVER_ATIHDMI }, | 2843 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2819 | { PCI_DEVICE(0x1002, 0xaa40), .driver_data = AZX_DRIVER_ATIHDMI }, | 2844 | { PCI_DEVICE(0x1002, 0xaa10), |
2820 | { PCI_DEVICE(0x1002, 0xaa48), .driver_data = AZX_DRIVER_ATIHDMI }, | 2845 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, |
2846 | { PCI_DEVICE(0x1002, 0xaa18), | ||
2847 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2848 | { PCI_DEVICE(0x1002, 0xaa20), | ||
2849 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2850 | { PCI_DEVICE(0x1002, 0xaa28), | ||
2851 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2852 | { PCI_DEVICE(0x1002, 0xaa30), | ||
2853 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2854 | { PCI_DEVICE(0x1002, 0xaa38), | ||
2855 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2856 | { PCI_DEVICE(0x1002, 0xaa40), | ||
2857 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2858 | { PCI_DEVICE(0x1002, 0xaa48), | ||
2859 | .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI }, | ||
2821 | /* VIA VT8251/VT8237A */ | 2860 | /* VIA VT8251/VT8237A */ |
2822 | { PCI_DEVICE(0x1106, 0x3288), .driver_data = AZX_DRIVER_VIA }, | 2861 | { PCI_DEVICE(0x1106, 0x3288), |
2862 | .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA }, | ||
2823 | /* SIS966 */ | 2863 | /* SIS966 */ |
2824 | { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS }, | 2864 | { PCI_DEVICE(0x1039, 0x7502), .driver_data = AZX_DRIVER_SIS }, |
2825 | /* ULI M5461 */ | 2865 | /* ULI M5461 */ |
@@ -2828,9 +2868,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2828 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID), | 2868 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID), |
2829 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2869 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2830 | .class_mask = 0xffffff, | 2870 | .class_mask = 0xffffff, |
2831 | .driver_data = AZX_DRIVER_NVIDIA }, | 2871 | .driver_data = AZX_DRIVER_NVIDIA | AZX_DCAPS_PRESET_NVIDIA }, |
2832 | /* Teradici */ | 2872 | /* Teradici */ |
2833 | { PCI_DEVICE(0x6549, 0x1200), .driver_data = AZX_DRIVER_TERA }, | 2873 | { PCI_DEVICE(0x6549, 0x1200), |
2874 | .driver_data = AZX_DRIVER_TERA | AZX_DCAPS_NO_64BIT }, | ||
2834 | /* Creative X-Fi (CA0110-IBG) */ | 2875 | /* Creative X-Fi (CA0110-IBG) */ |
2835 | #if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE) | 2876 | #if !defined(CONFIG_SND_CTXFI) && !defined(CONFIG_SND_CTXFI_MODULE) |
2836 | /* the following entry conflicts with snd-ctxfi driver, | 2877 | /* the following entry conflicts with snd-ctxfi driver, |
@@ -2840,10 +2881,13 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2840 | { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), | 2881 | { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), |
2841 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2882 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2842 | .class_mask = 0xffffff, | 2883 | .class_mask = 0xffffff, |
2843 | .driver_data = AZX_DRIVER_CTX }, | 2884 | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | |
2885 | AZX_DCAPS_RIRB_PRE_DELAY }, | ||
2844 | #else | 2886 | #else |
2845 | /* this entry seems still valid -- i.e. without emu20kx chip */ | 2887 | /* this entry seems still valid -- i.e. without emu20kx chip */ |
2846 | { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX }, | 2888 | { PCI_DEVICE(0x1102, 0x0009), |
2889 | .driver_data = AZX_DRIVER_CTX | AZX_DCAPS_CTX_WORKAROUND | | ||
2890 | AZX_DCAPS_RIRB_PRE_DELAY }, | ||
2847 | #endif | 2891 | #endif |
2848 | /* Vortex86MX */ | 2892 | /* Vortex86MX */ |
2849 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, | 2893 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, |
@@ -2853,11 +2897,11 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2853 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), | 2897 | { PCI_DEVICE(PCI_VENDOR_ID_ATI, PCI_ANY_ID), |
2854 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2898 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2855 | .class_mask = 0xffffff, | 2899 | .class_mask = 0xffffff, |
2856 | .driver_data = AZX_DRIVER_GENERIC }, | 2900 | .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI }, |
2857 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID), | 2901 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_ANY_ID), |
2858 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2902 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2859 | .class_mask = 0xffffff, | 2903 | .class_mask = 0xffffff, |
2860 | .driver_data = AZX_DRIVER_GENERIC }, | 2904 | .driver_data = AZX_DRIVER_GENERIC | AZX_DCAPS_PRESET_ATI_HDMI }, |
2861 | { 0, } | 2905 | { 0, } |
2862 | }; | 2906 | }; |
2863 | MODULE_DEVICE_TABLE(pci, azx_ids); | 2907 | MODULE_DEVICE_TABLE(pci, azx_ids); |