ACPI: identify device tree root by null parent pointer, not ACPI_BUS_TYPE
[safe/jmp/linux-2.6] / drivers / acpi / pci_link.c
index 6d903bf..394ae89 100644 (file)
 #include <acpi/acpi_bus.h>
 #include <acpi/acpi_drivers.h>
 
-#define _COMPONENT             ACPI_PCI_COMPONENT
-ACPI_MODULE_NAME("pci_link")
+#define PREFIX "ACPI: "
+
+#define _COMPONENT                     ACPI_PCI_COMPONENT
+ACPI_MODULE_NAME("pci_link");
 #define ACPI_PCI_LINK_CLASS            "pci_irq_routing"
-#define ACPI_PCI_LINK_HID              "PNP0C0F"
-#define ACPI_PCI_LINK_DRIVER_NAME      "ACPI PCI Interrupt Link Driver"
 #define ACPI_PCI_LINK_DEVICE_NAME      "PCI Interrupt Link"
 #define ACPI_PCI_LINK_FILE_INFO                "info"
 #define ACPI_PCI_LINK_FILE_STATUS      "state"
-#define ACPI_PCI_LINK_MAX_POSSIBLE 16
+#define ACPI_PCI_LINK_MAX_POSSIBLE     16
+
 static int acpi_pci_link_add(struct acpi_device *device);
 static int acpi_pci_link_remove(struct acpi_device *device, int type);
 
+static struct acpi_device_id link_device_ids[] = {
+       {"PNP0C0F", 0},
+       {"", 0},
+};
+MODULE_DEVICE_TABLE(acpi, link_device_ids);
+
 static struct acpi_driver acpi_pci_link_driver = {
-       .name = ACPI_PCI_LINK_DRIVER_NAME,
+       .name = "pci_link",
        .class = ACPI_PCI_LINK_CLASS,
-       .ids = ACPI_PCI_LINK_HID,
+       .ids = link_device_ids,
        .ops = {
                .add = acpi_pci_link_add,
                .remove = acpi_pci_link_remove,
-               },
+       },
 };
 
 /*
@@ -72,7 +79,7 @@ static struct acpi_driver acpi_pci_link_driver = {
 struct acpi_pci_link_irq {
        u8 active;              /* Current IRQ */
        u8 triggering;          /* All IRQs */
-       u8 polarity;    /* All IRQs */
+       u8 polarity;            /* All IRQs */
        u8 resource_type;
        u8 possible_count;
        u8 possible[ACPI_PCI_LINK_MAX_POSSIBLE];
@@ -81,18 +88,14 @@ struct acpi_pci_link_irq {
 };
 
 struct acpi_pci_link {
-       struct list_head node;
-       struct acpi_device *device;
-       acpi_handle handle;
-       struct acpi_pci_link_irq irq;
-       int refcnt;
+       struct list_head                list;
+       struct acpi_device              *device;
+       struct acpi_pci_link_irq        irq;
+       int                             refcnt;
 };
 
-static struct {
-       int count;
-       struct list_head entries;
-} acpi_link;
-DEFINE_MUTEX(acpi_link_lock);
+static LIST_HEAD(acpi_link_list);
+static DEFINE_MUTEX(acpi_link_lock);
 
 /* --------------------------------------------------------------------------
                             PCI Link Device Management
@@ -101,30 +104,31 @@ DEFINE_MUTEX(acpi_link_lock);
 /*
  * set context (link) possible list from resource list
  */
