diff options
Diffstat (limited to 'arch/mips/alchemy/mtx-1/platform.c')
-rw-r--r-- | arch/mips/alchemy/mtx-1/platform.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/arch/mips/alchemy/mtx-1/platform.c b/arch/mips/alchemy/mtx-1/platform.c index 55628e390fd7..cc47b6868ca3 100644 --- a/arch/mips/alchemy/mtx-1/platform.c +++ b/arch/mips/alchemy/mtx-1/platform.c | |||
@@ -135,7 +135,69 @@ static struct platform_device mtx1_mtd = { | |||
135 | .resource = &mtx1_mtd_resource, | 135 | .resource = &mtx1_mtd_resource, |
136 | }; | 136 | }; |
137 | 137 | ||
138 | static struct resource alchemy_pci_host_res[] = { | ||
139 | [0] = { | ||
140 | .start = AU1500_PCI_PHYS_ADDR, | ||
141 | .end = AU1500_PCI_PHYS_ADDR + 0xfff, | ||
142 | .flags = IORESOURCE_MEM, | ||
143 | }, | ||
144 | }; | ||
145 | |||
146 | static int mtx1_pci_idsel(unsigned int devsel, int assert) | ||
147 | { | ||
148 | /* This function is only necessary to support a proprietary Cardbus | ||
149 | * adapter on the mtx-1 "singleboard" variant. It triggers a custom | ||
150 | * logic chip connected to EXT_IO3 (GPIO1) to suppress IDSEL signals. | ||
151 | */ | ||
152 | if (assert && devsel != 0) | ||
153 | /* Suppress signal to Cardbus */ | ||
154 | alchemy_gpio_set_value(1, 0); /* set EXT_IO3 OFF */ | ||
155 | else | ||
156 | alchemy_gpio_set_value(1, 1); /* set EXT_IO3 ON */ | ||
157 | |||
158 | udelay(1); | ||
159 | return 1; | ||
160 | } | ||
161 | |||
162 | static const char mtx1_irqtab[][5] = { | ||
163 | [0] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 00 - AdapterA-Slot0 (top) */ | ||
164 | [1] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 01 - AdapterA-Slot1 (bottom) */ | ||
165 | [2] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 02 - AdapterB-Slot0 (top) */ | ||
166 | [3] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 03 - AdapterB-Slot1 (bottom) */ | ||
167 | [4] = { -1, AU1500_PCI_INTA, AU1500_PCI_INTB, 0xff, 0xff }, /* IDSEL 04 - AdapterC-Slot0 (top) */ | ||
168 | [5] = { -1, AU1500_PCI_INTB, AU1500_PCI_INTA, 0xff, 0xff }, /* IDSEL 05 - AdapterC-Slot1 (bottom) */ | ||
169 | [6] = { -1, AU1500_PCI_INTC, AU1500_PCI_INTD, 0xff, 0xff }, /* IDSEL 06 - AdapterD-Slot0 (top) */ | ||
170 | [7] = { -1, AU1500_PCI_INTD, AU1500_PCI_INTC, 0xff, 0xff }, /* IDSEL 07 - AdapterD-Slot1 (bottom) */ | ||
171 | }; | ||
172 | |||
173 | static int mtx1_map_pci_irq(const struct pci_dev *d, u8 slot, u8 pin) | ||
174 | { | ||
175 | return mtx1_irqtab[slot][pin]; | ||
176 | } | ||
177 | |||
178 | static struct alchemy_pci_platdata mtx1_pci_pd = { | ||
179 | .board_map_irq = mtx1_map_pci_irq, | ||
180 | .board_pci_idsel = mtx1_pci_idsel, | ||
181 | .pci_cfg_set = PCI_CONFIG_AEN | PCI_CONFIG_R2H | PCI_CONFIG_R1H | | ||
182 | PCI_CONFIG_CH | | ||
183 | #if defined(__MIPSEB__) | ||
184 | PCI_CONFIG_SIC_HWA_DAT | PCI_CONFIG_SM, | ||
185 | #else | ||
186 | 0, | ||
187 | #endif | ||
188 | }; | ||
189 | |||
190 | static struct platform_device mtx1_pci_host = { | ||
191 | .dev.platform_data = &mtx1_pci_pd, | ||
192 | .name = "alchemy-pci", | ||
193 | .id = 0, | ||
194 | .num_resources = ARRAY_SIZE(alchemy_pci_host_res), | ||
195 | .resource = alchemy_pci_host_res, | ||
196 | }; | ||
197 | |||
198 | |||
138 | static struct __initdata platform_device * mtx1_devs[] = { | 199 | static struct __initdata platform_device * mtx1_devs[] = { |
200 | &mtx1_pci_host, | ||
139 | &mtx1_gpio_leds, | 201 | &mtx1_gpio_leds, |
140 | &mtx1_wdt, | 202 | &mtx1_wdt, |
141 | &mtx1_button, | 203 | &mtx1_button, |