@@ -440,6 +440,7 @@ static struct notifier_block acpi_lpss_nb = {
static struct acpi_scan_handler lpss_handler = {
.ids = acpi_lpss_device_ids,
.attach = acpi_lpss_create_device,
+ .handle_children = true,
};
#endif /* CONFIG_X86_INTEL_LPSS */
@@ -453,6 +454,7 @@ static int acpi_lpss_dummy_attach(struct acpi_device *adev,
static struct acpi_scan_handler lpss_dummy_handler = {
.ids = acpi_lpss_device_ids,
.attach = acpi_lpss_dummy_attach,
+ .handle_children = true,
};
void __init acpi_lpss_init(void)
@@ -2016,6 +2016,31 @@ static acpi_status acpi_bus_check_add(acpi_handle handle, u32 lvl_not_used,
return AE_OK;
}
+static void acpi_do_default_enumeration(struct acpi_device *device)
+{
+ /*
+ * Do not do enumeration for device object that
+ * its parent doesn't want to
+ */
+ if (device->parent && device->parent->flags.no_child_enumeration) {
+ device->flags.no_child_enumeration = 1;
+ return;
+ }
+
+ /* Do not do enumeration for device object with scan handler attached */
+ if (device->handler) {
+ if (device->handler->handle_children)
+ device->flags.no_child_enumeration = 1;
+ return;
+ }
+
+ /* Do not do enumeration for device object w/o platform_id */
+ if (!device->pnp.type.platform_id)
+ return;
+
+ acpi_create_platform_device(device, NULL);
+}
+
static int acpi_scan_attach_handler(struct acpi_device *device)
{
struct acpi_hardware_id *hwid;
@@ -2035,8 +2060,7 @@ static int acpi_scan_attach_handler(struct acpi_device *device)
}
}
end:
- if (device->pnp.type.platform_id && !device->handler)
- acpi_create_platform_device(device, NULL);
+ acpi_do_default_enumeration(device);
return ret;
}
@@ -135,6 +135,7 @@ struct acpi_scan_handler {
int (*attach)(struct acpi_device *dev, const struct acpi_device_id *id);
void (*detach)(struct acpi_device *dev);
struct acpi_hotplug_profile hotplug;
+ bool handle_children;
};
/*
@@ -191,7 +192,8 @@ struct acpi_device_flags {
u32 initialized:1;
u32 visited:1;
u32 no_hotplug:1;
- u32 reserved:24;
+ u32 no_child_enumeration:1;
+ u32 reserved:23;
};
/* File System */