return error;
 }
 
-static int acpi_scan_bus_check(struct acpi_device *adev)
+static int acpi_scan_bus_check(struct acpi_device *adev, void *not_used)
 {
        struct acpi_scan_handler *handler = adev->handler;
-       struct acpi_device *child;
        int error;
 
        acpi_bus_get_status(adev);
                dev_warn(&adev->dev, "Namespace scan failure\n");
                return error;
        }
-       list_for_each_entry(child, &adev->children, node) {
-               error = acpi_scan_bus_check(child);
-               if (error)
-                       return error;
-       }
-       return 0;
+       return acpi_dev_for_each_child(adev, acpi_scan_bus_check, NULL);
 }
 
 static int acpi_generic_hotplug_event(struct acpi_device *adev, u32 type)
 {
        switch (type) {
        case ACPI_NOTIFY_BUS_CHECK:
-               return acpi_scan_bus_check(adev);
+               return acpi_scan_bus_check(adev, NULL);
        case ACPI_NOTIFY_DEVICE_CHECK:
                return acpi_scan_device_check(adev);
        case ACPI_NOTIFY_EJECT_REQUEST:
        return ret;
 }
 
-static void acpi_bus_attach(struct acpi_device *device, bool first_pass)
+static int acpi_bus_attach(struct acpi_device *device, void *first_pass)
 {
-       struct acpi_device *child;
        bool skip = !first_pass && device->flags.visited;
        acpi_handle ejd;
        int ret;
                device->flags.initialized = false;
                acpi_device_clear_enumerated(device);
                device->flags.power_manageable = 0;
-               return;
+               return 0;
        }
        if (device->handler)
                goto ok;
 
        ret = acpi_scan_attach_handler(device);
        if (ret < 0)
-               return;
+               return 0;
 
        device->flags.match_driver = true;
        if (ret > 0 && !device->flags.enumeration_by_parent) {
 
        ret = device_attach(&device->dev);
        if (ret < 0)
-               return;
+               return 0;
 
        if (device->pnp.type.platform_id || device->flags.enumeration_by_parent)
                acpi_default_enumeration(device);
        else
                acpi_device_set_enumerated(device);
 
- ok:
-       list_for_each_entry(child, &device->children, node)
-               acpi_bus_attach(child, first_pass);
+ok:
+       acpi_dev_for_each_child(device, acpi_bus_attach, first_pass);
 
        if (!skip && device->handler && device->handler->hotplug.notify_online)
                device->handler->hotplug.notify_online(device);
+
+       return 0;
 }
 
 static int acpi_dev_get_first_consumer_dev_cb(struct acpi_dep_data *dep, void *data)
        cdw = container_of(work, struct acpi_scan_clear_dep_work, work);
 
        acpi_scan_lock_acquire();
-       acpi_bus_attach(cdw->adev, true);
+       acpi_bus_attach(cdw->adev, (void *)true);
        acpi_scan_lock_release();
 
        acpi_dev_put(cdw->adev);
        if (!device)
                return -ENODEV;
 
-       acpi_bus_attach(device, true);
+       acpi_bus_attach(device, (void *)true);
 
        if (!acpi_bus_scan_second_pass)
                return 0;
                                    acpi_bus_check_add_2, NULL, NULL,
                                    (void **)&device);
 
-       acpi_bus_attach(device, false);
+       acpi_bus_attach(device, NULL);
 
        return 0;
 }
 EXPORT_SYMBOL(acpi_bus_scan);
 
-/**
- * acpi_bus_trim - Detach scan handlers and drivers from ACPI device objects.
- * @adev: Root of the ACPI namespace scope to walk.
- *
- * Must be called under acpi_scan_lock.
- */
-void acpi_bus_trim(struct acpi_device *adev)
+static int acpi_bus_trim_one(struct acpi_device *adev, void *not_used)
 {
        struct acpi_scan_handler *handler = adev->handler;
-       struct acpi_device *child;
 
-       list_for_each_entry_reverse(child, &adev->children, node)
-               acpi_bus_trim(child);
+       acpi_dev_for_each_child_reverse(adev, acpi_bus_trim_one, NULL);
 
        adev->flags.match_driver = false;
        if (handler) {
        acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
        adev->flags.initialized = false;
        acpi_device_clear_enumerated(adev);
+
+       return 0;
+}
+
+/**
+ * acpi_bus_trim - Detach scan handlers and drivers from ACPI device objects.
+ * @adev: Root of the ACPI namespace scope to walk.
+ *
+ * Must be called under acpi_scan_lock.
+ */
+void acpi_bus_trim(struct acpi_device *adev)
+{
+       acpi_bus_trim_one(adev, NULL);
 }
 EXPORT_SYMBOL_GPL(acpi_bus_trim);