diff options
Diffstat (limited to 'drivers/acpi/glue.c')
| -rw-r--r-- | drivers/acpi/glue.c | 40 | 
1 files changed, 40 insertions, 0 deletions
diff --git a/drivers/acpi/glue.c b/drivers/acpi/glue.c index 24649ada08d..adec3d15810 100644 --- a/drivers/acpi/glue.c +++ b/drivers/acpi/glue.c @@ -140,6 +140,46 @@ struct device *acpi_get_physical_device(acpi_handle handle)  EXPORT_SYMBOL(acpi_get_physical_device); +/* ToDo: When a PCI bridge is found, return the PCI device behind the bridge + *       This should work in general, but did not on a Lenovo T61 for the + *	 graphics card. But this must be fixed when the PCI device is + *       bound and the kernel device struct is attached to the acpi device + * Note: A success call will increase reference count by one + *       Do call put_device(dev) on the returned device then + */ +struct device *acpi_get_physical_pci_device(acpi_handle handle) +{ +	struct device *dev; +	long long device_id; +	acpi_status status; + +	status = +		acpi_evaluate_integer(handle, "_ADR", NULL, &device_id); + +	if (ACPI_FAILURE(status)) +		return NULL; + +	/* We need to attempt to determine whether the _ADR refers to a +	   PCI device or not. There's no terribly good way to do this, +	   so the best we can hope for is to assume that there'll never +	   be a device in the host bridge */ +	if (device_id >= 0x10000) { +		/* It looks like a PCI device. Does it exist? */ +		dev = acpi_get_physical_device(handle); +	} else { +		/* It doesn't look like a PCI device. Does its parent +		   exist? */ +		acpi_handle phandle; +		if (acpi_get_parent(handle, &phandle)) +			return NULL; +		dev = acpi_get_physical_device(phandle); +	} +	if (!dev) +		return NULL; +	return dev; +} +EXPORT_SYMBOL(acpi_get_physical_pci_device); +  static int acpi_bind_one(struct device *dev, acpi_handle handle)  {  	struct acpi_device *acpi_dev;  |