+/*
+ * We don't change link's irq information here. After it is reenabled, we
+ * continue use the info
+ */
+int acpi_pci_link_free_irq(acpi_handle handle)
+{
+ struct acpi_device *device = NULL;
+ struct acpi_pci_link *link = NULL;
+ acpi_status result;
+
+
+ result = acpi_bus_get_device(handle, &device);
+ if (result) {
+ printk(KERN_ERR PREFIX "Invalid link device\n");
+ return -1;
+ }
+
+ link = acpi_driver_data(device);
+ if (!link) {
+ printk(KERN_ERR PREFIX "Invalid link context\n");
+ return -1;
+ }
+
+ mutex_lock(&acpi_link_lock);
+ if (!link->irq.initialized) {
+ mutex_unlock(&acpi_link_lock);
+ printk(KERN_ERR PREFIX "Link isn't initialized\n");
+ return -1;
+ }
+#ifdef FUTURE_USE
+ /*
+ * The Link reference count allows us to _DISable an unused link
+ * and suspend time, and set it again on resume.
+ * However, 2.6.12 still has irq_router.resume
+ * which blindly restores the link state.
+ * So we disable the reference count method
+ * to prevent duplicate acpi_pci_link_set()
+ * which would harm some systems
+ */
+ link->refcnt--;
+#endif
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+ "Link %s is dereferenced\n",
+ acpi_device_bid(link->device)));
+
+ if (link->refcnt == 0) {
+ acpi_ut_evaluate_object(link->device->handle, "_DIS", 0, NULL);
+ }
+ mutex_unlock(&acpi_link_lock);
+ return (link->irq.active);
+}