|
@@ -18,6 +18,7 @@
|
|
|
#include <linux/pci.h>
|
|
|
#include <linux/init.h>
|
|
|
#include <linux/delay.h>
|
|
|
+#include <linux/acpi.h>
|
|
|
#include "pci.h"
|
|
|
|
|
|
/* Deal with broken BIOS'es that neglect to enable passive release,
|
|
@@ -467,9 +468,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC,
|
|
|
* non-x86 architectures (yes Via exists on PPC among other places),
|
|
|
* we must mask the PCI_INTERRUPT_LINE value versus 0xf to get
|
|
|
* interrupts delivered properly.
|
|
|
- *
|
|
|
- * TODO: When we have device-specific interrupt routers,
|
|
|
- * quirk_via_irqpic will go away from quirks.
|
|
|
*/
|
|
|
|
|
|
/*
|
|
@@ -494,6 +492,29 @@ static void __devinit quirk_via_acpi(struct pci_dev *d)
|
|
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi );
|
|
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi );
|
|
|
|
|
|
+static void __devinit quirk_via_irqpic(struct pci_dev *dev)
|
|
|
+{
|
|
|
+ u8 irq, new_irq;
|
|
|
+
|
|
|
+#ifdef CONFIG_X86_IO_APIC
|
|
|
+ if (nr_ioapics && !skip_ioapic_setup)
|
|
|
+ return;
|
|
|
+#endif
|
|
|
+#ifdef CONFIG_ACPI
|
|
|
+ if (acpi_irq_model != ACPI_IRQ_MODEL_PIC)
|
|
|
+ return;
|
|
|
+#endif
|
|
|
+ new_irq = dev->irq & 0xf;
|
|
|
+ pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
|
|
|
+ if (new_irq != irq) {
|
|
|
+ printk(KERN_INFO "PCI: Via PIC IRQ fixup for %s, from %d to %d\n",
|
|
|
+ pci_name(dev), irq, new_irq);
|
|
|
+ udelay(15); /* unknown if delay really needed */
|
|
|
+ pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq);
|
|
|
+ }
|
|
|
+}
|
|
|
+DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irqpic);
|
|
|
+
|
|
|
/*
|
|
|
* PIIX3 USB: We have to disable USB interrupts that are
|
|
|
* hardwired to PIRQD# and may be shared with an
|
|
@@ -683,19 +704,6 @@ static void __init quirk_disable_pxb(struct pci_dev *pdev)
|
|
|
}
|
|
|
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb );
|
|
|
|
|
|
-/*
|
|
|
- * VIA northbridges care about PCI_INTERRUPT_LINE
|
|
|
- */
|
|
|
-int via_interrupt_line_quirk;
|
|
|
-
|
|
|
-static void __devinit quirk_via_bridge(struct pci_dev *pdev)
|
|
|
-{
|
|
|
- if(pdev->devfn == 0) {
|
|
|
- printk(KERN_INFO "PCI: Via IRQ fixup\n");
|
|
|
- via_interrupt_line_quirk = 1;
|
|
|
- }
|
|
|
-}
|
|
|
-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_bridge );
|
|
|
|
|
|
/*
|
|
|
* Serverworks CSB5 IDE does not fully support native mode
|