diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c index aa1b131c0fce..667fa1dfa1a3 100644 --- a/drivers/acpi/bay.c +++ b/drivers/acpi/bay.c @@ -49,16 +49,14 @@ MODULE_LICENSE("GPL"); static void bay_notify(acpi_handle handle, u32 event, void *data); static int acpi_bay_add(struct acpi_device *device); static int acpi_bay_remove(struct acpi_device *device, int type); -static int acpi_bay_match(struct acpi_device *device, - struct acpi_driver *driver); static struct acpi_driver acpi_bay_driver = { .name = ACPI_BAY_DRIVER_NAME, .class = ACPI_BAY_CLASS, + .ids = ACPI_BAY_HID, .ops = { .add = acpi_bay_add, .remove = acpi_bay_remove, - .match = acpi_bay_match, }, }; @@ -347,20 +345,6 @@ static int acpi_bay_remove(struct acpi_device *device, int type) return 0; } -static int acpi_bay_match(struct acpi_device *device, - struct acpi_driver *driver) -{ - if (!device || !driver) - return -EINVAL; - - if (is_ejectable_bay(device->handle)) { - bay_dprintk(device->handle, "matching bay device"); - return 0; - } - - return -ENODEV; -} - /** * bay_create_acpi_device - add new devices to acpi * @handle - handle of the device to add diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 5049230ccf49..0a13d954daed 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c @@ -837,6 +837,42 @@ acpi_video_bus_match(struct acpi_device *device) return -ENODEV; } +/* + * acpi_bay_match - see if a device is an ejectable driver bay + * + * If an acpi object is ejectable and has one of the ACPI ATA methods defined, + * then we can safely call it an ejectable drive bay + */ +static int acpi_bay_match(struct acpi_device *device){ + acpi_status status; + acpi_handle handle; + acpi_handle tmp; + acpi_handle phandle; + + handle = device->handle; + + status = acpi_get_handle(handle, "_EJ0", &tmp); + if (ACPI_FAILURE(status)) + return -ENODEV; + + if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) || + (ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) || + (ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) || + (ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp)))) + return 0; + + if (acpi_get_parent(handle, &phandle)) + return -ENODEV; + + if ((ACPI_SUCCESS(acpi_get_handle(phandle, "_GTF", &tmp))) || + (ACPI_SUCCESS(acpi_get_handle(phandle, "_GTM", &tmp))) || + (ACPI_SUCCESS(acpi_get_handle(phandle, "_STM", &tmp))) || + (ACPI_SUCCESS(acpi_get_handle(phandle, "_SDD", &tmp)))) + return 0; + + return -ENODEV; +} + static void acpi_device_set_id(struct acpi_device *device, struct acpi_device *parent, acpi_handle handle, int type) @@ -872,6 +908,10 @@ static void acpi_device_set_id(struct acpi_device *device, status = acpi_video_bus_match(device); if(ACPI_SUCCESS(status)) hid = ACPI_VIDEO_HID; + + status = acpi_bay_match(device); + if (ACPI_SUCCESS(status)) + hid = ACPI_BAY_HID; } break; case ACPI_BUS_TYPE_POWER: