|
@@ -276,6 +276,13 @@ int acpi_match_device_ids(struct acpi_device *device,
|
|
|
{
|
|
|
const struct acpi_device_id *id;
|
|
|
|
|
|
+ /*
|
|
|
+ * If the device is not present, it is unnecessary to load device
|
|
|
+ * driver for it.
|
|
|
+ */
|
|
|
+ if (!device->status.present)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
if (device->flags.hardware_id) {
|
|
|
for (id = ids; id->id[0]; id++) {
|
|
|
if (!strcmp((char*)id->id, device->pnp.hardware_id))
|
|
@@ -1222,15 +1229,18 @@ acpi_add_single_object(struct acpi_device **child,
|
|
|
result = -ENODEV;
|
|
|
goto end;
|
|
|
}
|
|
|
- if (!device->status.present) {
|
|
|
- /* Bay and dock should be handled even if absent */
|
|
|
- if (!ACPI_SUCCESS(
|
|
|
- acpi_is_child_device(device, acpi_bay_match)) &&
|
|
|
- !ACPI_SUCCESS(
|
|
|
- acpi_is_child_device(device, acpi_dock_match))) {
|
|
|
- result = -ENODEV;
|
|
|
- goto end;
|
|
|
- }
|
|
|
+ /*
|
|
|
+ * When the device is neither present nor functional, the
|
|
|
+ * device should not be added to Linux ACPI device tree.
|
|
|
+ * When the status of the device is not present but functinal,
|
|
|
+ * it should be added to Linux ACPI tree. For example : bay
|
|
|
+ * device , dock device.
|
|
|
+ * In such conditions it is unncessary to check whether it is
|
|
|
+ * bay device or dock device.
|
|
|
+ */
|
|
|
+ if (!device->status.present && !device->status.functional) {
|
|
|
+ result = -ENODEV;
|
|
|
+ goto end;
|
|
|
}
|
|
|
break;
|
|
|
default:
|
|
@@ -1411,7 +1421,12 @@ static int acpi_bus_scan(struct acpi_device *start, struct acpi_bus_ops *ops)
|
|
|
* TBD: Need notifications and other detection mechanisms
|
|
|
* in place before we can fully implement this.
|
|
|
*/
|
|
|
- if (child->status.present) {
|
|
|
+ /*
|
|
|
+ * When the device is not present but functional, it is also
|
|
|
+ * necessary to scan the children of this device.
|
|
|
+ */
|
|
|
+ if (child->status.present || (!child->status.present &&
|
|
|
+ child->status.functional)) {
|
|
|
status = acpi_get_next_object(ACPI_TYPE_ANY, chandle,
|
|
|
NULL, NULL);
|
|
|
if (ACPI_SUCCESS(status)) {
|