-static acpi_status
-acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
+static acpi_status acpi_pci_link_check_possible(struct acpi_resource *resource,
+                                               void *context)
 {
-       struct acpi_pci_link *link = (struct acpi_pci_link *)context;
-       u32 i = 0;
-
-       ACPI_FUNCTION_TRACE("acpi_pci_link_check_possible");
+       struct acpi_pci_link *link = context;
+       u32 i;
 
        switch (resource->type) {
        case ACPI_RESOURCE_TYPE_START_DEPENDENT:
-               return_ACPI_STATUS(AE_OK);
+       case ACPI_RESOURCE_TYPE_END_TAG:
+               return AE_OK;
        case ACPI_RESOURCE_TYPE_IRQ:
                {
                        struct acpi_resource_irq *p = &resource->data.irq;
                        if (!p || !p->interrupt_count) {
-                               printk(KERN_WARNING PREFIX "Blank IRQ resource\n");
-                               return_ACPI_STATUS(AE_OK);
+                               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                                 "Blank _PRS IRQ resource\n"));
+                               return AE_OK;
                        }
                        for (i = 0;
                             (i < p->interrupt_count
                              && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
                                if (!p->interrupts[i]) {
-                                       printk(KERN_WARNING PREFIX "Invalid IRQ %d\n",
-                                                     p->interrupts[i]);
+                                       printk(KERN_WARNING PREFIX
+                                              "Invalid _PRS IRQ %d\n",
+                                              p->interrupts[i]);
                                        continue;
                                }
                                link->irq.possible[i] = p->interrupts[i];
@@ -141,15 +145,16 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
                            &resource->data.extended_irq;
                        if (!p || !p->interrupt_count) {
                                printk(KERN_WARNING PREFIX
-                                             "Blank EXT IRQ resource\n");
-                               return_ACPI_STATUS(AE_OK);
+                                             "Blank _PRS EXT IRQ resource\n");
+                               return AE_OK;
                        }
                        for (i = 0;
                             (i < p->interrupt_count
                              && i < ACPI_PCI_LINK_MAX_POSSIBLE); i++) {
                                if (!p->interrupts[i]) {
-                                       printk(KERN_WARNING PREFIX "Invalid IRQ %d\n",
-                                                     p->interrupts[i]);
+                                       printk(KERN_WARNING PREFIX
+                                              "Invalid _PRS IRQ %d\n",
+                                              p->interrupts[i]);
                                        continue;
                                }
                                link->irq.possible[i] = p->interrupts[i];
@@ -161,44 +166,41 @@ acpi_pci_link_check_possible(struct acpi_resource *resource, void *context)
                        break;
                }
        default:
-               ACPI_ERROR((AE_INFO, "Resource is not an IRQ entry\n"));
-               return_ACPI_STATUS(AE_OK);
+               printk(KERN_ERR PREFIX "_PRS resource type 0x%x isn't an IRQ\n",
+                      resource->type);
+               return AE_OK;
        }
 
-       return_ACPI_STATUS(AE_CTRL_TERMINATE);
+       return AE_CTRL_TERMINATE;
 }
 
 static int acpi_pci_link_get_possible(struct acpi_pci_link *link)
 {
        acpi_status status;
 
-       ACPI_FUNCTION_TRACE("acpi_pci_link_get_possible");
-
-       if (!link)
-               return_VALUE(-EINVAL);
-
-       status = acpi_walk_resources(link->handle, METHOD_NAME__PRS,
+       status = acpi_walk_resources(link->device->handle, METHOD_NAME__PRS,
                                     acpi_pci_link_check_possible, link);
        if (ACPI_FAILURE(status)) {
                ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PRS"));
-               return_VALUE(-ENODEV);
+               return -ENODEV;
        }
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                          "Found %d possible IRQs\n",
                          link->irq.possible_count));
 
-       return_VALUE(0);
+       return 0;
 }
 
-static acpi_status
-acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
+static acpi_status acpi_pci_link_check_current(struct acpi_resource *resource,
+                                              void *context)
 {
-       int *irq = (int *)context;
-
-       ACPI_FUNCTION_TRACE("acpi_pci_link_check_current");
+       int *irq = context;
 
        switch (resource->type) {
+       case ACPI_RESOURCE_TYPE_START_DEPENDENT:
+       case ACPI_RESOURCE_TYPE_END_TAG:
+               return AE_OK;
        case ACPI_RESOURCE_TYPE_IRQ:
                {
                        struct acpi_resource_irq *p = &resource->data.irq;
@@ -208,8 +210,8 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
                                 * particularly those those w/ _STA disabled
                                 */
                                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-                                                 "Blank IRQ resource\n"));
-                               return_ACPI_STATUS(AE_OK);
+                                                 "Blank _CRS IRQ resource\n"));
+                               return AE_OK;
                        }
                        *irq = p->interrupts[0];
                        break;
@@ -224,19 +226,20 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
                                 * return at least 1 IRQ
                                 */
                                printk(KERN_WARNING PREFIX
-                                             "Blank EXT IRQ resource\n");
-                               return_ACPI_STATUS(AE_OK);
+                                             "Blank _CRS EXT IRQ resource\n");
+                               return AE_OK;
                        }
                        *irq = p->interrupts[0];
                        break;
                }
                break;
        default:
