*/
 static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
 {
-       struct acpi_device *device = NULL;
+       struct acpi_device *device;
        struct acpi_driver *driver;
 
        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Notification %#02x to handle %p\n",
                break;
        }
 
-       acpi_bus_get_device(handle, &device);
+       device = acpi_bus_get_acpi_device(handle);
        if (device) {
                driver = device->driver;
                if (driver && driver->ops.notify &&
                    (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
                        driver->ops.notify(device, type);
+
+               acpi_bus_put_acpi_device(device);
        }
 }
 
 
 
  out:
        acpi_evaluate_hotplug_ost(adev->handle, src, ost_code, NULL);
-       put_device(&adev->dev);
+       acpi_bus_put_acpi_device(adev);
        mutex_unlock(&acpi_scan_lock);
        unlock_device_hotplug();
 }
        struct acpi_device *adev;
        acpi_status status;
 
-       if (acpi_bus_get_device(handle, &adev))
-               goto err_out;
-
        switch (type) {
        case ACPI_NOTIFY_BUS_CHECK:
                acpi_handle_debug(handle, "ACPI_NOTIFY_BUS_CHECK event\n");
                /* non-hotplug event; possibly handled by other handler */
                return;
        }
-       get_device(&adev->dev);
+       adev = acpi_bus_get_acpi_device(handle);
+       if (!adev)
+               goto err_out;
+
        status = acpi_hotplug_execute(acpi_device_hotplug, adev, type);
        if (ACPI_SUCCESS(status))
                return;
 
-       put_device(&adev->dev);
+       acpi_bus_put_acpi_device(adev);
 
  err_out:
        acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL);
        mutex_unlock(&acpi_device_del_lock);
 }
 
-int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device)
+static int acpi_get_device_data(acpi_handle handle, struct acpi_device **device,
+                               void (*callback)(void *))
 {
        acpi_status status;
 
        if (!device)
                return -EINVAL;
 
-       status = acpi_get_data(handle, acpi_scan_drop_device, (void **)device);
+       status = acpi_get_data_full(handle, acpi_scan_drop_device,
+                                   (void **)device, callback);
        if (ACPI_FAILURE(status) || !*device) {
                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "No context for object [%p]\n",
                                  handle));
        }
        return 0;
 }
+
+int acpi_bus_get_device(acpi_handle handle, struct acpi_device **device)
+{
+       return acpi_get_device_data(handle, device, NULL);
+}
 EXPORT_SYMBOL(acpi_bus_get_device);
 
+static void get_acpi_device(void *dev)
+{
+       if (dev)
+               get_device(&((struct acpi_device *)dev)->dev);
+}
+
+struct acpi_device *acpi_bus_get_acpi_device(acpi_handle handle)
+{
+       struct acpi_device *adev = NULL;
+
+       acpi_get_device_data(handle, &adev, get_acpi_device);
+       return adev;
+}
+
+void acpi_bus_put_acpi_device(struct acpi_device *adev)
+{
+       put_device(&adev->dev);
+}
+
 int acpi_device_add(struct acpi_device *device,
                    void (*release)(struct device *))
 {