From: Matthew Garrett <mjg@xxxxxxxxxx> 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 therefore binds to the expresscard slot on my HP test machine. Signed-off-by: Matthew Garrett <mjg@xxxxxxxxxx> --- diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c index 955aae4..a17984a 100644 --- a/drivers/pci/hotplug/acpiphp_glue.c +++ b/drivers/pci/hotplug/acpiphp_glue.c @@ -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,6 +87,7 @@ static int is_ejectable(acpi_handle handle) { acpi_status status; acpi_handle tmp; + int ret = 0; status = acpi_get_handle(handle, "_ADR", &tmp); if (ACPI_FAILURE(status)) { @@ -94,11 +95,14 @@ static int is_ejectable(acpi_handle handle) } status = acpi_get_handle(handle, "_EJ0", &tmp); - if (ACPI_FAILURE(status)) { - return 0; - } + if (ACPI_SUCCESS(status)) + ret = 1; + + status = acpi_get_handle(handle, "_RMV", &tmp); + if (ACPI_SUCCESS(status)) + ret = 1; - return 1; + return ret; } @@ -182,17 +186,26 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv) struct acpiphp_func *newfunc; acpi_handle tmp; acpi_status status = AE_OK; - unsigned long long adr, sun; - int device, function, retval; + unsigned long long adr, sun, removable; + int device, function, retval, valid = 0; status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr); if (ACPI_FAILURE(status)) return AE_OK; - status = acpi_get_handle(handle, "_EJ0", &tmp); + status = acpi_get_handle(handle, "_RMV", &tmp); + if (ACPI_SUCCESS(status)) { + acpi_evaluate_integer(handle, "_RMV", NULL, &removable); + if (removable) + valid = 1; + } - if (ACPI_FAILURE(status) && !(is_dock_device(handle))) + status = acpi_get_handle(handle, "_EJ0", &tmp); + if (ACPI_SUCCESS(status) || is_dock_device(handle)) + valid = 1; + + if (!valid) return AE_OK; device = (adr >> 16) & 0xffff; -- Matthew Garrett | mjg59@xxxxxxxxxxxxx -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html