-               ACPI_ERROR((AE_INFO, "Resource %d isn't an IRQ", resource->type));
-       case ACPI_RESOURCE_TYPE_END_TAG:
-               return_ACPI_STATUS(AE_OK);
+               printk(KERN_ERR PREFIX "_CRS resource type 0x%x isn't an IRQ\n",
+                      resource->type);
+               return AE_OK;
        }
-       return_ACPI_STATUS(AE_CTRL_TERMINATE);
+
+       return AE_CTRL_TERMINATE;
 }
 
 /*
@@ -249,14 +252,9 @@ acpi_pci_link_check_current(struct acpi_resource *resource, void *context)
 static int acpi_pci_link_get_current(struct acpi_pci_link *link)
 {
        int result = 0;
-       acpi_status status = AE_OK;
+       acpi_status status;
        int irq = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_pci_link_get_current");
-
-       if (!link || !link->handle)
-               return_VALUE(-EINVAL);
-
        link->irq.active = 0;
 
        /* in practice, status disabled is meaningless, ignore it */
@@ -264,13 +262,13 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
                /* Query _STA, set link->device->status */
                result = acpi_bus_get_status(link->device);
                if (result) {
-                       ACPI_ERROR((AE_INFO, "Unable to read status"));
+                       printk(KERN_ERR PREFIX "Unable to read status\n");
                        goto end;
                }
 
                if (!link->device->status.enabled) {
                        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link disabled\n"));
-                       return_VALUE(0);
+                       return 0;
                }
        }
 
@@ -278,7 +276,7 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
         * Query and parse _CRS to get the current IRQ assignment. 
         */
 
-       status = acpi_walk_resources(link->handle, METHOD_NAME__CRS,
+       status = acpi_walk_resources(link->device->handle, METHOD_NAME__CRS,
                                     acpi_pci_link_check_current, &irq);
        if (ACPI_FAILURE(status)) {
                ACPI_EXCEPTION((AE_INFO, status, "Evaluating _CRS"));
@@ -287,7 +285,7 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
        }
 
        if (acpi_strict && !irq) {
-               ACPI_ERROR((AE_INFO, "_CRS returned 0"));
+               printk(KERN_ERR PREFIX "_CRS returned 0\n");
                result = -ENODEV;
        }
 
@@ -296,29 +294,26 @@ static int acpi_pci_link_get_current(struct acpi_pci_link *link)
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Link at IRQ %d \n", link->irq.active));
 
       end:
-       return_VALUE(result);
+       return result;
 }
 
 static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
 {
-       int result = 0;
-       acpi_status status = AE_OK;
+       int result;
+       acpi_status status;
        struct {
                struct acpi_resource res;
                struct acpi_resource end;
        } *resource;
        struct acpi_buffer buffer = { 0, NULL };
 
-       ACPI_FUNCTION_TRACE("acpi_pci_link_set");
+       if (!irq)
+               return -EINVAL;
 
-       if (!link || !irq)
-               return_VALUE(-EINVAL);
-
-       resource = kmalloc(sizeof(*resource) + 1, GFP_ATOMIC);
+       resource = kzalloc(sizeof(*resource) + 1, irqs_disabled() ? GFP_ATOMIC: GFP_KERNEL);
        if (!resource)
-               return_VALUE(-ENOMEM);
+               return -ENOMEM;
 
-       memset(resource, 0, sizeof(*resource) + 1);
        buffer.length = sizeof(*resource) + 1;
        buffer.pointer = resource;
 
@@ -357,7 +352,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
                /* ignore resource_source, it's optional */
                break;
        default:
-               ACPI_ERROR((AE_INFO, "Invalid Resource_type %d\n", link->irq.resource_type));
+               printk(KERN_ERR PREFIX "Invalid Resource_type %d\n", link->irq.resource_type);
                result = -EINVAL;
                goto end;
 
@@ -365,7 +360,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
        resource->end.type = ACPI_RESOURCE_TYPE_END_TAG;
 
        /* Attempt to set the resource */
-       status = acpi_set_current_resources(link->handle, &buffer);
+       status = acpi_set_current_resources(link->device->handle, &buffer);
 
        /* check for total failure */
        if (ACPI_FAILURE(status)) {
@@ -377,7 +372,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
        /* Query _STA, set device->status */
        result = acpi_bus_get_status(link->device);
        if (result) {
-               ACPI_ERROR((AE_INFO, "Unable to read status"));
+               printk(KERN_ERR PREFIX "Unable to read status\n");
                goto end;
        }
        if (!link->device->status.enabled) {
@@ -413,7 +408,7 @@ static int acpi_pci_link_set(struct acpi_pci_link *link, int irq)
 
       end:
        kfree(resource);
-       return_VALUE(result);
+       return result;
 }
 
 /* --------------------------------------------------------------------------
@@ -474,31 +469,22 @@ static int acpi_irq_penalty[ACPI_MAX_IRQS] = {
        PIRQ_PENALTY_PCI_AVAILABLE,     /* IRQ9  PCI, often acpi */
        PIRQ_PENALTY_PCI_AVAILABLE,     /* IRQ10 PCI */
        PIRQ_PENALTY_PCI_AVAILABLE,     /* IRQ11 PCI */
-       PIRQ_PENALTY_ISA_USED,  /* IRQ12 mouse */
-       PIRQ_PENALTY_ISA_USED,  /* IRQ13 fpe, sometimes */
-       PIRQ_PENALTY_ISA_USED,  /* IRQ14 ide0 */
-       PIRQ_PENALTY_ISA_USED,  /* IRQ15 ide1 */
+       PIRQ_PENALTY_ISA_USED,          /* IRQ12 mouse */
+       PIRQ_PENALTY_ISA_USED,          /* IRQ13 fpe, sometimes */
+       PIRQ_PENALTY_ISA_USED,          /* IRQ14 ide0 */
+       PIRQ_PENALTY_ISA_USED,          /* IRQ15 ide1 */
        /* >IRQ15 */
 };
 
 int __init acpi_irq_penalty_init(void)
 {
-       struct list_head *node = NULL;
-       struct acpi_pci_link *link = NULL;
-       int i = 0;
-
-       ACPI_FUNCTION_TRACE("acpi_irq_penalty_init");
+       struct acpi_pci_link *link;
+       int i;
 
        /*
         * Update penalties to facilitate IRQ balancing.
         */
-       list_for_each(node, &acpi_link.entries) {
-
-               link = list_entry(node, struct acpi_pci_link, node);
-               if (!link) {
-                       ACPI_ERROR((AE_INFO, "Invalid link context"));
-                       continue;
-               }
+       list_for_each_entry(link, &acpi_link_list, list) {
 
                /*
                 * reflect the possible and active irqs in the penalty table --
@@ -522,25 +508,22 @@ int __init acpi_irq_penalty_init(void)
                }
        }
        /* Add a penalty for the SCI */
-       acpi_irq_penalty[acpi_fadt.sci_int] += PIRQ_PENALTY_PCI_USING;
-
-       return_VALUE(0);
+       acpi_irq_penalty[acpi_gbl_FADT.sci_interrupt] += PIRQ_PENALTY_PCI_USING;
+       return 0;
 }
 
-static int acpi_irq_balance;   /* 0: static, 1: balance */
+static int acpi_irq_balance = -1;      /* 0: static, 1: balance */
 
 static int acpi_pci_link_allocate(struct acpi_pci_link *link)
 {
        int irq;
        int i;
 
-       ACPI_FUNCTION_TRACE("acpi_pci_link_allocate");
-
        if (link->irq.initialized) {
                if (link->refcnt == 0)
                        /* This means the link is disabled but initialized */
                        acpi_pci_link_set(link, link->irq.active);
-               return_VALUE(0);
+               return 0;
        }
 
        /*
@@ -563,11 +546,10 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
        /*
         * if active found, use it; else pick entry from end of possible list.
         */
-       if (link->irq.active) {
+       if (link->irq.active)
                irq = link->irq.active;
-       } else {
+       else
                irq = link->irq.possible[link->irq.possible_count - 1];
-       }
 
        if (acpi_irq_balance || !link->irq.active) {
                /*
@@ -583,21 +565,20 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
 
        /* Attempt to enable the link device at this IRQ. */
        if (acpi_pci_link_set(link, irq)) {
-               ACPI_ERROR((AE_INFO, "Unable to set IRQ for %s [%s]. "
-                           "Try pci=noacpi or acpi=off",
+               printk(KERN_ERR PREFIX "Unable to set IRQ for %s [%s]. "
+                           "Try pci=noacpi or acpi=off\n",
                            acpi_device_name(link->device),
-                           acpi_device_bid(link->device)));
-               return_VALUE(-ENODEV);
+                           acpi_device_bid(link->device));
+               return -ENODEV;
        } else {
                acpi_irq_penalty[link->irq.active] += PIRQ_PENALTY_PCI_USING;
-               printk(PREFIX "%s [%s] enabled at IRQ %d\n",
+               printk(KERN_WARNING PREFIX "%s [%s] enabled at IRQ %d\n",
                       acpi_device_name(link->device),
                       acpi_device_bid(link->device), link->irq.active);
        }
 
        link->irq.initialized = 1;
-
-       return_VALUE(0);
+       return 0;
 }
 
 /*
@@ -605,46 +586,41 @@ static int acpi_pci_link_allocate(struct acpi_pci_link *link)
  * success: return IRQ >= 0
  * failure: return -1
  */
-
-int
-acpi_pci_link_allocate_irq(acpi_handle handle,
-                          int index,
-                          int *triggering, int *polarity, char **name)
+int acpi_pci_link_allocate_irq(acpi_handle handle, int index, int *triggering,
+                              int *polarity, char **name)
 {
-       int result = 0;
-       struct acpi_device *device = NULL;
-       struct acpi_pci_link *link = NULL;
-
-       ACPI_FUNCTION_TRACE("acpi_pci_link_allocate_irq");
+       int result;
+       struct acpi_device *device;
+       struct acpi_pci_link *link;
 
        result = acpi_bus_get_device(handle, &device);
        if (result) {
-               ACPI_ERROR((AE_INFO, "Invalid link device"));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Invalid link device\n");
+               return -1;
        }
 
-       link = (struct acpi_pci_link *)acpi_driver_data(device);
+       link = acpi_driver_data(device);
        if (!link) {
-               ACPI_ERROR((AE_INFO, "Invalid link context"));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Invalid link context\n");
+               return -1;
        }
 
        /* TBD: Support multiple index (IRQ) entries per Link Device */
        if (index) {
-               ACPI_ERROR((AE_INFO, "Invalid index %d", index));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Invalid index %d\n", index);
+               return -1;
        }
 
        mutex_lock(&acpi_link_lock);
        if (acpi_pci_link_allocate(link)) {
                mutex_unlock(&acpi_link_lock);
-               return_VALUE(-1);
+               return -1;
        }
 
        if (!link->irq.active) {
                mutex_unlock(&acpi_link_lock);
-               ACPI_ERROR((AE_INFO, "Link active IRQ is 0!"));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Link active IRQ is 0!\n");
+               return -1;
        }
        link->refcnt++;
        mutex_unlock(&acpi_link_lock);
@@ -658,7 +634,7 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
        ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                          "Link %s is referenced\n",
                          acpi_device_bid(link->device)));
-       return_VALUE(link->irq.active);
+       return (link->irq.active);
 }
 
 /*
@@ -667,29 +643,27 @@ acpi_pci_link_allocate_irq(acpi_handle handle,
  */
 int acpi_pci_link_free_irq(acpi_handle handle)
 {
-       struct acpi_device *device = NULL;
-       struct acpi_pci_link *link = NULL;
+       struct acpi_device *device;
+       struct acpi_pci_link *link;
        acpi_status result;
 
-       ACPI_FUNCTION_TRACE("acpi_pci_link_free_irq");
-
        result = acpi_bus_get_device(handle, &device);
        if (result) {
-               ACPI_ERROR((AE_INFO, "Invalid link device"));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Invalid link device\n");
+               return -1;
        }
 
-       link = (struct acpi_pci_link *)acpi_driver_data(device);
+       link = acpi_driver_data(device);
        if (!link) {
-               ACPI_ERROR((AE_INFO, "Invalid link context"));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Invalid link context\n");
+               return -1;
        }
 
        mutex_lock(&acpi_link_lock);
        if (!link->irq.initialized) {
                mutex_unlock(&acpi_link_lock);
-               ACPI_ERROR((AE_INFO, "Link isn't initialized"));
-               return_VALUE(-1);
+               printk(KERN_ERR PREFIX "Link isn't initialized\n");
+               return -1;
        }
 #ifdef FUTURE_USE
        /*
@@ -707,11 +681,11 @@ int acpi_pci_link_free_irq(acpi_handle handle)
                          "Link %s is dereferenced\n",
                          acpi_device_bid(link->device)));
 
-       if (link->refcnt == 0) {
-               acpi_ut_evaluate_object(link->handle, "_DIS", 0, NULL);
-       }
+       if (link->refcnt == 0)
+               acpi_evaluate_object(link->device->handle, "_DIS", NULL, NULL);
+
        mutex_unlock(&acpi_link_lock);
-       return_VALUE(link->irq.active);
+       return (link->irq.active);
 }
 
 /* --------------------------------------------------------------------------
@@ -720,26 +694,19 @@ int acpi_pci_link_free_irq(acpi_handle handle)
 
 static int acpi_pci_link_add(struct acpi_device *device)
 {
-       int result = 0;
-       struct acpi_pci_link *link = NULL;
-       int i = 0;
+       int result;
+       struct acpi_pci_link *link;
+       int i;
        int found = 0;
 
-       ACPI_FUNCTION_TRACE("acpi_pci_link_add");
-
-       if (!device)
-               return_VALUE(-EINVAL);
-
-       link = kmalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
+       link = kzalloc(sizeof(struct acpi_pci_link), GFP_KERNEL);
        if (!link)
-               return_VALUE(-ENOMEM);
-       memset(link, 0, sizeof(struct acpi_pci_link));
+               return -ENOMEM;
 
        link->device = device;
-       link->handle = device->handle;
        strcpy(acpi_device_name(device), ACPI_PCI_LINK_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_PCI_LINK_CLASS);
-       acpi_driver_data(device) = link;
+       device->driver_data = link;
 
        mutex_lock(&acpi_link_lock);
        result = acpi_pci_link_get_possible(link);
@@ -749,7 +716,7 @@ static int acpi_pci_link_add(struct acpi_device *device)
        /* query and set link->irq.active */
        acpi_pci_link_get_current(link);
 
-       printk(PREFIX "%s [%s] (IRQs", acpi_device_name(device),
+       printk(KERN_INFO PREFIX "%s [%s] (IRQs", acpi_device_name(device),
               acpi_device_bid(device));
        for (i = 0; i < link->irq.possible_count; i++) {
                if (link->irq.active == link->irq.possible[i]) {
@@ -769,77 +736,49 @@ static int acpi_pci_link_add(struct acpi_device *device)
 
        printk("\n");
 
-       /* TBD: Acquire/release lock */
-       list_add_tail(&link->node, &acpi_link.entries);
-       acpi_link.count++;
+       list_add_tail(&link->list, &acpi_link_list);
 
       end:
        /* disable all links -- to be activated on use */
-       acpi_ut_evaluate_object(link->handle, "_DIS", 0, NULL);
+       acpi_evaluate_object(device->handle, "_DIS", NULL, NULL);
        mutex_unlock(&acpi_link_lock);
 
        if (result)
                kfree(link);
 
-       return_VALUE(result);
+       return result;
 }
 
 static int acpi_pci_link_resume(struct acpi_pci_link *link)
 {
-       ACPI_FUNCTION_TRACE("acpi_pci_link_resume");
-
        if (link->refcnt && link->irq.active && link->irq.initialized)
-               return_VALUE(acpi_pci_link_set(link, link->irq.active));
-       else
-               return_VALUE(0);
+               return (acpi_pci_link_set(link, link->irq.active));
+
+       return 0;
 }
 
-/*
- * FIXME: this is a workaround to avoid nasty warning.  It will be removed
- * after every device calls pci_disable_device in .resume.
- */
-int acpi_in_resume;
 static int irqrouter_resume(struct sys_device *dev)
 {
-       struct list_head *node = NULL;
-       struct acpi_pci_link *link = NULL;
-
-       ACPI_FUNCTION_TRACE("irqrouter_resume");
+       struct acpi_pci_link *link;
 
-       /* Make sure SCI is enabled again (Apple firmware bug?) */
-       acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1, ACPI_MTX_DO_NOT_LOCK);
-
-       acpi_in_resume = 1;
-       list_for_each(node, &acpi_link.entries) {
-               link = list_entry(node, struct acpi_pci_link, node);
-               if (!link) {
-                       ACPI_ERROR((AE_INFO, "Invalid link context"));
-                       continue;
-               }
+       list_for_each_entry(link, &acpi_link_list, list) {
                acpi_pci_link_resume(link);
        }
-       acpi_in_resume = 0;
-       return_VALUE(0);
+       return 0;
 }
 
 static int acpi_pci_link_remove(struct acpi_device *device, int type)
 {
-       struct acpi_pci_link *link = NULL;
-
-       ACPI_FUNCTION_TRACE("acpi_pci_link_remove");
+       struct acpi_pci_link *link;
 
-       if (!device || !acpi_driver_data(device))
-               return_VALUE(-EINVAL);
-
-       link = (struct acpi_pci_link *)acpi_driver_data(device);
+       link = acpi_driver_data(device);
 
        mutex_lock(&acpi_link_lock);
-       list_del(&link->node);
+       list_del(&link->list);
        mutex_unlock(&acpi_link_lock);
 
        kfree(link);
-
-       return_VALUE(0);
+       return 0;
 }
 
 /*
@@ -861,7 +800,7 @@ static int __init acpi_irq_penalty_update(char *str, int used)
                if (irq < 0)
                        continue;
 
-               if (irq >= ACPI_MAX_IRQS)
+               if (irq >= ARRAY_SIZE(acpi_irq_penalty))
                        continue;
 
                if (used)
@@ -884,10 +823,12 @@ static int __init acpi_irq_penalty_update(char *str, int used)
  */
 void acpi_penalize_isa_irq(int irq, int active)
 {
-       if (active)
-               acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
-       else
-               acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
+       if (irq >= 0 && irq < ARRAY_SIZE(acpi_irq_penalty)) {
+               if (active)
+                       acpi_irq_penalty[irq] += PIRQ_PENALTY_ISA_USED;
+               else
+                       acpi_irq_penalty[irq] += PIRQ_PENALTY_PCI_USING;
+       }
 }
 
 /*
@@ -922,7 +863,7 @@ static int __init acpi_irq_nobalance_set(char *str)
 
 __setup("acpi_irq_nobalance", acpi_irq_nobalance_set);
 
-int __init acpi_irq_balance_set(char *str)
+static int __init acpi_irq_balance_set(char *str)
 {
        acpi_irq_balance = 1;
        return 1;
@@ -932,7 +873,7 @@ __setup("acpi_irq_balance", acpi_irq_balance_set);
 
 /* FIXME: we will remove this interface after all drivers call pci_disable_device */
 static struct sysdev_class irqrouter_sysdev_class = {
-       set_kset_name("irqrouter"),
+       .name = "irqrouter",
        .resume = irqrouter_resume,
 };
 
@@ -945,34 +886,35 @@ static int __init irqrouter_init_sysfs(void)
 {
        int error;
 
-       ACPI_FUNCTION_TRACE("irqrouter_init_sysfs");
-
        if (acpi_disabled || acpi_noirq)
-               return_VALUE(0);
+               return 0;
 
        error = sysdev_class_register(&irqrouter_sysdev_class);
        if (!error)
                error = sysdev_register(&device_irqrouter);
 
-       return_VALUE(error);
+       return error;
 }
 
 device_initcall(irqrouter_init_sysfs);
 
 static int __init acpi_pci_link_init(void)
 {
-       ACPI_FUNCTION_TRACE("acpi_pci_link_init");
-
        if (acpi_noirq)
-               return_VALUE(0);
+               return 0;
 
-       acpi_link.count = 0;
-       INIT_LIST_HEAD(&acpi_link.entries);
+       if (acpi_irq_balance == -1) {
+               /* no command line switch: enable balancing in IOAPIC mode */
+               if (acpi_irq_model == ACPI_IRQ_MODEL_IOAPIC)
+                       acpi_irq_balance = 1;
+               else
+                       acpi_irq_balance = 0;
+       }
 
        if (acpi_bus_register_driver(&acpi_pci_link_driver) < 0)
-               return_VALUE(-ENODEV);
+               return -ENODEV;
 
-       return_VALUE(0);
+       return 0;
 }
 
 subsys_initcall(acpi_pci_link_init);