diff options
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r-- | drivers/acpi/scan.c | 40 |
1 files changed, 40 insertions, 0 deletions
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) | |||
837 | return -ENODEV; | 837 | return -ENODEV; |
838 | } | 838 | } |
839 | 839 | ||
840 | /* | ||
841 | * acpi_bay_match - see if a device is an ejectable driver bay | ||
842 | * | ||
843 | * If an acpi object is ejectable and has one of the ACPI ATA methods defined, | ||
844 | * then we can safely call it an ejectable drive bay | ||
845 | */ | ||
846 | static int acpi_bay_match(struct acpi_device *device){ | ||
847 | acpi_status status; | ||
848 | acpi_handle handle; | ||
849 | acpi_handle tmp; | ||
850 | acpi_handle phandle; | ||
851 | |||
852 | handle = device->handle; | ||
853 | |||
854 | status = acpi_get_handle(handle, "_EJ0", &tmp); | ||
855 | if (ACPI_FAILURE(status)) | ||
856 | return -ENODEV; | ||
857 | |||
858 | if ((ACPI_SUCCESS(acpi_get_handle(handle, "_GTF", &tmp))) || | ||
859 | (ACPI_SUCCESS(acpi_get_handle(handle, "_GTM", &tmp))) || | ||
860 | (ACPI_SUCCESS(acpi_get_handle(handle, "_STM", &tmp))) || | ||
861 | (ACPI_SUCCESS(acpi_get_handle(handle, "_SDD", &tmp)))) | ||
862 | return 0; | ||
863 | |||
864 | if (acpi_get_parent(handle, &phandle)) | ||
865 | return -ENODEV; | ||
866 | |||
867 | if ((ACPI_SUCCESS(acpi_get_handle(phandle, "_GTF", &tmp))) || | ||
868 | (ACPI_SUCCESS(acpi_get_handle(phandle, "_GTM", &tmp))) || | ||
869 | (ACPI_SUCCESS(acpi_get_handle(phandle, "_STM", &tmp))) || | ||
870 | (ACPI_SUCCESS(acpi_get_handle(phandle, "_SDD", &tmp)))) | ||
871 | return 0; | ||
872 | |||
873 | return -ENODEV; | ||
874 | } | ||
875 | |||
840 | static void acpi_device_set_id(struct acpi_device *device, | 876 | static void acpi_device_set_id(struct acpi_device *device, |
841 | struct acpi_device *parent, acpi_handle handle, | 877 | struct acpi_device *parent, acpi_handle handle, |
842 | int type) | 878 | int type) |
@@ -872,6 +908,10 @@ static void acpi_device_set_id(struct acpi_device *device, | |||
872 | status = acpi_video_bus_match(device); | 908 | status = acpi_video_bus_match(device); |
873 | if(ACPI_SUCCESS(status)) | 909 | if(ACPI_SUCCESS(status)) |
874 | hid = ACPI_VIDEO_HID; | 910 | hid = ACPI_VIDEO_HID; |
911 | |||
912 | status = acpi_bay_match(device); | ||
913 | if (ACPI_SUCCESS(status)) | ||
914 | hid = ACPI_BAY_HID; | ||
875 | } | 915 | } |
876 | break; | 916 | break; |
877 | case ACPI_BUS_TYPE_POWER: | 917 | case ACPI_BUS_TYPE_POWER: |