11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * linux/arch/arm/mach-footbridge/netwinder-pci.c
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * PCI bios-type initialisation for PCI machines
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Bits taken from various places.
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/pci.h>
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/init.h>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/irq.h>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach/pci.h>
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/mach-types.h>
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We now use the slot ID instead of the device identifiers to select
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * which interrupt is routed where.
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
20d5341942d784134f2997b3ff82cd63cf71d1f932Ralf Baechlestatic int __init netwinder_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	switch (slot) {
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 0:  /* host bridge */
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 9:  /* CyberPro */
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return IRQ_NETWINDER_VGA;
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 10: /* DC21143 */
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return IRQ_NETWINDER_ETHER100;
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 12: /* Winbond 553 */
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return IRQ_ISA_HARDDISK1;
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	case 13: /* Winbond 89C940F */
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return IRQ_NETWINDER_ETHER10;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	default:
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		printk(KERN_ERR "PCI: unknown device in slot %s\n",
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds			pci_name(dev));
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return 0;
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic struct hw_pci netwinder_pci __initdata = {
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.map_irq		= netwinder_map_irq,
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.nr_controllers		= 1,
48c23bfc3835173f5229b2503e3b616001a28affadRussell King	.ops			= &dc21285_ops,
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.setup			= dc21285_setup,
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.preinit		= dc21285_preinit,
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	.postinit		= dc21285_postinit,
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds};
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic int __init netwinder_pci_init(void)
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (machine_is_netwinder())
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		pci_common_init(&netwinder_pci);
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return 0;
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldssubsys_initcall(netwinder_pci_init);
62