diff options
-rw-r--r-- | sound/pci/hda/hda_intel.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c index 5cbea85a6453..ee445bc6e810 100644 --- a/sound/pci/hda/hda_intel.c +++ b/sound/pci/hda/hda_intel.c | |||
@@ -458,6 +458,7 @@ enum { | |||
458 | AZX_DRIVER_ULI, | 458 | AZX_DRIVER_ULI, |
459 | AZX_DRIVER_NVIDIA, | 459 | AZX_DRIVER_NVIDIA, |
460 | AZX_DRIVER_TERA, | 460 | AZX_DRIVER_TERA, |
461 | AZX_DRIVER_CTX, | ||
461 | AZX_DRIVER_GENERIC, | 462 | AZX_DRIVER_GENERIC, |
462 | AZX_NUM_DRIVERS, /* keep this as last entry */ | 463 | AZX_NUM_DRIVERS, /* keep this as last entry */ |
463 | }; | 464 | }; |
@@ -473,6 +474,7 @@ static char *driver_short_names[] __devinitdata = { | |||
473 | [AZX_DRIVER_ULI] = "HDA ULI M5461", | 474 | [AZX_DRIVER_ULI] = "HDA ULI M5461", |
474 | [AZX_DRIVER_NVIDIA] = "HDA NVidia", | 475 | [AZX_DRIVER_NVIDIA] = "HDA NVidia", |
475 | [AZX_DRIVER_TERA] = "HDA Teradici", | 476 | [AZX_DRIVER_TERA] = "HDA Teradici", |
477 | [AZX_DRIVER_CTX] = "HDA Creative", | ||
476 | [AZX_DRIVER_GENERIC] = "HD-Audio Generic", | 478 | [AZX_DRIVER_GENERIC] = "HD-Audio Generic", |
477 | }; | 479 | }; |
478 | 480 | ||
@@ -563,7 +565,10 @@ static void azx_init_cmd_io(struct azx *chip) | |||
563 | /* reset the rirb hw write pointer */ | 565 | /* reset the rirb hw write pointer */ |
564 | azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); | 566 | azx_writew(chip, RIRBWP, ICH6_RIRBWP_RST); |
565 | /* set N=1, get RIRB response interrupt for new entry */ | 567 | /* set N=1, get RIRB response interrupt for new entry */ |
566 | azx_writew(chip, RINTCNT, 1); | 568 | if (chip->driver_type == AZX_DRIVER_CTX) |
569 | azx_writew(chip, RINTCNT, 0xc0); | ||
570 | else | ||
571 | azx_writew(chip, RINTCNT, 1); | ||
567 | /* enable rirb dma and response irq */ | 572 | /* enable rirb dma and response irq */ |
568 | azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN); | 573 | azx_writeb(chip, RIRBCTL, ICH6_RBCTL_DMA_EN | ICH6_RBCTL_IRQ_EN); |
569 | spin_unlock_irq(&chip->reg_lock); | 574 | spin_unlock_irq(&chip->reg_lock); |
@@ -1136,8 +1141,11 @@ static irqreturn_t azx_interrupt(int irq, void *dev_id) | |||
1136 | /* clear rirb int */ | 1141 | /* clear rirb int */ |
1137 | status = azx_readb(chip, RIRBSTS); | 1142 | status = azx_readb(chip, RIRBSTS); |
1138 | if (status & RIRB_INT_MASK) { | 1143 | if (status & RIRB_INT_MASK) { |
1139 | if (status & RIRB_INT_RESPONSE) | 1144 | if (status & RIRB_INT_RESPONSE) { |
1145 | if (chip->driver_type == AZX_DRIVER_CTX) | ||
1146 | udelay(80); | ||
1140 | azx_update_rirb(chip); | 1147 | azx_update_rirb(chip); |
1148 | } | ||
1141 | azx_writeb(chip, RIRBSTS, RIRB_INT_MASK); | 1149 | azx_writeb(chip, RIRBSTS, RIRB_INT_MASK); |
1142 | } | 1150 | } |
1143 | 1151 | ||
@@ -2784,10 +2792,10 @@ static DEFINE_PCI_DEVICE_TABLE(azx_ids) = { | |||
2784 | { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), | 2792 | { PCI_DEVICE(PCI_VENDOR_ID_CREATIVE, PCI_ANY_ID), |
2785 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, | 2793 | .class = PCI_CLASS_MULTIMEDIA_HD_AUDIO << 8, |
2786 | .class_mask = 0xffffff, | 2794 | .class_mask = 0xffffff, |
2787 | .driver_data = AZX_DRIVER_GENERIC }, | 2795 | .driver_data = AZX_DRIVER_CTX }, |
2788 | #else | 2796 | #else |
2789 | /* this entry seems still valid -- i.e. without emu20kx chip */ | 2797 | /* this entry seems still valid -- i.e. without emu20kx chip */ |
2790 | { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_GENERIC }, | 2798 | { PCI_DEVICE(0x1102, 0x0009), .driver_data = AZX_DRIVER_CTX }, |
2791 | #endif | 2799 | #endif |
2792 | /* Vortex86MX */ | 2800 | /* Vortex86MX */ |
2793 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, | 2801 | { PCI_DEVICE(0x17f3, 0x3010), .driver_data = AZX_DRIVER_GENERIC }, |