@@ -22,24 +22,6 @@
ACPI_MODULE_NAME("platform");
-/*
- * The following ACPI IDs are known to be suitable for representing as
- * platform devices.
- */
-static const struct acpi_device_id acpi_platform_device_ids[] = {
-
- { "PNP0D40" },
- { "ACPI0003" },
- { "VPC2004" },
- { "BCM4752" },
-
- /* Intel Smart Sound Technology */
- { "INT33C8" },
- { "80860F28" },
-
- { }
-};
-
/**
* acpi_create_platform_device - Create platform device for ACPI device node
* @adev: ACPI device node to create a platform device for.
@@ -125,13 +107,3 @@ int acpi_create_platform_device(struct acpi_device *adev,
kfree(resources);
return 1;
}
-
-static struct acpi_scan_handler platform_handler = {
- .ids = acpi_platform_device_ids,
- .attach = acpi_create_platform_device,
-};
-
-void __init acpi_platform_init(void)
-{
- acpi_scan_add_handler(&platform_handler);
-}
@@ -2079,6 +2079,53 @@ static int acpi_scan_handler_dummy_attach(struct acpi_device *device,
return 1;
}
+static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data)
+{
+ struct acpi_resource_common_serialbus *res;
+ int *is_spi_i2c_slave = data;
+
+ if (ares->type == ACPI_RESOURCE_TYPE_SERIAL_BUS) {
+ res = &ares->data.common_serial_bus;
+
+ /*
+ * devices that are connected to UART still need to
+ * be enumerated to platform bus
+ */
+ if (res->type != ACPI_RESOURCE_SERIAL_TYPE_UART)
+ *is_spi_i2c_slave = 1;
+ /* no need to do more checking */
+ return -1;
+ }
+ return 1;
+}
+
+static void acpi_do_default_enumeration(struct acpi_device *device)
+{
+ struct list_head resource_list;
+ int is_spi_i2c_slave = 0;
+
+ /* Do not do enumeration for device object w/o platform_id */
+ if (!device->pnp.type.platform_id)
+ return;
+
+ /* Do not do enumeration for device object with scan handler attached */
+ if (device->handler)
+ return;
+
+ /*
+ * Do not do enemeration for SPI/I2C slaves
+ * as they will be enuerated to SPI/I2C bus by their parents
+ */
+ INIT_LIST_HEAD(&resource_list);
+ acpi_dev_get_resources(device, &resource_list,
+ acpi_check_spi_i2c_slave, &is_spi_i2c_slave);
+ acpi_dev_free_resource_list(&resource_list);
+ if (is_spi_i2c_slave)
+ return;
+
+ acpi_create_platform_device(device, NULL);
+}
+
static int acpi_scan_attach_handler(struct acpi_device *device)
{
struct acpi_hardware_id *hwid;
@@ -2103,6 +2150,9 @@ static int acpi_scan_attach_handler(struct acpi_device *device)
break;
}
}
+
+ acpi_do_default_enumeration(device);
+
return ret;
}
@@ -2262,7 +2312,6 @@ int __init acpi_scan_init(void)
acpi_pci_root_init();
acpi_pci_link_init();
acpi_processor_init();
- acpi_platform_init();
acpi_lpss_init();
acpi_cmos_rtc_init();
acpi_container_init();