Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 56ee325e authored by Matthew Garrett's avatar Matthew Garrett Committed by Jesse Barnes
Browse files

PCI/ACPI: acpiphp: Identify more removable slots



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: default avatarKristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 86d86980
Loading
Loading
Loading
Loading
+17 −15
Original line number Original line Diff line number Diff line
@@ -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:
 * Ejectable slot should satisfy at least these conditions:
 *
 *
 *  1. has _ADR method
 *  1. has _ADR method
 *  2. has _EJ0 method
 *  2. has _EJ0 method or _RMV method
 *
 *
 * optionally
 * optionally
 *
 *
@@ -87,20 +87,27 @@ static int is_ejectable(acpi_handle handle)
{
{
	acpi_status status;
	acpi_status status;
	acpi_handle tmp;
	acpi_handle tmp;
	unsigned long long removable;


	status = acpi_get_handle(handle, "_ADR", &tmp);
	status = acpi_get_handle(handle, "_ADR", &tmp);
	if (ACPI_FAILURE(status)) {
	if (ACPI_FAILURE(status))
		return 0;
		return 0;
	}


	status = acpi_get_handle(handle, "_EJ0", &tmp);
	status = acpi_get_handle(handle, "_EJ0", &tmp);
	if (ACPI_FAILURE(status)) {
	if (ACPI_SUCCESS(status))
		return 0;
		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;
}



/* callback routine to check for the existence of ejectable slots */
/* callback routine to check for the existence of ejectable slots */
static acpi_status
static acpi_status
@@ -185,16 +192,10 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
	unsigned long long adr, sun;
	unsigned long long adr, sun;
	int device, function, retval;
	int device, function, retval;


	status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
	if (!is_ejectable(handle) && !is_dock_device(handle))

	if (ACPI_FAILURE(status))
		return AE_OK;

	status = acpi_get_handle(handle, "_EJ0", &tmp);

	if (ACPI_FAILURE(status) && !(is_dock_device(handle)))
		return AE_OK;
		return AE_OK;


	acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
	device = (adr >> 16) & 0xffff;
	device = (adr >> 16) & 0xffff;
	function = adr & 0xffff;
	function = adr & 0xffff;


@@ -205,7 +206,8 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
	INIT_LIST_HEAD(&newfunc->sibling);
	INIT_LIST_HEAD(&newfunc->sibling);
	newfunc->handle = handle;
	newfunc->handle = handle;
	newfunc->function = function;
	newfunc->function = function;
	if (ACPI_SUCCESS(status))

	if (ACPI_SUCCESS(acpi_get_handle(handle, "_EJ0", &tmp)))
		newfunc->flags = FUNC_HAS_EJ0;
		newfunc->flags = FUNC_HAS_EJ0;


	if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp)))
	if (ACPI_SUCCESS(acpi_get_handle(handle, "_STA", &tmp)))