diff options
author | Zhao Yakui <yakui.zhao@intel.com> | 2008-08-11 01:40:22 -0400 |
---|---|---|
committer | Len Brown <len.brown@intel.com> | 2008-10-22 18:00:50 -0400 |
commit | 39a0ad871000d2a016a4fa113a6e53d22aabf25d (patch) | |
tree | e4ff7eabccc74b2d16e80d78c2e255d2d004cd4d /drivers/acpi/bus.c | |
parent | 6415e12ba0f92a54f02d9c4ecaa3c82f35f3d335 (diff) |
ACPI : Load device driver according to the status of acpi device
According to ACPI spec when the status of some device is not present
but functional, the device is valid and the children of this device
should be enumerated. It means that the device should be added to
linux acpi device tree. But the device driver for this device should not
be loaded.
The detailed info can be found in the section 6.3.7 of ACPI 3.0b spec.
_STA may return bit 0 clear (not present) with bit 3 set (device is
functional). This case is used to indicate a valid device for which no
device driver should be loaded (for example, a bridge device.).
Children of this device may be present and valid. OS should continue
enumeration below a device whose _STA returns this bit combination
http://bugzilla.kernel.org/show_bug.cgi?id=3358
Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
Signed-off-by: Li Shaohua <shaohua.li@intel.com>
Signed-off-by: Zhang Rui <rui.zhang@intel.com>
Signed-off-by: Andi Kleen <ak@linux.intel.com>
Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/bus.c')
-rw-r--r-- | drivers/acpi/bus.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 945cd2f2807..e9b116d2b56 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c | |||
@@ -112,21 +112,21 @@ int acpi_bus_get_status(struct acpi_device *device) | |||
112 | } | 112 | } |
113 | 113 | ||
114 | /* | 114 | /* |
115 | * Otherwise we assume the status of our parent (unless we don't | 115 | * According to ACPI spec some device can be present and functional |
116 | * have one, in which case status is implied). | 116 | * even if the parent is not present but functional. |
117 | * In such conditions the child device should not inherit the status | ||
118 | * from the parent. | ||
117 | */ | 119 | */ |
118 | else if (device->parent) | ||
119 | device->status = device->parent->status; | ||
120 | else | 120 | else |
121 | STRUCT_TO_INT(device->status) = | 121 | STRUCT_TO_INT(device->status) = |
122 | ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | | 122 | ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED | |
123 | ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING; | 123 | ACPI_STA_DEVICE_UI | ACPI_STA_DEVICE_FUNCTIONING; |
124 | 124 | ||
125 | if (device->status.functional && !device->status.present) { | 125 | if (device->status.functional && !device->status.present) { |
126 | printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: " | 126 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: " |
127 | "functional but not present; setting present\n", | 127 | "functional but not present;\n", |
128 | device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status)); | 128 | device->pnp.bus_id, |
129 | device->status.present = 1; | 129 | (u32) STRUCT_TO_INT(device->status))); |
130 | } | 130 | } |
131 | 131 | ||
132 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", | 132 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n", |