aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/i386/kernel/acpi/boot.c6
-rw-r--r--arch/ia64/kernel/acpi.c6
-rw-r--r--arch/ia64/kernel/iosapic.c24
-rw-r--r--drivers/acpi/Kconfig8
-rw-r--r--drivers/acpi/pci_irq.c9
-rw-r--r--drivers/acpi/pci_link.c3
-rw-r--r--drivers/acpi/video.c7
-rw-r--r--drivers/char/hpet.c8
-rw-r--r--drivers/pnp/pnpacpi/rsparser.c2
-rw-r--r--drivers/serial/8250_acpi.c20
-rw-r--r--include/asm-ia64/acpi-ext.h1
-rw-r--r--include/linux/acpi.h24
12 files changed, 81 insertions, 37 deletions
diff --git a/arch/i386/kernel/acpi/boot.c b/arch/i386/kernel/acpi/boot.c
index b7808a89d945..55c0fbd68956 100644
--- a/arch/i386/kernel/acpi/boot.c
+++ b/arch/i386/kernel/acpi/boot.c
@@ -484,7 +484,11 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
484 return 0; 484 return 0;
485} 485}
486 486
487unsigned int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low) 487/*
488 * success: return IRQ number (>=0)
489 * failure: return < 0
490 */
491int acpi_register_gsi(u32 gsi, int edge_level, int active_high_low)
488{ 492{
489 unsigned int irq; 493 unsigned int irq;
490 unsigned int plat_gsi = gsi; 494 unsigned int plat_gsi = gsi;
diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
index 9609f243e5d0..d362ecf5381b 100644
--- a/arch/ia64/kernel/acpi.c
+++ b/arch/ia64/kernel/acpi.c
@@ -563,7 +563,11 @@ acpi_numa_arch_fixup (void)
563} 563}
564#endif /* CONFIG_ACPI_NUMA */ 564#endif /* CONFIG_ACPI_NUMA */
565 565
566unsigned int 566/*
567 * success: return IRQ number (>=0)
568 * failure: return < 0
569 */
570int
567acpi_register_gsi (u32 gsi, int edge_level, int active_high_low) 571acpi_register_gsi (u32 gsi, int edge_level, int active_high_low)
568{ 572{
569 if (has_8259 && gsi < 16) 573 if (has_8259 && gsi < 16)
diff --git a/arch/ia64/kernel/iosapic.c b/arch/ia64/kernel/iosapic.c
index 7936b62f7a2e..8f53915f4ae6 100644
--- a/arch/ia64/kernel/iosapic.c
+++ b/arch/ia64/kernel/iosapic.c
@@ -561,7 +561,7 @@ static inline int vector_is_shared (int vector)
561 return (iosapic_intr_info[vector].count > 1); 561 return (iosapic_intr_info[vector].count > 1);
562} 562}
563 563
564static void 564static int
565register_intr (unsigned int gsi, int vector, unsigned char delivery, 565register_intr (unsigned int gsi, int vector, unsigned char delivery,
566 unsigned long polarity, unsigned long trigger) 566 unsigned long polarity, unsigned long trigger)
567{ 567{
@@ -576,7 +576,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
576 index = find_iosapic(gsi); 576 index = find_iosapic(gsi);
577 if (index < 0) { 577 if (index < 0) {
578 printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", __FUNCTION__, gsi); 578 printk(KERN_WARNING "%s: No IOSAPIC for GSI %u\n", __FUNCTION__, gsi);
579 return; 579 return -ENODEV;
580 } 580 }
581 581
582 iosapic_address = iosapic_lists[index].addr; 582 iosapic_address = iosapic_lists[index].addr;
@@ -587,7 +587,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
587 rte = iosapic_alloc_rte(); 587 rte = iosapic_alloc_rte();
588 if (!rte) { 588 if (!rte) {
589 printk(KERN_WARNING "%s: cannot allocate memory\n", __FUNCTION__); 589 printk(KERN_WARNING "%s: cannot allocate memory\n", __FUNCTION__);
590 return; 590 return -ENOMEM;
591 } 591 }
592 592
593 rte_index = gsi - gsi_base; 593 rte_index = gsi - gsi_base;
@@ -603,7 +603,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
603 struct iosapic_intr_info *info = &iosapic_intr_info[vector]; 603 struct iosapic_intr_info *info = &iosapic_intr_info[vector];
604 if (info->trigger != trigger || info->polarity != polarity) { 604 if (info->trigger != trigger || info->polarity != polarity) {
605 printk (KERN_WARNING "%s: cannot override the interrupt\n", __FUNCTION__); 605 printk (KERN_WARNING "%s: cannot override the interrupt\n", __FUNCTION__);
606 return; 606 return -EINVAL;
607 } 607 }
608 } 608 }
609 609
@@ -623,6 +623,7 @@ register_intr (unsigned int gsi, int vector, unsigned char delivery,
623 __FUNCTION__, vector, idesc->handler->typename, irq_type->typename); 623 __FUNCTION__, vector, idesc->handler->typename, irq_type->typename);
624 idesc->handler = irq_type; 624 idesc->handler = irq_type;
625 } 625 }
626 return 0;
626} 627}
627 628
628static unsigned int 629static unsigned int
@@ -710,7 +711,7 @@ int
710iosapic_register_intr (unsigned int gsi, 711iosapic_register_intr (unsigned int gsi,
711 unsigned long polarity, unsigned long trigger) 712 unsigned long polarity, unsigned long trigger)
712{ 713{
713 int vector, mask = 1; 714 int vector, mask = 1, err;
714 unsigned int dest; 715 unsigned int dest;
715 unsigned long flags; 716 unsigned long flags;
716 struct iosapic_rte_info *rte; 717 struct iosapic_rte_info *rte;
@@ -734,11 +735,11 @@ again:
734 spin_unlock_irqrestore(&iosapic_lock, flags); 735 spin_unlock_irqrestore(&iosapic_lock, flags);
735 736
736 /* If vector is running out, we try to find a sharable vector */ 737 /* If vector is running out, we try to find a sharable vector */
737 vector = assign_irq_vector(AUTO_ASSIGN); 738 vector = assign_irq_vector_nopanic(AUTO_ASSIGN);
738 if (vector < 0) { 739 if (vector < 0) {
739 vector = iosapic_find_sharable_vector(trigger, polarity); 740 vector = iosapic_find_sharable_vector(trigger, polarity);
740 if (vector < 0) 741 if (vector < 0)
741 panic("%s: out of interrupt vectors!\n", __FUNCTION__); 742 Return -ENOSPC;
742 } 743 }
743 744
744 spin_lock_irqsave(&irq_descp(vector)->lock, flags); 745 spin_lock_irqsave(&irq_descp(vector)->lock, flags);
@@ -753,8 +754,13 @@ again:
753 } 754 }
754 755
755 dest = get_target_cpu(gsi, vector); 756 dest = get_target_cpu(gsi, vector);
756 register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY, 757 err = register_intr(gsi, vector, IOSAPIC_LOWEST_PRIORITY,
757 polarity, trigger); 758 polarity, trigger);
759 if (err < 0) {
760 spin_unlock(&iosapic_lock);
761 spin_unlock_irqrestore(&irq_descp(vector)->lock, flags);
762 return err;
763 }
758 764
759 /* 765 /*
760 * If the vector is shared and already unmasked for 766 * If the vector is shared and already unmasked for
diff --git a/drivers/acpi/Kconfig b/drivers/acpi/Kconfig
index ba13896cae40..66c60982ba46 100644
--- a/drivers/acpi/Kconfig
+++ b/drivers/acpi/Kconfig
@@ -154,12 +154,10 @@ config ACPI_PROCESSOR
154 support it. 154 support it.
155 155
156config ACPI_HOTPLUG_CPU 156config ACPI_HOTPLUG_CPU
157 bool "Processor Hotplug (EXPERIMENTAL)" 157 bool
158 depends on ACPI_PROCESSOR && HOTPLUG_CPU && EXPERIMENTAL 158 depends on ACPI_PROCESSOR && HOTPLUG_CPU
159 select ACPI_CONTAINER 159 select ACPI_CONTAINER
160 default n 160 default y
161 ---help---
162 Select this option if your platform support physical CPU hotplug.
163 161
164config ACPI_THERMAL 162config ACPI_THERMAL
165 tristate "Thermal Zone" 163 tristate "Thermal Zone"
diff --git a/drivers/acpi/pci_irq.c b/drivers/acpi/pci_irq.c
index bb973d2109a1..c885300579ec 100644
--- a/drivers/acpi/pci_irq.c
+++ b/drivers/acpi/pci_irq.c
@@ -424,6 +424,7 @@ acpi_pci_irq_enable (
424 int edge_level = ACPI_LEVEL_SENSITIVE; 424 int edge_level = ACPI_LEVEL_SENSITIVE;
425 int active_high_low = ACPI_ACTIVE_LOW; 425 int active_high_low = ACPI_ACTIVE_LOW;
426 char *link = NULL; 426 char *link = NULL;
427 int rc;
427 428
428 ACPI_FUNCTION_TRACE("acpi_pci_irq_enable"); 429 ACPI_FUNCTION_TRACE("acpi_pci_irq_enable");
429 430
@@ -476,7 +477,13 @@ acpi_pci_irq_enable (
476 } 477 }
477 } 478 }
478 479
479 dev->irq = acpi_register_gsi(irq, edge_level, active_high_low); 480 rc = acpi_register_gsi(irq, edge_level, active_high_low);
481 if (rc < 0) {
482 printk(KERN_WARNING PREFIX "PCI Interrupt %s[%c]: failed "
483 "to register GSI\n", pci_name(dev), ('A' + pin));
484 return_VALUE(rc);
485 }
486 dev->irq = rc;
480 487
481 printk(KERN_INFO PREFIX "PCI Interrupt %s[%c] -> ", 488 printk(KERN_INFO PREFIX "PCI Interrupt %s[%c] -> ",
482 pci_name(dev), 'A' + pin); 489 pci_name(dev), 'A' + pin);
diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
index 834c2ceff1aa..26aa3829f1de 100644
--- a/drivers/acpi/pci_link.c
+++ b/drivers/acpi/pci_link.c
@@ -804,8 +804,7 @@ acpi_pci_link_resume(
804 */ 804 */
805int acpi_in_resume; 805int acpi_in_resume;
806static int 806static int
807irqrouter_resume( 807irqrouter_resume(struct sys_device *dev)
808 struct sys_device *dev)
809{ 808{
810 struct list_head *node = NULL; 809 struct list_head *node = NULL;
811 struct acpi_pci_link *link = NULL; 810 struct acpi_pci_link *link = NULL;
diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
index 2cf264fd52e0..7b10a7b070c9 100644
--- a/drivers/acpi/video.c
+++ b/drivers/acpi/video.c
@@ -1665,6 +1665,7 @@ static int
1665acpi_video_bus_put_one_device( 1665acpi_video_bus_put_one_device(
1666 struct acpi_video_device *device) 1666 struct acpi_video_device *device)
1667{ 1667{
1668 acpi_status status;
1668 struct acpi_video_bus *video; 1669 struct acpi_video_bus *video;
1669 1670
1670 ACPI_FUNCTION_TRACE("acpi_video_bus_put_one_device"); 1671 ACPI_FUNCTION_TRACE("acpi_video_bus_put_one_device");
@@ -1679,6 +1680,12 @@ acpi_video_bus_put_one_device(
1679 up(&video->sem); 1680 up(&video->sem);
1680 acpi_video_device_remove_fs(device->dev); 1681 acpi_video_device_remove_fs(device->dev);
1681 1682
1683 status = acpi_remove_notify_handler(device->handle,
1684 ACPI_DEVICE_NOTIFY, acpi_video_device_notify);
1685 if (ACPI_FAILURE(status))
1686 ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
1687 "Error removing notify handler\n"));
1688
1682 return_VALUE(0); 1689 return_VALUE(0);
1683} 1690}
1684 1691
diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c
index 762fa430fb5b..97feb7f7024d 100644
--- a/drivers/char/hpet.c
+++ b/drivers/char/hpet.c
@@ -906,11 +906,15 @@ static acpi_status hpet_resources(struct acpi_resource *res, void *data)
906 if (irqp->number_of_interrupts > 0) { 906 if (irqp->number_of_interrupts > 0) {
907 hdp->hd_nirqs = irqp->number_of_interrupts; 907 hdp->hd_nirqs = irqp->number_of_interrupts;
908 908
909 for (i = 0; i < hdp->hd_nirqs; i++) 909 for (i = 0; i < hdp->hd_nirqs; i++) {
910 hdp->hd_irq[i] = 910 int rc =
911 acpi_register_gsi(irqp->interrupts[i], 911 acpi_register_gsi(irqp->interrupts[i],
912 irqp->edge_level, 912 irqp->edge_level,
913 irqp->active_high_low); 913 irqp->active_high_low);
914 if (rc < 0)
915 return AE_ERROR;
916 hdp->hd_irq[i] = rc;
917 }
914 } 918 }
915 } 919 }
916 920
diff --git a/drivers/pnp/pnpacpi/rsparser.c b/drivers/pnp/pnpacpi/rsparser.c
index 75575f6c349c..1e296cbef004 100644
--- a/drivers/pnp/pnpacpi/rsparser.c
+++ b/drivers/pnp/pnpacpi/rsparser.c
@@ -81,7 +81,7 @@ pnpacpi_parse_allocated_irqresource(struct pnp_resource_table * res, int irq)
81 i++; 81 i++;
82 if (i < PNP_MAX_IRQ) { 82 if (i < PNP_MAX_IRQ) {
83 res->irq_resource[i].flags = IORESOURCE_IRQ; //Also clears _UNSET flag 83 res->irq_resource[i].flags = IORESOURCE_IRQ; //Also clears _UNSET flag
84 if (irq == -1) { 84 if (irq < 0) {
85 res->irq_resource[i].flags |= IORESOURCE_DISABLED; 85 res->irq_resource[i].flags |= IORESOURCE_DISABLED;
86 return; 86 return;
87 } 87 }
diff --git a/drivers/serial/8250_acpi.c b/drivers/serial/8250_acpi.c
index 6b9ead288517..a802bdce6e5d 100644
--- a/drivers/serial/8250_acpi.c
+++ b/drivers/serial/8250_acpi.c
@@ -47,18 +47,30 @@ static acpi_status acpi_serial_port(struct uart_port *port,
47static acpi_status acpi_serial_ext_irq(struct uart_port *port, 47static acpi_status acpi_serial_ext_irq(struct uart_port *port,
48 struct acpi_resource_ext_irq *ext_irq) 48 struct acpi_resource_ext_irq *ext_irq)
49{ 49{
50 if (ext_irq->number_of_interrupts > 0) 50 int rc;
51 port->irq = acpi_register_gsi(ext_irq->interrupts[0], 51
52 if (ext_irq->number_of_interrupts > 0) {
53 rc = acpi_register_gsi(ext_irq->interrupts[0],
52 ext_irq->edge_level, ext_irq->active_high_low); 54 ext_irq->edge_level, ext_irq->active_high_low);
55 if (rc < 0)
56 return AE_ERROR;
57 port->irq = rc;
58 }
53 return AE_OK; 59 return AE_OK;
54} 60}
55 61
56static acpi_status acpi_serial_irq(struct uart_port *port, 62static acpi_status acpi_serial_irq(struct uart_port *port,
57 struct acpi_resource_irq *irq) 63 struct acpi_resource_irq *irq)
58{ 64{
59 if (irq->number_of_interrupts > 0) 65 int rc;
60 port->irq = acpi_register_gsi(irq->interrupts[0], 66
67 if (irq->number_of_interrupts > 0) {
68 rc = acpi_register_gsi(irq->interrupts[0],
61 irq->edge_level, irq->active_high_low); 69 irq->edge_level, irq->active_high_low);
70 if (rc < 0)
71 return AE_ERROR;
72 port->irq = rc;
73 }
62 return AE_OK; 74 return AE_OK;
63} 75}
64 76
diff --git a/include/asm-ia64/acpi-ext.h b/include/asm-ia64/acpi-ext.h
index 9271d74c64cc..56d2ddc97b30 100644
--- a/include/asm-ia64/acpi-ext.h
+++ b/include/asm-ia64/acpi-ext.h
@@ -11,6 +11,7 @@
11#define _ASM_IA64_ACPI_EXT_H 11#define _ASM_IA64_ACPI_EXT_H
12 12
13#include <linux/types.h> 13#include <linux/types.h>
14#include <acpi/actypes.h>
14 15
15extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length); 16extern acpi_status hp_acpi_csr_space (acpi_handle, u64 *base, u64 *length);
16 17
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index b46a5205ee7b..fd48db320f5b 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -433,19 +433,9 @@ extern int sbf_port ;
433 433
434#define acpi_mp_config 0 434#define acpi_mp_config 0
435 435
436static inline int acpi_boot_init(void)
437{
438 return 0;
439}
440
441static inline int acpi_boot_table_init(void)
442{
443 return 0;
444}
445
446#endif /*!CONFIG_ACPI_BOOT*/ 436#endif /*!CONFIG_ACPI_BOOT*/
447 437
448unsigned int acpi_register_gsi (u32 gsi, int edge_level, int active_high_low); 438int acpi_register_gsi (u32 gsi, int edge_level, int active_high_low);
449int acpi_gsi_to_irq (u32 gsi, unsigned int *irq); 439int acpi_gsi_to_irq (u32 gsi, unsigned int *irq);
450 440
451/* 441/*
@@ -549,5 +539,17 @@ static inline int acpi_get_pxm(acpi_handle handle)
549 539
550extern int pnpacpi_disabled; 540extern int pnpacpi_disabled;
551 541
542#else /* CONFIG_ACPI */
543
544static inline int acpi_boot_init(void)
545{
546 return 0;
547}
548
549static inline int acpi_boot_table_init(void)
550{
551 return 0;
552}
553
552#endif /* CONFIG_ACPI */ 554#endif /* CONFIG_ACPI */
553#endif /*_LINUX_ACPI_H*/ 555#endif /*_LINUX_ACPI_H*/