diff options
author | David Shaohua Li <shaohua.li@intel.com> | 2005-03-18 18:45:35 -0500 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2005-07-11 23:28:24 -0400 |
commit | 4e10d12a3d88c88fba3258809aa42d14fd8cf1d1 (patch) | |
tree | 195f69e8e25dec0f7344aab2bbdb353b9639df79 /include | |
parent | fb9802fa59b196d7f90bb3c2e33c555c6bdc4c54 (diff) |
[ACPI] Bind PCI devices with ACPI devices
Implement the framework for binding physical devices
with ACPI devices. A physical bus like PCI bus
should create a 'acpi_bus_type', with:
.find_device:
For device which has parent such as normal PCI devices.
.find_bridge:
It's for special devices, such as PCI root bridge
or IDE controller. Such devices generally haven't a
parent or ->bus. We use the special method
to get an ACPI handle.
Uses new field in struct device: firmware_data
http://bugzilla.kernel.org/show_bug.cgi?id=4277
Signed-off-by: David Shaohua Li <shaohua.li@intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/acpi/acpi_bus.h | 21 | ||||
-rw-r--r-- | include/linux/device.h | 6 |
2 files changed, 25 insertions, 2 deletions
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index c627bc408a6b..53b821d7b8a8 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
@@ -336,6 +336,27 @@ int acpi_match_ids (struct acpi_device *device, char *ids); | |||
336 | int acpi_create_dir(struct acpi_device *); | 336 | int acpi_create_dir(struct acpi_device *); |
337 | void acpi_remove_dir(struct acpi_device *); | 337 | void acpi_remove_dir(struct acpi_device *); |
338 | 338 | ||
339 | |||
340 | /* | ||
341 | * Bind physical devices with ACPI devices | ||
342 | */ | ||
343 | #include <linux/device.h> | ||
344 | struct acpi_bus_type { | ||
345 | struct list_head list; | ||
346 | struct bus_type *bus; | ||
347 | /* For general devices under the bus*/ | ||
348 | int (*find_device)(struct device *, acpi_handle*); | ||
349 | /* For bridges, such as PCI root bridge, IDE controller */ | ||
350 | int (*find_bridge)(struct device *, acpi_handle *); | ||
351 | }; | ||
352 | int register_acpi_bus_type(struct acpi_bus_type *); | ||
353 | int unregister_acpi_bus_type(struct acpi_bus_type *); | ||
354 | struct device *acpi_get_physical_device(acpi_handle); | ||
355 | /* helper */ | ||
356 | acpi_handle acpi_get_child(acpi_handle, acpi_integer); | ||
357 | acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int); | ||
358 | #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->firmware_data)) | ||
359 | |||
339 | #endif /*CONFIG_ACPI_BUS*/ | 360 | #endif /*CONFIG_ACPI_BUS*/ |
340 | 361 | ||
341 | #endif /*__ACPI_BUS_H__*/ | 362 | #endif /*__ACPI_BUS_H__*/ |
diff --git a/include/linux/device.h b/include/linux/device.h index df94c0de53f2..de2d6fe349de 100644 --- a/include/linux/device.h +++ b/include/linux/device.h | |||
@@ -269,8 +269,10 @@ struct device { | |||
269 | struct device_driver *driver; /* which driver has allocated this | 269 | struct device_driver *driver; /* which driver has allocated this |
270 | device */ | 270 | device */ |
271 | void *driver_data; /* data private to the driver */ | 271 | void *driver_data; /* data private to the driver */ |
272 | void *platform_data; /* Platform specific data (e.g. ACPI, | 272 | void *platform_data; /* Platform specific data, device |
273 | BIOS data relevant to device) */ | 273 | core doesn't touch it */ |
274 | void *firmware_data; /* Firmware specific data (e.g. ACPI, | ||
275 | BIOS data),reserved for device core*/ | ||
274 | struct dev_pm_info power; | 276 | struct dev_pm_info power; |
275 | 277 | ||
276 | u64 *dma_mask; /* dma mask (if dma'able device) */ | 278 | u64 *dma_mask; /* dma mask (if dma'able device) */ |