diff options
Diffstat (limited to 'drivers/bcma')
-rw-r--r-- | drivers/bcma/driver_mips.c | 84 |
1 files changed, 56 insertions, 28 deletions
diff --git a/drivers/bcma/driver_mips.c b/drivers/bcma/driver_mips.c index 792daad28cbc..171be0f541e0 100644 --- a/drivers/bcma/driver_mips.c +++ b/drivers/bcma/driver_mips.c | |||
@@ -147,6 +147,22 @@ static void bcma_core_mips_set_irq(struct bcma_device *dev, unsigned int irq) | |||
147 | dev->id.id, oldirq + 2, irq + 2); | 147 | dev->id.id, oldirq + 2, irq + 2); |
148 | } | 148 | } |
149 | 149 | ||
150 | static void bcma_core_mips_set_irq_name(struct bcma_bus *bus, unsigned int irq, | ||
151 | u16 coreid, u8 unit) | ||
152 | { | ||
153 | struct bcma_device *core; | ||
154 | |||
155 | core = bcma_find_core_unit(bus, coreid, unit); | ||
156 | if (!core) { | ||
157 | bcma_warn(bus, | ||
158 | "Can not find core (id: 0x%x, unit %i) for IRQ configuration.\n", | ||
159 | coreid, unit); | ||
160 | return; | ||
161 | } | ||
162 | |||
163 | bcma_core_mips_set_irq(core, irq); | ||
164 | } | ||
165 | |||
150 | static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq) | 166 | static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq) |
151 | { | 167 | { |
152 | int i; | 168 | int i; |
@@ -242,35 +258,47 @@ void bcma_core_mips_init(struct bcma_drv_mips *mcore) | |||
242 | 258 | ||
243 | mcore->assigned_irqs = 1; | 259 | mcore->assigned_irqs = 1; |
244 | 260 | ||
245 | /* Assign IRQs to all cores on the bus */ | 261 | switch (bus->chipinfo.id) { |
246 | list_for_each_entry(core, &bus->cores, list) { | 262 | case BCMA_CHIP_ID_BCM4716: |
247 | int mips_irq; | 263 | case BCMA_CHIP_ID_BCM4748: |
248 | if (core->irq) | 264 | bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0); |
249 | continue; | 265 | bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0); |
250 | 266 | bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0); | |
251 | mips_irq = bcma_core_mips_irq(core); | 267 | bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_PCIE, 0); |
252 | if (mips_irq > 4) | 268 | bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0); |
253 | core->irq = 0; | 269 | bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0); |
254 | else | 270 | break; |
255 | core->irq = mips_irq + 2; | 271 | case BCMA_CHIP_ID_BCM5356: |
256 | if (core->irq > 5) | 272 | case BCMA_CHIP_ID_BCM47162: |
257 | continue; | 273 | case BCMA_CHIP_ID_BCM53572: |
258 | switch (core->id.id) { | 274 | bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0); |
259 | case BCMA_CORE_PCI: | 275 | bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0); |
260 | case BCMA_CORE_PCIE: | 276 | bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0); |
261 | case BCMA_CORE_ETHERNET: | 277 | break; |
262 | case BCMA_CORE_ETHERNET_GBIT: | 278 | case BCMA_CHIP_ID_BCM5357: |
263 | case BCMA_CORE_MAC_GBIT: | 279 | case BCMA_CHIP_ID_BCM4749: |
264 | case BCMA_CORE_80211: | 280 | bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_80211, 0); |
265 | case BCMA_CORE_USB20_HOST: | 281 | bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_MAC_GBIT, 0); |
266 | /* These devices get their own IRQ line if available, | 282 | bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_USB20_HOST, 0); |
267 | * the rest goes on IRQ0 | 283 | bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_CHIPCOMMON, 0); |
268 | */ | 284 | bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_I2S, 0); |
269 | if (mcore->assigned_irqs <= 4) | 285 | break; |
270 | bcma_core_mips_set_irq(core, | 286 | case BCMA_CHIP_ID_BCM4706: |
271 | mcore->assigned_irqs++); | 287 | bcma_core_mips_set_irq_name(bus, 1, BCMA_CORE_PCIE, 0); |
272 | break; | 288 | bcma_core_mips_set_irq_name(bus, 2, BCMA_CORE_4706_MAC_GBIT, |
289 | 0); | ||
290 | bcma_core_mips_set_irq_name(bus, 3, BCMA_CORE_PCIE, 1); | ||
291 | bcma_core_mips_set_irq_name(bus, 4, BCMA_CORE_USB20_HOST, 0); | ||
292 | bcma_core_mips_set_irq_name(bus, 0, BCMA_CORE_4706_CHIPCOMMON, | ||
293 | 0); | ||
294 | break; | ||
295 | default: | ||
296 | list_for_each_entry(core, &bus->cores, list) { | ||
297 | core->irq = bcma_core_irq(core); | ||
273 | } | 298 | } |
299 | bcma_err(bus, | ||
300 | "Unknown device (0x%x) found, can not configure IRQs\n", | ||
301 | bus->chipinfo.id); | ||
274 | } | 302 | } |
275 | bcma_info(bus, "IRQ reconfiguration done\n"); | 303 | bcma_info(bus, "IRQ reconfiguration done\n"); |
276 | bcma_core_mips_dump_irq(bus); | 304 | bcma_core_mips_dump_irq(bus); |