diff options
| -rw-r--r-- | drivers/acpi/dock.c | 8 | ||||
| -rw-r--r-- | drivers/acpi/scan.c | 28 | ||||
| -rw-r--r-- | drivers/pci/hotplug/acpiphp_glue.c | 10 | ||||
| -rw-r--r-- | include/acpi/acpi_bus.h | 2 |
4 files changed, 21 insertions, 27 deletions
diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c index 420d24fc9388..78648f811049 100644 --- a/drivers/acpi/dock.c +++ b/drivers/acpi/dock.c | |||
| @@ -336,13 +336,9 @@ static struct acpi_device * dock_create_acpi_device(acpi_handle handle) | |||
| 336 | static void dock_remove_acpi_device(acpi_handle handle) | 336 | static void dock_remove_acpi_device(acpi_handle handle) |
| 337 | { | 337 | { |
| 338 | struct acpi_device *device; | 338 | struct acpi_device *device; |
| 339 | int ret; | ||
| 340 | 339 | ||
| 341 | if (!acpi_bus_get_device(handle, &device)) { | 340 | if (!acpi_bus_get_device(handle, &device)) |
| 342 | ret = acpi_bus_trim(device); | 341 | acpi_bus_trim(device); |
| 343 | if (ret) | ||
| 344 | pr_debug("error removing bus, %x\n", -ret); | ||
| 345 | } | ||
| 346 | } | 342 | } |
| 347 | 343 | ||
| 348 | /** | 344 | /** |
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index b206ce5e1faf..774b17dc7999 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -52,6 +52,7 @@ static const struct acpi_device_id acpi_platform_device_ids[] = { | |||
| 52 | 52 | ||
| 53 | static LIST_HEAD(acpi_device_list); | 53 | static LIST_HEAD(acpi_device_list); |
| 54 | static LIST_HEAD(acpi_bus_id_list); | 54 | static LIST_HEAD(acpi_bus_id_list); |
| 55 | static DEFINE_MUTEX(acpi_scan_lock); | ||
| 55 | DEFINE_MUTEX(acpi_device_lock); | 56 | DEFINE_MUTEX(acpi_device_lock); |
| 56 | LIST_HEAD(acpi_wakeup_device_list); | 57 | LIST_HEAD(acpi_wakeup_device_list); |
| 57 | 58 | ||
| @@ -127,13 +128,8 @@ void acpi_bus_hot_remove_device(void *context) | |||
| 127 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, | 128 | ACPI_DEBUG_PRINT((ACPI_DB_INFO, |
| 128 | "Hot-removing device %s...\n", dev_name(&device->dev))); | 129 | "Hot-removing device %s...\n", dev_name(&device->dev))); |
| 129 | 130 | ||
| 130 | if (acpi_bus_trim(device)) { | 131 | acpi_bus_trim(device); |
| 131 | printk(KERN_ERR PREFIX | 132 | /* Device node has been released. */ |
| 132 | "Removing device failed\n"); | ||
| 133 | goto err_out; | ||
| 134 | } | ||
| 135 | |||
| 136 | /* device has been freed */ | ||
| 137 | device = NULL; | 133 | device = NULL; |
| 138 | 134 | ||
| 139 | /* power off device */ | 135 | /* power off device */ |
| @@ -1616,19 +1612,22 @@ static acpi_status acpi_bus_device_attach(acpi_handle handle, u32 lvl_not_used, | |||
| 1616 | int acpi_bus_scan(acpi_handle handle) | 1612 | int acpi_bus_scan(acpi_handle handle) |
| 1617 | { | 1613 | { |
| 1618 | void *device = NULL; | 1614 | void *device = NULL; |
| 1615 | int error = 0; | ||
| 1616 | |||
| 1617 | mutex_lock(&acpi_scan_lock); | ||
| 1619 | 1618 | ||
| 1620 | if (ACPI_SUCCESS(acpi_bus_check_add(handle, 0, NULL, &device))) | 1619 | if (ACPI_SUCCESS(acpi_bus_check_add(handle, 0, NULL, &device))) |
| 1621 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, | 1620 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, |
| 1622 | acpi_bus_check_add, NULL, NULL, &device); | 1621 | acpi_bus_check_add, NULL, NULL, &device); |
| 1623 | 1622 | ||
| 1624 | if (!device) | 1623 | if (!device) |
| 1625 | return -ENODEV; | 1624 | error = -ENODEV; |
| 1626 | 1625 | else if (ACPI_SUCCESS(acpi_bus_device_attach(handle, 0, NULL, NULL))) | |
| 1627 | if (ACPI_SUCCESS(acpi_bus_device_attach(handle, 0, NULL, NULL))) | ||
| 1628 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, | 1626 | acpi_walk_namespace(ACPI_TYPE_ANY, handle, ACPI_UINT32_MAX, |
| 1629 | acpi_bus_device_attach, NULL, NULL, NULL); | 1627 | acpi_bus_device_attach, NULL, NULL, NULL); |
| 1630 | 1628 | ||
| 1631 | return 0; | 1629 | mutex_unlock(&acpi_scan_lock); |
| 1630 | return error; | ||
| 1632 | } | 1631 | } |
| 1633 | EXPORT_SYMBOL(acpi_bus_scan); | 1632 | EXPORT_SYMBOL(acpi_bus_scan); |
| 1634 | 1633 | ||
| @@ -1655,8 +1654,10 @@ static acpi_status acpi_bus_remove(acpi_handle handle, u32 lvl_not_used, | |||
| 1655 | return AE_OK; | 1654 | return AE_OK; |
| 1656 | } | 1655 | } |
| 1657 | 1656 | ||
| 1658 | int acpi_bus_trim(struct acpi_device *start) | 1657 | void acpi_bus_trim(struct acpi_device *start) |
| 1659 | { | 1658 | { |
| 1659 | mutex_lock(&acpi_scan_lock); | ||
| 1660 | |||
| 1660 | /* | 1661 | /* |
| 1661 | * Execute acpi_bus_device_detach() as a post-order callback to detach | 1662 | * Execute acpi_bus_device_detach() as a post-order callback to detach |
| 1662 | * all ACPI drivers from the device nodes being removed. | 1663 | * all ACPI drivers from the device nodes being removed. |
| @@ -1671,7 +1672,8 @@ int acpi_bus_trim(struct acpi_device *start) | |||
| 1671 | acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL, | 1672 | acpi_walk_namespace(ACPI_TYPE_ANY, start->handle, ACPI_UINT32_MAX, NULL, |
| 1672 | acpi_bus_remove, NULL, NULL); | 1673 | acpi_bus_remove, NULL, NULL); |
| 1673 | acpi_bus_remove(start->handle, 0, NULL, NULL); | 1674 | acpi_bus_remove(start->handle, 0, NULL, NULL); |
| 1674 | return 0; | 1675 | |
| 1676 | mutex_unlock(&acpi_scan_lock); | ||
| 1675 | } | 1677 | } |
| 1676 | EXPORT_SYMBOL_GPL(acpi_bus_trim); | 1678 | EXPORT_SYMBOL_GPL(acpi_bus_trim); |
| 1677 | 1679 | ||
diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 9e2b1f6dbe41..d1a6f4a25da8 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c | |||
| @@ -742,8 +742,7 @@ static int acpiphp_bus_add(struct acpiphp_func *func) | |||
| 742 | /* this shouldn't be in here, so remove | 742 | /* this shouldn't be in here, so remove |
| 743 | * the bus then re-add it... | 743 | * the bus then re-add it... |
| 744 | */ | 744 | */ |
| 745 | ret_val = acpi_bus_trim(device); | 745 | acpi_bus_trim(device); |
| 746 | dbg("acpi_bus_trim return %x\n", ret_val); | ||
| 747 | } | 746 | } |
| 748 | 747 | ||
| 749 | ret_val = acpi_bus_scan(func->handle); | 748 | ret_val = acpi_bus_scan(func->handle); |
| @@ -772,11 +771,8 @@ static int acpiphp_bus_trim(acpi_handle handle) | |||
| 772 | return retval; | 771 | return retval; |
| 773 | } | 772 | } |
| 774 | 773 | ||
| 775 | retval = acpi_bus_trim(device); | 774 | acpi_bus_trim(device); |
| 776 | if (retval) | 775 | return 0; |
| 777 | err("cannot remove from acpi list\n"); | ||
| 778 | |||
| 779 | return retval; | ||
| 780 | } | 776 | } |
| 781 | 777 | ||
| 782 | static void acpiphp_set_acpi_region(struct acpiphp_slot *slot) | 778 | static void acpiphp_set_acpi_region(struct acpiphp_slot *slot) |
diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h index fc76b1f7ef06..ad0a86ac5cce 100644 --- a/include/acpi/acpi_bus.h +++ b/include/acpi/acpi_bus.h | |||
| @@ -386,7 +386,7 @@ int acpi_bus_register_driver(struct acpi_driver *driver); | |||
| 386 | void acpi_bus_unregister_driver(struct acpi_driver *driver); | 386 | void acpi_bus_unregister_driver(struct acpi_driver *driver); |
| 387 | int acpi_bus_scan(acpi_handle handle); | 387 | int acpi_bus_scan(acpi_handle handle); |
| 388 | void acpi_bus_hot_remove_device(void *context); | 388 | void acpi_bus_hot_remove_device(void *context); |
| 389 | int acpi_bus_trim(struct acpi_device *start); | 389 | void acpi_bus_trim(struct acpi_device *start); |
| 390 | acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd); | 390 | acpi_status acpi_bus_get_ejd(acpi_handle handle, acpi_handle * ejd); |
| 391 | int acpi_match_device_ids(struct acpi_device *device, | 391 | int acpi_match_device_ids(struct acpi_device *device, |
| 392 | const struct acpi_device_id *ids); | 392 | const struct acpi_device_id *ids); |
