diff options
Diffstat (limited to 'drivers/acpi/pci_irq.c')
-rw-r--r-- | drivers/acpi/pci_irq.c | 56 |
1 files changed, 13 insertions, 43 deletions
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c index 643c4e864298..03d528e02c29 100644 --- a/drivers/acpi/pci_irq.c +++ b/drivers/acpi/pci_irq.c | |||
@@ -299,44 +299,6 @@ void acpi_pci_irq_del_prt(int segment, int bus) | |||
299 | /* -------------------------------------------------------------------------- | 299 | /* -------------------------------------------------------------------------- |
300 | PCI Interrupt Routing Support | 300 | PCI Interrupt Routing Support |
301 | -------------------------------------------------------------------------- */ | 301 | -------------------------------------------------------------------------- */ |
302 | static int | ||
303 | acpi_pci_allocate_irq(struct acpi_prt_entry *entry, | ||
304 | int *triggering, int *polarity, char **link) | ||
305 | { | ||
306 | int irq; | ||
307 | |||
308 | |||
309 | if (entry->link) { | ||
310 | irq = acpi_pci_link_allocate_irq(entry->link, entry->index, | ||
311 | triggering, polarity, link); | ||
312 | if (irq < 0) { | ||
313 | printk(KERN_WARNING PREFIX | ||
314 | "Invalid IRQ link routing entry\n"); | ||
315 | return -1; | ||
316 | } | ||
317 | } else { | ||
318 | irq = entry->index; | ||
319 | *triggering = ACPI_LEVEL_SENSITIVE; | ||
320 | *polarity = ACPI_ACTIVE_LOW; | ||
321 | } | ||
322 | |||
323 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found GSI %d\n", irq)); | ||
324 | return irq; | ||
325 | } | ||
326 | |||
327 | static int | ||
328 | acpi_pci_free_irq(struct acpi_prt_entry *entry) | ||
329 | { | ||
330 | int irq; | ||
331 | |||
332 | if (entry->link) { | ||
333 | irq = acpi_pci_link_free_irq(entry->link); | ||
334 | } else { | ||
335 | irq = entry->index; | ||
336 | } | ||
337 | return irq; | ||
338 | } | ||
339 | |||
340 | static struct acpi_prt_entry * | 302 | static struct acpi_prt_entry * |
341 | acpi_pci_irq_lookup(struct pci_dev *dev, int pin) | 303 | acpi_pci_irq_lookup(struct pci_dev *dev, int pin) |
342 | { | 304 | { |
@@ -426,10 +388,15 @@ int acpi_pci_irq_enable(struct pci_dev *dev) | |||
426 | return 0; | 388 | return 0; |
427 | } | 389 | } |
428 | 390 | ||
429 | if (entry) | 391 | if (entry) { |
430 | gsi = acpi_pci_allocate_irq(entry, &triggering, &polarity, | 392 | if (entry->link) |
431 | &link); | 393 | gsi = acpi_pci_link_allocate_irq(entry->link, |
432 | else | 394 | entry->index, |
395 | &triggering, &polarity, | ||
396 | &link); | ||
397 | else | ||
398 | gsi = entry->index; | ||
399 | } else | ||
433 | gsi = -1; | 400 | gsi = -1; |
434 | 401 | ||
435 | /* | 402 | /* |
@@ -491,7 +458,10 @@ void acpi_pci_irq_disable(struct pci_dev *dev) | |||
491 | if (!entry) | 458 | if (!entry) |
492 | return; | 459 | return; |
493 | 460 | ||
494 | gsi = acpi_pci_free_irq(entry); | 461 | if (entry->link) |
462 | gsi = acpi_pci_link_free_irq(entry->link); | ||
463 | else | ||
464 | gsi = entry->index; | ||
495 | 465 | ||
496 | /* | 466 | /* |
497 | * TBD: It might be worth clearing dev->irq by magic constant | 467 | * TBD: It might be worth clearing dev->irq by magic constant |