[PATCH] VIA IRQ quirk

Delete quirk_via_bridge(), restore quirk_via_irqpic() -- but now
improved to be invoked upon device ENABLE, and now only for VIA devices
-- not all devices behind VIA bridges.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Len Brown and committed by Linus Torvalds 25be5e6c 2efe86b8

+28 -26
-5
arch/i386/pci/irq.c
··· 1029 static int pirq_enable_irq(struct pci_dev *dev) 1030 { 1031 u8 pin; 1032 - extern int via_interrupt_line_quirk; 1033 struct pci_dev *temp_dev; 1034 1035 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); ··· 1083 printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", 1084 'A' + pin, pci_name(dev), msg); 1085 } 1086 - /* VIA bridges use interrupt line for apic/pci steering across 1087 - the V-Link */ 1088 - else if (via_interrupt_line_quirk) 1089 - pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq & 15); 1090 return 0; 1091 } 1092
··· 1029 static int pirq_enable_irq(struct pci_dev *dev) 1030 { 1031 u8 pin; 1032 struct pci_dev *temp_dev; 1033 1034 pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin); ··· 1084 printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n", 1085 'A' + pin, pci_name(dev), msg); 1086 } 1087 return 0; 1088 } 1089
-4
drivers/acpi/pci_irq.c
··· 391 u8 pin = 0; 392 int edge_level = ACPI_LEVEL_SENSITIVE; 393 int active_high_low = ACPI_ACTIVE_LOW; 394 - extern int via_interrupt_line_quirk; 395 char *link = NULL; 396 397 ACPI_FUNCTION_TRACE("acpi_pci_irq_enable"); ··· 442 return_VALUE(0); 443 } 444 } 445 - 446 - if (via_interrupt_line_quirk) 447 - pci_write_config_byte(dev, PCI_INTERRUPT_LINE, irq & 15); 448 449 dev->irq = acpi_register_gsi(irq, edge_level, active_high_low); 450
··· 391 u8 pin = 0; 392 int edge_level = ACPI_LEVEL_SENSITIVE; 393 int active_high_low = ACPI_ACTIVE_LOW; 394 char *link = NULL; 395 396 ACPI_FUNCTION_TRACE("acpi_pci_irq_enable"); ··· 443 return_VALUE(0); 444 } 445 } 446 447 dev->irq = acpi_register_gsi(irq, edge_level, active_high_low); 448
+24 -16
drivers/pci/quirks.c
··· 18 #include <linux/pci.h> 19 #include <linux/init.h> 20 #include <linux/delay.h> 21 #include "pci.h" 22 23 /* Deal with broken BIOS'es that neglect to enable passive release, ··· 468 * non-x86 architectures (yes Via exists on PPC among other places), 469 * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get 470 * interrupts delivered properly. 471 - * 472 - * TODO: When we have device-specific interrupt routers, 473 - * quirk_via_irqpic will go away from quirks. 474 */ 475 476 /* ··· 491 } 492 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi ); 493 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi ); 494 495 /* 496 * PIIX3 USB: We have to disable USB interrupts that are ··· 704 } 705 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb ); 706 707 - /* 708 - * VIA northbridges care about PCI_INTERRUPT_LINE 709 - */ 710 - int via_interrupt_line_quirk; 711 - 712 - static void __devinit quirk_via_bridge(struct pci_dev *pdev) 713 - { 714 - if(pdev->devfn == 0) { 715 - printk(KERN_INFO "PCI: Via IRQ fixup\n"); 716 - via_interrupt_line_quirk = 1; 717 - } 718 - } 719 - DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_bridge ); 720 721 /* 722 * Serverworks CSB5 IDE does not fully support native mode
··· 18 #include <linux/pci.h> 19 #include <linux/init.h> 20 #include <linux/delay.h> 21 + #include <linux/acpi.h> 22 #include "pci.h" 23 24 /* Deal with broken BIOS'es that neglect to enable passive release, ··· 467 * non-x86 architectures (yes Via exists on PPC among other places), 468 * we must mask the PCI_INTERRUPT_LINE value versus 0xf to get 469 * interrupts delivered properly. 470 */ 471 472 /* ··· 493 } 494 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi ); 495 DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi ); 496 + 497 + static void __devinit quirk_via_irqpic(struct pci_dev *dev) 498 + { 499 + u8 irq, new_irq; 500 + 501 + #ifdef CONFIG_X86_IO_APIC 502 + if (nr_ioapics && !skip_ioapic_setup) 503 + return; 504 + #endif 505 + #ifdef CONFIG_ACPI 506 + if (acpi_irq_model != ACPI_IRQ_MODEL_PIC) 507 + return; 508 + #endif 509 + new_irq = dev->irq & 0xf; 510 + pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq); 511 + if (new_irq != irq) { 512 + printk(KERN_INFO "PCI: Via PIC IRQ fixup for %s, from %d to %d\n", 513 + pci_name(dev), irq, new_irq); 514 + udelay(15); /* unknown if delay really needed */ 515 + pci_write_config_byte(dev, PCI_INTERRUPT_LINE, new_irq); 516 + } 517 + } 518 + DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_irqpic); 519 520 /* 521 * PIIX3 USB: We have to disable USB interrupts that are ··· 683 } 684 DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb ); 685 686 687 /* 688 * Serverworks CSB5 IDE does not fully support native mode
+4 -1
include/linux/acpi.h
··· 25 #ifndef _LINUX_ACPI_H 26 #define _LINUX_ACPI_H 27 28 #ifndef _LINUX 29 #define _LINUX 30 #endif ··· 535 536 extern int pnpacpi_disabled; 537 538 - #endif /*_LINUX_ACPI_H*/
··· 25 #ifndef _LINUX_ACPI_H 26 #define _LINUX_ACPI_H 27 28 + #ifdef CONFIG_ACPI 29 + 30 #ifndef _LINUX 31 #define _LINUX 32 #endif ··· 533 534 extern int pnpacpi_disabled; 535 536 + #endif /* CONFIG_ACPI */ 537 + #endif /*_LINUX_ACPI_H*/