PCI/ACPI: acpiphp: Identify more removable slots
authorMatthew Garrett <mjg59@srcf.ucam.org>
Tue, 25 Nov 2008 21:48:14 +0000 (21:48 +0000)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Wed, 7 Jan 2009 19:12:36 +0000 (11:12 -0800)
According to section 6.3.6 of the ACPI spec, the presence of an _RMV
method that evaluates to 1 is sufficient to indicate that a slot is
removable without needing an eject method. This patch refactors the
ejectable slot detection code a little in order to flag these slots as
ejectable and register them. Acpihp then binds to the expresscard slot
on my HP test machine.

Acked-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/hotplug/acpiphp_glue.c

index 3affc6472e65253c94b77bcc8aa97061480b85d7..1b19b7ec3e8c442c28562ddcddfc2884dec0ccf1 100644 (file)
@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type, void *contex
  * Ejectable slot should satisfy at least these conditions:
  *
  *  1. has _ADR method
- *  2. has _EJ0 method
+ *  2. has _EJ0 method or _RMV method
  *
  * optionally
  *
@@ -87,18 +87,25 @@ static int is_ejectable(acpi_handle handle)
 {
        acpi_status status;
        acpi_handle tmp;
+       unsigned long long removable;
 
        status = acpi_get_handle(handle, "_ADR", &tmp);
-       if (ACPI_FAILURE(status)) {
+       if (ACPI_FAILURE(status))
                return 0;
-       }
 
        status = acpi_get_handle(handle, "_EJ0", &tmp);
-       if (ACPI_FAILURE(status)) {
-               return 0;
+       if (ACPI_SUCCESS(status))
+               return 1;
+
+       status = acpi_get_handle(handle, "_RMV", &tmp);
+       if (ACPI_SUCCESS(status)) {
+               status = acpi_evaluate_integer(handle, "_RMV", NULL,
+                                              &removable);
+               if (ACPI_SUCCESS(status) && removable)
+                       return 1;
        }
 
-       return 1;
+       return 0;
 }
 
 
@@ -185,16 +192,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
        unsigned long long adr, sun;
        int device, function, retval;
 
-       status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
-
-       if (ACPI_FAILURE(status))
-               return AE_OK;
-
-       status = acpi_get_handle(handle, "_EJ0", &tmp);
-
-       if (ACPI_FAILURE(status) && !(is_dock_device(handle)))
+       if (!is_ejectable(handle) && !is_dock_device(handle))
                return AE_OK;
 
+       acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
        device = (adr >> 16) & 0xffff;
        function = adr & 0xffff;
 
@@ -205,7 +206,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
        INIT_LIST_HEAD(&newfunc->sibling);
        newfunc->handle = handle;
        newfunc->function = function;
-       if (ACPI_SUCCESS(status))
+
+       if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp)))
                newfunc->flags = FUNC_HAS_EJ0;
 
        if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp)))