acpiphp: identify more removable slots
PATCH 2/3 acpiphp: identify more removable slots
From: Matthew Garrett <[email protected]>
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.
---
drivers/pci/hotplug/acpiphp_glue.c | 32 ++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-)
drivers/pci/hotplug/acpiphp_glue.c renamed from drivers/pci/hotplug/acpiphp_glue.c~acpiphp-identify-more-removable-slots +17 -15
@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(ac* 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 hand {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 lvunsigned 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 lvINIT_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)))
_
This has been picked up by Jesse for the PCI tree.
Signature · 1 line
Matthew Garrett | [email protected]
Quoted 1 line · On Mon, 1 Dec 2008 22:14:55 +0000 Matthew Garrett <[email protected]> wrote:
This has been picked up by Jesse for the PCI tree.
It isn't in today's linux-next?
From: Matthew Garrett <[email protected]>
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.
---
drivers/pci/hotplug/acpiphp_glue.c | 32 ++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-)
drivers/pci/hotplug/acpiphp_glue.c renamed from drivers/pci/hotplug/acpiphp_glue.c~acpiphp-identify-more-removable-slots +17 -15
@@ -74,7 +74,7 @@ static void handle_hotplug_event_func(ac* 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 hand {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 lvunsigned 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 lvINIT_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)))
_
Quoted 6 lines · Andrew Morton
Quoted 1 line · On Mon, 1 Dec 2008 22:14:55 +0000 Matthew Garrett <[email protected]> wrote:
This has been picked up by Jesse for the PCI tree.
It isn't in today's linux-next?
Tomorrow, possibly?
Signature · 1 line
Matthew Garrett | [email protected]