http://downloads.netgear.com/files/GPL/GPL_Source_V361j_DM111PSP_series_consumer_rele...
[bcm963xx.git] / kernel / linux / arch / arm / mach-iop3xx / iq80321-pci.c
1 /*
2  * arch/arm/mach-iop3xx/iq80321-pci.c
3  *
4  * PCI support for the Intel IQ80321 reference board
5  *
6  * Author: Rory Bolt <rorybolt@pacbell.net>
7  * Copyright (C) 2002 Rory Bolt
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2 as
11  * published by the Free Software Foundation.
12  */
13 #include <linux/kernel.h>
14 #include <linux/pci.h>
15 #include <linux/init.h>
16
17 #include <asm/hardware.h>
18 #include <asm/irq.h>
19 #include <asm/mach/pci.h>
20 #include <asm/mach-types.h>
21
22 /*
23  * The following macro is used to lookup irqs in a standard table
24  * format for those systems that do not already have PCI
25  * interrupts properly routed.  We assume 1 <= pin <= 4
26  */
27 #define PCI_IRQ_TABLE_LOOKUP(minid,maxid)       \
28 ({ int _ctl_ = -1;                              \
29    unsigned int _idsel = idsel - minid;         \
30    if (_idsel <= maxid)                         \
31       _ctl_ = pci_irq_table[_idsel][pin-1];     \
32    _ctl_; })
33
34 #define INTA    IRQ_IQ80321_INTA
35 #define INTB    IRQ_IQ80321_INTB
36 #define INTC    IRQ_IQ80321_INTC
37 #define INTD    IRQ_IQ80321_INTD
38
39 #define INTE    IRQ_IQ80321_I82544
40
41 typedef u8 irq_table[4];
42
43 static irq_table pci_irq_table[] = {
44         /*
45          * PCI IDSEL/INTPIN->INTLINE
46          * A       B       C       D
47          */
48         {INTE, INTE, INTE, INTE}, /* Gig-E */
49         {INTD, INTC, INTD, INTA}, /* Unused */
50         {INTC, INTD, INTA, INTB}, /* PCI-X Slot */
51 };
52
53 static inline int __init
54 iq80321_map_irq(struct pci_dev *dev, u8 idsel, u8 pin)
55 {
56         BUG_ON(pin < 1 || pin > 4);
57
58         return PCI_IRQ_TABLE_LOOKUP(2, 3);
59 }
60
61 static int iq80321_setup(int nr, struct pci_sys_data *sys)
62 {
63         switch (nr) {
64         case 0:
65                 sys->map_irq = iq80321_map_irq;
66                 break;
67         default:
68                 return 0;
69         }
70
71         return iop321_setup(nr, sys);
72 }
73
74 static void iq80321_preinit(void)
75 {
76         iop321_init();
77 }
78
79 static struct hw_pci iq80321_pci __initdata = {
80         .swizzle        = pci_std_swizzle,
81         .nr_controllers = 1,
82         .setup          = iq80321_setup,
83         .scan           = iop321_scan_bus,
84         .preinit        = iq80321_preinit,
85 };
86
87 static int __init iq80321_pci_init(void)
88 {
89         if (machine_is_iq80321())
90                 pci_common_init(&iq80321_pci);
91         return 0;
92 }
93
94 subsys_initcall(iq80321_pci_init);
95
96
97
98