ACPI: introduce two helper functions for _EJ0 and _LCK
Introduce two helper functions, acpi_evaluate_ej0() and acpi_evaluate_lck(), that will execute the _EJ0 and _LCK ACPI control methods, respectively, and use them to simplify the ACPI scan code. [rjw: Changelog] Signed-off-by: Jiang Liu <jiang.liu@huawei.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
0db9820260
commit
7d2421f84b
|
@ -193,8 +193,6 @@ static acpi_status acpi_bus_online_companions(acpi_handle handle, u32 lvl,
|
||||||
static int acpi_scan_hot_remove(struct acpi_device *device)
|
static int acpi_scan_hot_remove(struct acpi_device *device)
|
||||||
{
|
{
|
||||||
acpi_handle handle = device->handle;
|
acpi_handle handle = device->handle;
|
||||||
struct acpi_object_list arg_list;
|
|
||||||
union acpi_object arg;
|
|
||||||
struct device *errdev;
|
struct device *errdev;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
unsigned long long sta;
|
unsigned long long sta;
|
||||||
|
@ -257,32 +255,15 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
|
||||||
put_device(&device->dev);
|
put_device(&device->dev);
|
||||||
device = NULL;
|
device = NULL;
|
||||||
|
|
||||||
if (acpi_has_method(handle, "_LCK")) {
|
acpi_evaluate_lck(handle, 0);
|
||||||
arg_list.count = 1;
|
|
||||||
arg_list.pointer = &arg;
|
|
||||||
arg.type = ACPI_TYPE_INTEGER;
|
|
||||||
arg.integer.value = 0;
|
|
||||||
acpi_evaluate_object(handle, "_LCK", &arg_list, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
arg_list.count = 1;
|
|
||||||
arg_list.pointer = &arg;
|
|
||||||
arg.type = ACPI_TYPE_INTEGER;
|
|
||||||
arg.integer.value = 1;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TBD: _EJD support.
|
* TBD: _EJD support.
|
||||||
*/
|
*/
|
||||||
status = acpi_evaluate_object(handle, "_EJ0", &arg_list, NULL);
|
status = acpi_evaluate_ej0(handle);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (status == AE_NOT_FOUND)
|
||||||
if (status == AE_NOT_FOUND) {
|
return -ENODEV;
|
||||||
return -ENODEV;
|
else if (ACPI_FAILURE(status))
|
||||||
} else {
|
return -EIO;
|
||||||
acpi_handle_warn(handle, "Eject failed (0x%x)\n",
|
|
||||||
status);
|
|
||||||
return -EIO;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Verify if eject was indeed successful. If not, log an error
|
* Verify if eject was indeed successful. If not, log an error
|
||||||
|
|
|
@ -522,3 +522,46 @@ acpi_status acpi_execute_simple_method(acpi_handle handle, char *method,
|
||||||
return acpi_evaluate_object(handle, method, &arg_list, NULL);
|
return acpi_evaluate_object(handle, method, &arg_list, NULL);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(acpi_execute_simple_method);
|
EXPORT_SYMBOL(acpi_execute_simple_method);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* acpi_evaluate_ej0: Evaluate _EJ0 method for hotplug operations
|
||||||
|
* @handle: ACPI device handle
|
||||||
|
*
|
||||||
|
* Evaluate device's _EJ0 method for hotplug operations.
|
||||||
|
*/
|
||||||
|
acpi_status acpi_evaluate_ej0(acpi_handle handle)
|
||||||
|
{
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
|
status = acpi_execute_simple_method(handle, "_EJ0", 1);
|
||||||
|
if (status == AE_NOT_FOUND)
|
||||||
|
acpi_handle_warn(handle, "No _EJ0 support for device\n");
|
||||||
|
else if (ACPI_FAILURE(status))
|
||||||
|
acpi_handle_warn(handle, "Eject failed (0x%x)\n", status);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* acpi_evaluate_lck: Evaluate _LCK method to lock/unlock device
|
||||||
|
* @handle: ACPI device handle
|
||||||
|
* @lock: lock device if non-zero, otherwise unlock device
|
||||||
|
*
|
||||||
|
* Evaluate device's _LCK method if present to lock/unlock device
|
||||||
|
*/
|
||||||
|
acpi_status acpi_evaluate_lck(acpi_handle handle, int lock)
|
||||||
|
{
|
||||||
|
acpi_status status;
|
||||||
|
|
||||||
|
status = acpi_execute_simple_method(handle, "_LCK", !!lock);
|
||||||
|
if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
|
||||||
|
if (lock)
|
||||||
|
acpi_handle_warn(handle,
|
||||||
|
"Locking device failed (0x%x)\n", status);
|
||||||
|
else
|
||||||
|
acpi_handle_warn(handle,
|
||||||
|
"Unlocking device failed (0x%x)\n", status);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
|
@ -60,6 +60,8 @@ acpi_get_physical_device_location(acpi_handle handle, struct acpi_pld_info **pld
|
||||||
bool acpi_has_method(acpi_handle handle, char *name);
|
bool acpi_has_method(acpi_handle handle, char *name);
|
||||||
acpi_status acpi_execute_simple_method(acpi_handle handle, char *method,
|
acpi_status acpi_execute_simple_method(acpi_handle handle, char *method,
|
||||||
u64 arg);
|
u64 arg);
|
||||||
|
acpi_status acpi_evaluate_ej0(acpi_handle handle);
|
||||||
|
acpi_status acpi_evaluate_lck(acpi_handle handle, int lock);
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue