Commit | Line | Data |
---|---|---|
6f95e60a MSJ |
1 | /* |
2 | * PMC-Sierra MSP board specific pci fixups. | |
3 | * | |
4 | * Copyright 2001 MontaVista Software Inc. | |
5 | * Copyright 2005-2007 PMC-Sierra, Inc | |
6 | * | |
7 | * Author: MontaVista Software, Inc. | |
8 | * ppopov@mvista.com or source@mvista.com | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify it | |
11 | * under the terms of the GNU General Public License as published by the | |
12 | * Free Software Foundation; either version 2 of the License, or (at your | |
13 | * option) any later version. | |
14 | * | |
15 | * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
16 | * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
17 | * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN | |
18 | * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
19 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
20 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |
21 | * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | |
22 | * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
23 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
24 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
25 | * | |
26 | * You should have received a copy of the GNU General Public License along | |
27 | * with this program; if not, write to the Free Software Foundation, Inc., | |
28 | * 675 Mass Ave, Cambridge, MA 02139, USA. | |
29 | */ | |
30 | ||
31 | #ifdef CONFIG_PCI | |
32 | ||
33 | #include <linux/types.h> | |
34 | #include <linux/pci.h> | |
35 | #include <linux/kernel.h> | |
36 | #include <linux/init.h> | |
37 | ||
38 | #include <asm/byteorder.h> | |
39 | ||
40 | #include <msp_pci.h> | |
41 | #include <msp_cic_int.h> | |
42 | ||
43 | /* PCI interrupt pins */ | |
44 | #define IRQ4 MSP_INT_EXT4 | |
45 | #define IRQ5 MSP_INT_EXT5 | |
46 | #define IRQ6 MSP_INT_EXT6 | |
47 | ||
48 | #if defined(CONFIG_PMC_MSP7120_GW) | |
49 | /* Garibaldi Board IRQ wiring to PCI slots */ | |
50 | static char irq_tab[][5] __initdata = { | |
51 | /* INTA INTB INTC INTD */ | |
52 | {0, 0, 0, 0, 0 }, /* (AD[0]): Unused */ | |
53 | {0, 0, 0, 0, 0 }, /* (AD[1]): Unused */ | |
54 | {0, 0, 0, 0, 0 }, /* (AD[2]): Unused */ | |
55 | {0, 0, 0, 0, 0 }, /* (AD[3]): Unused */ | |
56 | {0, 0, 0, 0, 0 }, /* (AD[4]): Unused */ | |
57 | {0, 0, 0, 0, 0 }, /* (AD[5]): Unused */ | |
58 | {0, 0, 0, 0, 0 }, /* (AD[6]): Unused */ | |
59 | {0, 0, 0, 0, 0 }, /* (AD[7]): Unused */ | |
60 | {0, 0, 0, 0, 0 }, /* (AD[8]): Unused */ | |
61 | {0, 0, 0, 0, 0 }, /* (AD[9]): Unused */ | |
62 | {0, 0, 0, 0, 0 }, /* 0 (AD[10]): Unused */ | |
63 | {0, 0, 0, 0, 0 }, /* 1 (AD[11]): Unused */ | |
64 | {0, 0, 0, 0, 0 }, /* 2 (AD[12]): Unused */ | |
65 | {0, 0, 0, 0, 0 }, /* 3 (AD[13]): Unused */ | |
66 | {0, 0, 0, 0, 0 }, /* 4 (AD[14]): Unused */ | |
67 | {0, 0, 0, 0, 0 }, /* 5 (AD[15]): Unused */ | |
68 | {0, 0, 0, 0, 0 }, /* 6 (AD[16]): Unused */ | |
69 | {0, 0, 0, 0, 0 }, /* 7 (AD[17]): Unused */ | |
70 | {0, 0, 0, 0, 0 }, /* 8 (AD[18]): Unused */ | |
71 | {0, 0, 0, 0, 0 }, /* 9 (AD[19]): Unused */ | |
72 | {0, 0, 0, 0, 0 }, /* 10 (AD[20]): Unused */ | |
73 | {0, 0, 0, 0, 0 }, /* 11 (AD[21]): Unused */ | |
74 | {0, 0, 0, 0, 0 }, /* 12 (AD[22]): Unused */ | |
75 | {0, 0, 0, 0, 0 }, /* 13 (AD[23]): Unused */ | |
76 | {0, 0, 0, 0, 0 }, /* 14 (AD[24]): Unused */ | |
77 | {0, 0, 0, 0, 0 }, /* 15 (AD[25]): Unused */ | |
78 | {0, 0, 0, 0, 0 }, /* 16 (AD[26]): Unused */ | |
79 | {0, 0, 0, 0, 0 }, /* 17 (AD[27]): Unused */ | |
80 | {0, IRQ4, IRQ4, 0, 0 }, /* 18 (AD[28]): slot 0 */ | |
81 | {0, 0, 0, 0, 0 }, /* 19 (AD[29]): Unused */ | |
82 | {0, IRQ5, IRQ5, 0, 0 }, /* 20 (AD[30]): slot 1 */ | |
83 | {0, IRQ6, IRQ6, 0, 0 } /* 21 (AD[31]): slot 2 */ | |
84 | }; | |
85 | ||
86 | #elif defined(CONFIG_PMC_MSP7120_EVAL) | |
87 | ||
88 | /* MSP7120 Eval Board IRQ wiring to PCI slots */ | |
89 | static char irq_tab[][5] __initdata = { | |
90 | /* INTA INTB INTC INTD */ | |
91 | {0, 0, 0, 0, 0 }, /* (AD[0]): Unused */ | |
92 | {0, 0, 0, 0, 0 }, /* (AD[1]): Unused */ | |
93 | {0, 0, 0, 0, 0 }, /* (AD[2]): Unused */ | |
94 | {0, 0, 0, 0, 0 }, /* (AD[3]): Unused */ | |
95 | {0, 0, 0, 0, 0 }, /* (AD[4]): Unused */ | |
96 | {0, 0, 0, 0, 0 }, /* (AD[5]): Unused */ | |
97 | {0, 0, 0, 0, 0 }, /* (AD[6]): Unused */ | |
98 | {0, 0, 0, 0, 0 }, /* (AD[7]): Unused */ | |
99 | {0, 0, 0, 0, 0 }, /* (AD[8]): Unused */ | |
100 | {0, 0, 0, 0, 0 }, /* (AD[9]): Unused */ | |
101 | {0, 0, 0, 0, 0 }, /* 0 (AD[10]): Unused */ | |
102 | {0, 0, 0, 0, 0 }, /* 1 (AD[11]): Unused */ | |
103 | {0, 0, 0, 0, 0 }, /* 2 (AD[12]): Unused */ | |
104 | {0, 0, 0, 0, 0 }, /* 3 (AD[13]): Unused */ | |
105 | {0, 0, 0, 0, 0 }, /* 4 (AD[14]): Unused */ | |
106 | {0, 0, 0, 0, 0 }, /* 5 (AD[15]): Unused */ | |
107 | {0, IRQ6, IRQ6, 0, 0 }, /* 6 (AD[16]): slot 3 (mini) */ | |
108 | {0, IRQ5, IRQ5, 0, 0 }, /* 7 (AD[17]): slot 2 (mini) */ | |
109 | {0, IRQ4, IRQ4, IRQ4, IRQ4}, /* 8 (AD[18]): slot 0 (PCI) */ | |
110 | {0, IRQ5, IRQ5, IRQ5, IRQ5}, /* 9 (AD[19]): slot 1 (PCI) */ | |
111 | {0, 0, 0, 0, 0 }, /* 10 (AD[20]): Unused */ | |
112 | {0, 0, 0, 0, 0 }, /* 11 (AD[21]): Unused */ | |
113 | {0, 0, 0, 0, 0 }, /* 12 (AD[22]): Unused */ | |
114 | {0, 0, 0, 0, 0 }, /* 13 (AD[23]): Unused */ | |
115 | {0, 0, 0, 0, 0 }, /* 14 (AD[24]): Unused */ | |
116 | {0, 0, 0, 0, 0 }, /* 15 (AD[25]): Unused */ | |
117 | {0, 0, 0, 0, 0 }, /* 16 (AD[26]): Unused */ | |
118 | {0, 0, 0, 0, 0 }, /* 17 (AD[27]): Unused */ | |
119 | {0, 0, 0, 0, 0 }, /* 18 (AD[28]): Unused */ | |
120 | {0, 0, 0, 0, 0 }, /* 19 (AD[29]): Unused */ | |
121 | {0, 0, 0, 0, 0 }, /* 20 (AD[30]): Unused */ | |
122 | {0, 0, 0, 0, 0 } /* 21 (AD[31]): Unused */ | |
123 | }; | |
124 | ||
125 | #else | |
126 | ||
127 | /* Unknown board -- don't assign any IRQs */ | |
128 | static char irq_tab[][5] __initdata = { | |
129 | /* INTA INTB INTC INTD */ | |
130 | {0, 0, 0, 0, 0 }, /* (AD[0]): Unused */ | |
131 | {0, 0, 0, 0, 0 }, /* (AD[1]): Unused */ | |
132 | {0, 0, 0, 0, 0 }, /* (AD[2]): Unused */ | |
133 | {0, 0, 0, 0, 0 }, /* (AD[3]): Unused */ | |
134 | {0, 0, 0, 0, 0 }, /* (AD[4]): Unused */ | |
135 | {0, 0, 0, 0, 0 }, /* (AD[5]): Unused */ | |
136 | {0, 0, 0, 0, 0 }, /* (AD[6]): Unused */ | |
137 | {0, 0, 0, 0, 0 }, /* (AD[7]): Unused */ | |
138 | {0, 0, 0, 0, 0 }, /* (AD[8]): Unused */ | |
139 | {0, 0, 0, 0, 0 }, /* (AD[9]): Unused */ | |
140 | {0, 0, 0, 0, 0 }, /* 0 (AD[10]): Unused */ | |
141 | {0, 0, 0, 0, 0 }, /* 1 (AD[11]): Unused */ | |
142 | {0, 0, 0, 0, 0 }, /* 2 (AD[12]): Unused */ | |
143 | {0, 0, 0, 0, 0 }, /* 3 (AD[13]): Unused */ | |
144 | {0, 0, 0, 0, 0 }, /* 4 (AD[14]): Unused */ | |
145 | {0, 0, 0, 0, 0 }, /* 5 (AD[15]): Unused */ | |
146 | {0, 0, 0, 0, 0 }, /* 6 (AD[16]): Unused */ | |
147 | {0, 0, 0, 0, 0 }, /* 7 (AD[17]): Unused */ | |
148 | {0, 0, 0, 0, 0 }, /* 8 (AD[18]): Unused */ | |
149 | {0, 0, 0, 0, 0 }, /* 9 (AD[19]): Unused */ | |
150 | {0, 0, 0, 0, 0 }, /* 10 (AD[20]): Unused */ | |
151 | {0, 0, 0, 0, 0 }, /* 11 (AD[21]): Unused */ | |
152 | {0, 0, 0, 0, 0 }, /* 12 (AD[22]): Unused */ | |
153 | {0, 0, 0, 0, 0 }, /* 13 (AD[23]): Unused */ | |
154 | {0, 0, 0, 0, 0 }, /* 14 (AD[24]): Unused */ | |
155 | {0, 0, 0, 0, 0 }, /* 15 (AD[25]): Unused */ | |
156 | {0, 0, 0, 0, 0 }, /* 16 (AD[26]): Unused */ | |
157 | {0, 0, 0, 0, 0 }, /* 17 (AD[27]): Unused */ | |
158 | {0, 0, 0, 0, 0 }, /* 18 (AD[28]): Unused */ | |
159 | {0, 0, 0, 0, 0 }, /* 19 (AD[29]): Unused */ | |
160 | {0, 0, 0, 0, 0 }, /* 20 (AD[30]): Unused */ | |
161 | {0, 0, 0, 0, 0 } /* 21 (AD[31]): Unused */ | |
162 | }; | |
163 | #endif | |
164 | ||
165 | /***************************************************************************** | |
166 | * | |
167 | * FUNCTION: pcibios_plat_dev_init | |
168 | * _________________________________________________________________________ | |
169 | * | |
170 | * DESCRIPTION: Perform platform specific device initialization at | |
171 | * pci_enable_device() time. | |
172 | * None are needed for the MSP7120 PCI Controller. | |
173 | * | |
174 | * INPUTS: dev - structure describing the PCI device | |
175 | * | |
176 | * OUTPUTS: none | |
177 | * | |
178 | * RETURNS: PCIBIOS_SUCCESSFUL | |
179 | * | |
180 | ****************************************************************************/ | |
181 | int pcibios_plat_dev_init(struct pci_dev *dev) | |
182 | { | |
183 | return PCIBIOS_SUCCESSFUL; | |
184 | } | |
185 | ||
186 | /***************************************************************************** | |
187 | * | |
188 | * FUNCTION: pcibios_map_irq | |
189 | * _________________________________________________________________________ | |
190 | * | |
191 | * DESCRIPTION: Perform board supplied PCI IRQ mapping routine. | |
192 | * | |
193 | * INPUTS: dev - unused | |
194 | * slot - PCI slot. Identified by which bit of the AD[] bus | |
195 | * drives the IDSEL line. AD[10] is 0, AD[31] is | |
196 | * slot 21. | |
197 | * pin - numbered using the scheme of the PCI_INTERRUPT_PIN | |
198 | * field of the config header. | |
199 | * | |
200 | * OUTPUTS: none | |
201 | * | |
202 | * RETURNS: IRQ number | |
203 | * | |
204 | ****************************************************************************/ | |
205 | int __init pcibios_map_irq(struct pci_dev *dev, u8 slot, u8 pin) | |
206 | { | |
207 | #if !defined(CONFIG_PMC_MSP7120_GW) && !defined(CONFIG_PMC_MSP7120_EVAL) | |
208 | printk(KERN_WARNING "PCI: unknown board, no PCI IRQs assigned.\n"); | |
209 | #endif | |
210 | printk(KERN_WARNING "PCI: irq_tab returned %d for slot=%d pin=%d\n", | |
211 | irq_tab[slot][pin], slot, pin); | |
212 | ||
213 | return irq_tab[slot][pin]; | |
214 | } | |
215 | ||
216 | #endif /* CONFIG_PCI */ |