On Fri, 2014-05-30 at 14:35 +0200, Rafael J. Wysocki wrote: > From: Zhang Rui <rui.zhang@xxxxxxxxx> > > Because of the growing demand for enumerating ACPI devices to > platform bus, change the code to enumerate ACPI device objects to > platform bus by default. Namely, create platform devices for the > ACPI device objects that > 1. Have pnp.type.platform_id set (device objects with _HID currently). > 2. Do not have a scan handler attached. > 3. Are not SPI/I2C slave devices (that should be enumerated to the > appropriate buses bus by their parent). > > Signed-off-by: Zhang Rui <rui.zhang@xxxxxxxxx> > [rjw: Subject and changelog, rebase and code cleanup] > Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@xxxxxxxxx> > --- > > Changelog rework and minor cleanups. > > Thanks! > > --- > drivers/acpi/acpi_platform.c | 40 ++++++++-------------------------------- > drivers/acpi/scan.c | 42 +++++++++++++++++++++++++++++++++++++++++- > 2 files changed, 49 insertions(+), 33 deletions(-) > > Index: linux-pm/drivers/acpi/acpi_platform.c > =================================================================== > --- linux-pm.orig/drivers/acpi/acpi_platform.c > +++ linux-pm/drivers/acpi/acpi_platform.c > @@ -22,21 +22,11 @@ > > 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" }, > - { "VPC2004" }, > - { "BCM4752" }, > - > - /* Intel Smart Sound Technology */ > - { "INT33C8" }, > - { "80860F28" }, > - > - { } > +static const struct acpi_device_id forbidden_id_list[] = { > + {"PNP0000", 0}, /* PIC */ > + {"PNP0100", 0}, /* Timer */ > + {"PNP0200", 0}, /* AT DMA Controller */ > + {"", 0}, > }; > > /** > @@ -63,6 +53,9 @@ struct platform_device *acpi_create_plat > if (adev->physical_node_count) > return NULL; > > + if (!acpi_match_device_ids(adev, forbidden_id_list)) > + return ERR_PTR(-EINVAL); > + > INIT_LIST_HEAD(&resource_list); > count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL); > if (count < 0) { > @@ -120,20 +113,3 @@ struct platform_device *acpi_create_plat > kfree(resources); > return pdev; > } > - > -static int acpi_platform_attach(struct acpi_device *adev, > - const struct acpi_device_id *id) > -{ > - acpi_create_platform_device(adev); > - return 1; > -} > - this patch does not apply. we do not have the above code in drivers/acpi/acpi_platform.c. thanks, rui > -static struct acpi_scan_handler platform_handler = { > - .ids = acpi_platform_device_ids, > - .attach = acpi_platform_attach, > -}; > - > -void __init acpi_platform_init(void) > -{ > - acpi_scan_add_handler(&platform_handler); > -} > Index: linux-pm/drivers/acpi/scan.c > =================================================================== > --- linux-pm.orig/drivers/acpi/scan.c > +++ linux-pm/drivers/acpi/scan.c > @@ -2070,6 +2070,44 @@ static acpi_status acpi_bus_check_add(ac > return AE_OK; > } > > +static int acpi_check_spi_i2c_slave(struct acpi_resource *ares, void *data) > +{ > + bool *is_spi_i2c_slave_p = data; > + > + if (ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS) > + return 1; > + > + /* > + * devices that are connected to UART still need to be enumerated to > + * platform bus > + */ > + if (ares->data.common_serial_bus.type != ACPI_RESOURCE_SERIAL_TYPE_UART) > + *is_spi_i2c_slave_p = true; > + > + /* no need to do more checking */ > + return -1; > +} > + > +static void acpi_default_enumeration(struct acpi_device *device) > +{ > + struct list_head resource_list; > + bool is_spi_i2c_slave = false; > + > + if (!device->pnp.type.platform_id || device->handler) > + return; > + > + /* > + * Do not enemerate SPI/I2C slaves as they will be enuerated by their > + * respective 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) > + acpi_create_platform_device(device); > +} > + > static int acpi_scan_attach_handler(struct acpi_device *device) > { > struct acpi_hardware_id *hwid; > @@ -2095,6 +2133,9 @@ static int acpi_scan_attach_handler(stru > break; > } > } > + if (!ret) > + acpi_default_enumeration(device); > + > return ret; > } > > @@ -2254,7 +2295,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(); > > -- > To unsubscribe from this list: send the line "unsubscribe linux-acpi" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html