int acpi_pci_unbind( struct acpi_device *device) { int result = 0; acpi_status status = AE_OK; struct acpi_pci_data *data = NULL; char *pathname = NULL; struct acpi_buffer buffer = {0, NULL}; ACPI_FUNCTION_TRACE("acpi_pci_unbind"); if (!device || !device->parent) return_VALUE(-EINVAL); pathname = (char *) kmalloc(ACPI_PATHNAME_MAX, GFP_KERNEL); if(!pathname) return_VALUE(-ENOMEM); memset(pathname, 0, ACPI_PATHNAME_MAX); buffer.length = ACPI_PATHNAME_MAX; buffer.pointer = pathname; acpi_get_name(device->handle, ACPI_FULL_PATHNAME, &buffer); ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Unbinding PCI device [%s]...\n", pathname)); kfree(pathname); status = acpi_get_data(device->handle, acpi_pci_data_handler, (void**)&data); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unable to get data from device %s\n", acpi_device_bid(device))); result = -ENODEV; goto end; } status = acpi_detach_data(device->handle, acpi_pci_data_handler); if (ACPI_FAILURE(status)) { ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Unable to detach data from device %s\n", acpi_device_bid(device))); result = -ENODEV; goto end; } if (data->dev->subordinate) { acpi_pci_irq_del_prt(data->id.segment, data->bus->number); } kfree(data); end: return_VALUE(result); }
static int acpi_pci_unbind(struct acpi_device *device) { int result = 0; acpi_status status; struct acpi_pci_data *data; struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; if (!device || !device->parent) return -EINVAL; status = acpi_get_name(device->handle, ACPI_FULL_PATHNAME, &buffer); if (ACPI_FAILURE(status)) return -ENODEV; ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Unbinding PCI device [%s]...\n", (char *) buffer.pointer)); kfree(buffer.pointer); status = acpi_get_data(device->handle, acpi_pci_data_handler, (void **)&data); if (ACPI_FAILURE(status)) { result = -ENODEV; goto end; } status = acpi_detach_data(device->handle, acpi_pci_data_handler); if (ACPI_FAILURE(status)) { ACPI_EXCEPTION((AE_INFO, status, "Unable to detach data from device %s", acpi_device_bid(device))); result = -ENODEV; goto end; } if (data->dev->subordinate) { acpi_pci_irq_del_prt(data->id.segment, data->bus->number); } pci_dev_put(data->dev); kfree(data); end: return result; }
static int acpi_pci_unbind(struct acpi_device *device) { struct pci_dev *dev; dev = acpi_get_pci_dev(device->handle); if (!dev) goto out; device_set_run_wake(&dev->dev, false); pci_acpi_remove_pm_notifier(device); acpi_power_resource_unregister_device(&dev->dev, device->handle); if (!dev->subordinate) goto out; acpi_pci_irq_del_prt(pci_domain_nr(dev->bus), dev->subordinate->number); device->ops.bind = NULL; device->ops.unbind = NULL; out: pci_dev_put(dev); return 0; }