diff options
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r-- | drivers/acpi/scan.c | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 69bc0d888c01..03141aa4ea95 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -375,7 +375,11 @@ bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent) | |||
375 | struct acpi_device_physical_node *pn; | 375 | struct acpi_device_physical_node *pn; |
376 | bool offline = true; | 376 | bool offline = true; |
377 | 377 | ||
378 | mutex_lock(&adev->physical_node_lock); | 378 | /* |
379 | * acpi_container_offline() calls this for all of the container's | ||
380 | * children under the container's physical_node_lock lock. | ||
381 | */ | ||
382 | mutex_lock_nested(&adev->physical_node_lock, SINGLE_DEPTH_NESTING); | ||
379 | 383 | ||
380 | list_for_each_entry(pn, &adev->physical_node_list, node) | 384 | list_for_each_entry(pn, &adev->physical_node_list, node) |
381 | if (device_supports_offline(pn->dev) && !pn->dev->offline) { | 385 | if (device_supports_offline(pn->dev) && !pn->dev->offline) { |
@@ -2388,9 +2392,6 @@ static void acpi_default_enumeration(struct acpi_device *device) | |||
2388 | struct list_head resource_list; | 2392 | struct list_head resource_list; |
2389 | bool is_spi_i2c_slave = false; | 2393 | bool is_spi_i2c_slave = false; |
2390 | 2394 | ||
2391 | if (!device->pnp.type.platform_id || device->handler) | ||
2392 | return; | ||
2393 | |||
2394 | /* | 2395 | /* |
2395 | * Do not enemerate SPI/I2C slaves as they will be enuerated by their | 2396 | * Do not enemerate SPI/I2C slaves as they will be enuerated by their |
2396 | * respective parents. | 2397 | * respective parents. |
@@ -2403,6 +2404,29 @@ static void acpi_default_enumeration(struct acpi_device *device) | |||
2403 | acpi_create_platform_device(device); | 2404 | acpi_create_platform_device(device); |
2404 | } | 2405 | } |
2405 | 2406 | ||
2407 | static const struct acpi_device_id generic_device_ids[] = { | ||
2408 | {"PRP0001", }, | ||
2409 | {"", }, | ||
2410 | }; | ||
2411 | |||
2412 | static int acpi_generic_device_attach(struct acpi_device *adev, | ||
2413 | const struct acpi_device_id *not_used) | ||
2414 | { | ||
2415 | /* | ||
2416 | * Since PRP0001 is the only ID handled here, the test below can be | ||
2417 | * unconditional. | ||
2418 | */ | ||
2419 | if (adev->data.of_compatible) | ||
2420 | acpi_default_enumeration(adev); | ||
2421 | |||
2422 | return 1; | ||
2423 | } | ||
2424 | |||
2425 | static struct acpi_scan_handler generic_device_handler = { | ||
2426 | .ids = generic_device_ids, | ||
2427 | .attach = acpi_generic_device_attach, | ||
2428 | }; | ||
2429 | |||
2406 | static int acpi_scan_attach_handler(struct acpi_device *device) | 2430 | static int acpi_scan_attach_handler(struct acpi_device *device) |
2407 | { | 2431 | { |
2408 | struct acpi_hardware_id *hwid; | 2432 | struct acpi_hardware_id *hwid; |
@@ -2428,8 +2452,6 @@ static int acpi_scan_attach_handler(struct acpi_device *device) | |||
2428 | break; | 2452 | break; |
2429 | } | 2453 | } |
2430 | } | 2454 | } |
2431 | if (!ret) | ||
2432 | acpi_default_enumeration(device); | ||
2433 | 2455 | ||
2434 | return ret; | 2456 | return ret; |
2435 | } | 2457 | } |
@@ -2471,6 +2493,9 @@ static void acpi_bus_attach(struct acpi_device *device) | |||
2471 | ret = device_attach(&device->dev); | 2493 | ret = device_attach(&device->dev); |
2472 | if (ret < 0) | 2494 | if (ret < 0) |
2473 | return; | 2495 | return; |
2496 | |||
2497 | if (!ret && device->pnp.type.platform_id) | ||
2498 | acpi_default_enumeration(device); | ||
2474 | } | 2499 | } |
2475 | device->flags.visited = true; | 2500 | device->flags.visited = true; |
2476 | 2501 | ||
@@ -2629,6 +2654,8 @@ int __init acpi_scan_init(void) | |||
2629 | acpi_pnp_init(); | 2654 | acpi_pnp_init(); |
2630 | acpi_int340x_thermal_init(); | 2655 | acpi_int340x_thermal_init(); |
2631 | 2656 | ||
2657 | acpi_scan_add_handler(&generic_device_handler); | ||
2658 | |||
2632 | mutex_lock(&acpi_scan_lock); | 2659 | mutex_lock(&acpi_scan_lock); |
2633 | /* | 2660 | /* |
2634 | * Enumerate devices in the ACPI namespace. | 2661 | * Enumerate devices in the ACPI namespace. |