Path: blob/master/arch/arm/mach-footbridge/personal-pci.c
10817 views
/*1* linux/arch/arm/mach-footbridge/personal-pci.c2*3* PCI bios-type initialisation for PCI machines4*5* Bits taken from various places.6*/7#include <linux/kernel.h>8#include <linux/pci.h>9#include <linux/init.h>1011#include <asm/irq.h>12#include <asm/mach/pci.h>13#include <asm/mach-types.h>1415static int irqmap_personal_server[] __initdata = {16IRQ_IN0, IRQ_IN1, IRQ_IN2, IRQ_IN3, 0, 0, 0,17IRQ_DOORBELLHOST, IRQ_DMA1, IRQ_DMA2, IRQ_PCI18};1920static int __init personal_server_map_irq(struct pci_dev *dev, u8 slot, u8 pin)21{22unsigned char line;2324pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &line);2526if (line > 0x40 && line <= 0x5f) {27/* line corresponds to the bit controlling this interrupt28* in the footbridge. Ignore the first 8 interrupt bits,29* look up the rest in the map. IN0 is bit number 830*/31return irqmap_personal_server[(line & 0x1f) - 8];32} else if (line == 0) {33/* no interrupt */34return 0;35} else36return irqmap_personal_server[(line - 1) & 3];37}3839static struct hw_pci personal_server_pci __initdata = {40.map_irq = personal_server_map_irq,41.nr_controllers = 1,42.setup = dc21285_setup,43.scan = dc21285_scan_bus,44.preinit = dc21285_preinit,45.postinit = dc21285_postinit,46};4748static int __init personal_pci_init(void)49{50if (machine_is_personal_server())51pci_common_init(&personal_server_pci);52return 0;53}5455subsys_initcall(personal_pci_init);565758