ACPI : Implement ACPI_NOTIFY_EJECT_REQUEST for ACPI container
PATCH 1/1 ACPI : Implement ACPI_NOTIFY_EJECT_REQUEST for ACPI container
Even if ACPI_NOTIFY_EJECT_REQUEST is notified to ACPI container, ACPI container just calls kobject_uevent(). The patch implements a function to remove all devices included in ACPI container.
--- drivers/acpi/container.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-)
drivers/acpi/container.c +30 -2
@@ -123,6 +123,8 @@ static int acpi_container_remove(structacpi_status status =AE_OK ;struct acpi_container *pc =NULL ; +kobject_uevent (&device->dev.kobj,KOBJ_OFFLINE ); + pc =acpi_driver_data (device);kfree (pc);return status;
@@ -152,6 +154,32 @@ static int container_device_add(struct areturn result; } +static void container_device_remove (struct acpi_device *device, +acpi_handle handle) +{ +struct acpi_object_list arg_list; +union acpi_object arg; +int result; +acpi_status status; + + result =acpi_bus_trim (device,1 ); +if (result) { +printk (KERN_WARNING "Removing contaier failed" ); +return ; + } + + arg_list.count =1 ; + arg_list.pointer = &arg; + arg.type =ACPI_TYPE_INTEGER ; + arg.integer.value =1 ; + + status =acpi_evaluate_object (handle,"_EJ0" , &arg_list,NULL ); +if (ACPI_FAILURE (status)) +printk (KERN_WARNING "Eject device failed\n" ); + +return ; +} +static void container_notify_cb (acpi_handle handle,u32 type,void *context) {struct acpi_device *device =NULL ;
@@ -183,13 +211,13 @@ static void container_notify_cb(acpi_han }else {if (ACPI_SUCCESS (status)) {/* device exist and this is a remove request */ -kobject_uevent (&device->dev.kobj,KOBJ_OFFLINE ); +container_device_remove (device, handle); } }break ;case ACPI_NOTIFY_EJECT_REQUEST :if (!acpi_bus_get_device (handle, &device) && device) { -kobject_uevent (&device->dev.kobj,KOBJ_OFFLINE ); +container_device_remove (device, handle); }break ;default :
Please ignore the patch.
I found that ACPI container driver does not need to implement EJECT routine because it has already prepared eject file at userland.
Quoted 79 lines · Yasuaki Ishimatsu
Even if
ACPI_NOTIFY_EJECT_REQUESTis notified to ACPI container, ACPI container just callskobject_uevent(). The patch implements a function to remove all devices included in ACPI container.Signed-off-by Yasuaki Ishimatsu<[email protected]>--- drivers/acpi/container.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-)Index:
linux-3.5-rc1/drivers/acpi/container.c
===================================================================drivers/acpi/container.c +30
-3@@ -123,6 +123,8 @@ static int acpi_container_remove(structacpi_status status =AE_OK ;struct acpi_container *pc =NULL ; +kobject_uevent (&device->dev.kobj,KOBJ_OFFLINE ); + pc =acpi_driver_data (device);kfree (pc);return status;@@ -152,6 +154,32 @@ static int container_device_add(struct areturn result; } +static void container_device_remove (struct acpi_device *device, +acpi_handle handle) +{ +struct acpi_object_list arg_list; +union acpi_object arg; +int result; +acpi_status status; + + result =acpi_bus_trim (device,1 ); +if (result) { +printk (KERN_WARNING "Removing contaier failed" ); +return ; + } + + arg_list.count =1 ; + arg_list.pointer =&arg; + arg.type =ACPI_TYPE_INTEGER ; + arg.integer.value =1 ; + + status =acpi_evaluate_object (handle,"_EJ0" ,&arg_list,NULL ); +if (ACPI_FAILURE (status)) +printk (KERN_WARNING "Eject device failed\n" ); + +return ; +} +static void container_notify_cb (acpi_handle handle,u32 type,void *context) {struct acpi_device *device =NULL ;@@ -183,13 +211,13 @@ static void container_notify_cb(acpi_han }else {if (ACPI_SUCCESS (status)) {/* device exist and this is a remove request */ -kobject_uevent (&device->dev.kobj,KOBJ_OFFLINE ); +container_device_remove (device, handle); } }break ;case ACPI_NOTIFY_EJECT_REQUEST :if (!acpi_bus_get_device (handle,&device)&& device) { -kobject_uevent (&device->dev.kobj,KOBJ_OFFLINE ); +container_device_remove (device, handle); }break ;default : --To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html