Ejemplo n.º 1
0
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;
}
Ejemplo n.º 3
0
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;
}